[Gd-chatter] r10822 - in trunk/libraries/packetizer: . packetizer-test

hannes at gwydiondylan.org hannes at gwydiondylan.org
Mon Jul 10 23:55:54 CEST 2006


Author: hannes
Date: Mon Jul 10 23:55:52 2006
New Revision: 10822

Modified:
   trunk/libraries/packetizer/packetizer-test/packetizer-test.dylan
   trunk/libraries/packetizer/packetizer.dylan
   trunk/libraries/packetizer/protocol-definer-macro.dylan
Log:
Bug: 7299
*fix parsing of container-frames which get the whole rest as substring, but don't consume all bits

Modified: trunk/libraries/packetizer/packetizer-test/packetizer-test.dylan
==============================================================================
--- trunk/libraries/packetizer/packetizer-test/packetizer-test.dylan	(original)
+++ trunk/libraries/packetizer/packetizer-test/packetizer-test.dylan	Mon Jul 10 23:55:52 2006
@@ -282,6 +282,38 @@
   frame-field-checker(2, aframe, 16, 24, 40);
 end;
 
+define protocol b-sub-sub (container-frame)
+  field a :: <unsigned-byte>;
+  field a* :: <raw-frame>,
+    length: frame.a * 8;
+  field b :: <unsigned-byte>;
+end;
+
+define test dyn-length ()
+  let aframe = make(unparsed-class(<b-sub-sub>),
+                    packet: as(<byte-vector>, #(#x3, #x0, #x0, #x0, #x42, #x42)));
+  let field-list = fields(aframe);
+  static-checker(field-list[0], 0, 8, 8);
+  static-checker(field-list[1], 8, $unknown-at-compile-time, $unknown-at-compile-time);
+  static-checker(field-list[2], $unknown-at-compile-time, 8, $unknown-at-compile-time);
+  frame-field-checker(0, aframe, 0, 8, 8);
+  frame-field-checker(1, aframe, 8, 24, 32);
+  frame-field-checker(2, aframe, 32, 8, 40);
+end;
+define protocol b-subb (container-frame)
+  //variably-typed-field data,
+  //  type-function: <b-sub-sub>;
+  field data :: <b-sub-sub>;
+end;
+
+define test dynamic-length ()
+  let aframe = make(unparsed-class(<b-subb>),
+                    packet: as(<byte-vector>, #(#x3, #x0, #x0, #x0, #x42, #x42)));
+  let field-list = fields(aframe);
+  static-checker(field-list[0], 0, $unknown-at-compile-time, $unknown-at-compile-time);
+  frame-field-checker(0, aframe, 0, 40, 40);
+end;
+
 define test inheritance-dynamic-length-assemble ()
   let frame = make(<b-sub>, type-code: #x42, data: parse-frame(<raw-frame>, as(<byte-vector>, #(#x23, #x42, #x23, #x42))));
   let byte-vector = assemble-frame(frame);
@@ -300,6 +332,8 @@
   test label-test;
   test inheritance-test;
   test inheritance-dynamic-length;
+  test dyn-length;
+  test dynamic-length;
 end;
 
 define suite packetizer-assemble-suite ()

Modified: trunk/libraries/packetizer/packetizer.dylan
==============================================================================
--- trunk/libraries/packetizer/packetizer.dylan	(original)
+++ trunk/libraries/packetizer/packetizer.dylan	Mon Jul 10 23:55:52 2006
@@ -593,7 +593,10 @@
 define inline method length (frame-field :: <frame-field>) => (res :: <integer>)
   unless (frame-field.%length)
     unless (compute-field-length(frame-field))
-      value(frame-field); // this has side effects ;)
+      value(frame-field); //XXX: b0rk3n
+      unless (frame-field.%length)
+        frame-field.%length := get-field-size-aux(frame-field.frame, frame-field.field);
+      end;
     end;
   end;
   frame-field.%length;

Modified: trunk/libraries/packetizer/protocol-definer-macro.dylan
==============================================================================
--- trunk/libraries/packetizer/protocol-definer-macro.dylan	(original)
+++ trunk/libraries/packetizer/protocol-definer-macro.dylan	Mon Jul 10 23:55:52 2006
@@ -200,8 +200,10 @@
           let frame-field = get-frame-field(?field-index, mframe);
           let (value, parsed-end) = parse-frame-field(frame-field);
           mframe.cache.?name := value;
-          frame-field.%end-offset := parsed-end;
-          frame-field.%length := parsed-end - frame-field.start-offset;
+          if (parsed-end)
+            frame-field.%end-offset := parsed-end;
+            frame-field.%length := parsed-end - frame-field.start-offset;
+          end;
           mframe.cache.?name
         end;
       end;
@@ -260,11 +262,8 @@
               frame-field.field.field-name, start, end-of-field, end-of-field - start, length - bit-offset(start));
       end;
     end;
-  elseif ((~ length) & (frame-field.field.index + 1 ~= field-count(frame-field.frame.object-class)))
-    end-of-field := end-offset(get-frame-field(field-count(value.object-class) - 1, value));
   else
-    //last field in frame
-    end-of-field := full-frame-size
+    end-of-field := #f
   end;
   values(value, end-of-field);
 end;



More information about the chatter mailing list