Browse Source

[3546] (hopefully) last changes after review:

 - clarified that returned offset refers to last successfully parsed option
 - unpackOptions6() now returns proper offset if vendor-option is truncated
Tomek Mrugalski 10 years ago
parent
commit
6e92e97f7b
2 changed files with 7 additions and 3 deletions
  1. 3 2
      src/lib/dhcp/libdhcp++.cc
  2. 4 1
      src/lib/dhcp/libdhcp++.h

+ 3 - 2
src/lib/dhcp/libdhcp++.cc

@@ -260,8 +260,9 @@ size_t LibDHCP::unpackOptions6(const OptionBuffer& buf,
         if (opt_type == D6O_VENDOR_OPTS) {
             if (offset + 4 > length) {
                 // Truncated vendor-option. There is expected at least 4 bytes
-                // long enterprise-id field
-                return (offset);
+                // long enterprise-id field. Let's roll back option code + option
+                // length (4 bytes) and return.
+                return (offset - 4);
             }
 
             // Parse this as vendor option

+ 4 - 1
src/lib/dhcp/libdhcp++.h

@@ -123,6 +123,7 @@ public:
     /// of to be used to parse options in the packets.
     /// @param options Reference to option container. Options will be
     ///        put here.
+    /// @return offset to the first byte after the last successfully parsed option
     static size_t unpackOptions4(const OptionBuffer& buf,
                                  const std::string& option_space,
                                  isc::dhcp::OptionCollection& options);
@@ -147,7 +148,7 @@ public:
     ///        offset to beginning of relay_msg option will be stored in it.
     /// @param relay_msg_len reference to a size_t structure. If specified,
     ///        length of the relay_msg option will be stored in it.
-    /// @return offset to the first byte after last parsed option
+    /// @return offset to the first byte after the last successfully parsed option
     static size_t unpackOptions6(const OptionBuffer& buf,
                                  const std::string& option_space,
                                  isc::dhcp::OptionCollection& options,
@@ -192,6 +193,7 @@ public:
     /// @param buf Buffer to be parsed.
     /// @param options Reference to option container. Options will be
     ///        put here.
+    /// @return offset to the first byte after the last successfully parsed option
     static size_t unpackVendorOptions6(const uint32_t vendor_id,
                                        const OptionBuffer& buf,
                                        isc::dhcp::OptionCollection& options);
@@ -206,6 +208,7 @@ public:
     /// @param buf Buffer to be parsed.
     /// @param options Reference to option container. Options will be
     ///        put here.
+    /// @return offset to the first byte after the last successfully parsed option
     static size_t unpackVendorOptions4(const uint32_t vendor_id, const OptionBuffer& buf,
                                        isc::dhcp::OptionCollection& options);