diff -Naur Net-CDP-0.09/libcdp/src/encoding.c Net-CDP-0.09.new/libcdp/src/encoding.c --- Net-CDP-0.09/libcdp/src/encoding.c 2005-07-20 21:44:13.000000000 +0800 +++ Net-CDP-0.09.new/libcdp/src/encoding.c 2007-11-04 14:49:57.000000000 +0800 @@ -236,32 +236,46 @@ case CDP_TYPE_APPLIANCE_REPLY: if (packet->appliance) DUPLICATE("Appliance VLAN-ID Reply TLV"); + /* if (tlv_length != sizeof(uint8_t) + sizeof(uint16_t)) INVALID2("Appliance VLAN-ID Reply TLV length (not %d)", sizeof(uint8_t) + sizeof(uint16_t)); + */ { uint8_t id; uint16_t vlan; + uint8_t pad; + if (!GRAB_UINT8(id)) EOP("appliance ID in Appliance VLAN-ID Reply TLV"); if (!GRAB_UINT16(vlan)) EOP("appliance VLAN in Appliance VLAN-ID Reply TLV"); + if (tlv_length == (sizeof(uint8_t) + sizeof(uint16_t)+sizeof(uint8_t))) { + if (!GRAB_UINT8(pad)) + EOP("Pad Byte in Appliance VLAN-ID Reply TLV"); + } packet->appliance = cdp_appliance_new(id, vlan); } break; case CDP_TYPE_APPLIANCE_QUERY: if (packet->appliance_query) DUPLICATE("Appliance VLAN-ID Query TLV"); + /* if (tlv_length != sizeof(uint8_t) + sizeof(uint16_t)) INVALID2("Appliance VLAN-ID TLV Query length (not %d)", sizeof(uint8_t) + sizeof(uint16_t)); + */ { uint8_t id; uint16_t vlan; + uint8_t pad; + if (!GRAB_UINT8(id)) EOP("appliance ID in Appliance VLAN-ID Query TLV"); if (!GRAB_UINT16(vlan)) EOP("appliance VLAN in Appliance VLAN-ID Query TLV"); + if (!GRAB_UINT8(pad)) + EOP("Pad Byte in Appliance VLAN-ID Reply TLV"); packet->appliance_query = cdp_appliance_new(id, vlan); } @@ -369,6 +383,7 @@ return packet; fail: + fprintf(stderr, "\n\nSome error: %s\n\n", errors); cdp_packet_free(packet); return NULL; @@ -552,7 +567,8 @@ if (packet->appliance_query && !( START_TLV(CDP_TYPE_APPLIANCE_QUERY) && PUSH_UINT8(packet->appliance_query->id) && - PUSH_UINT16(packet->appliance_query->vlan) + PUSH_UINT16(packet->appliance_query->vlan) && + PUSH_UINT8(0x01) )) return 0; END_TLV;