]> The Tcpdump Group git mirrors - tcpdump/commitdiff
Use nd_ types, add EXTRACT_ calls, clean up signed vs. unsigned.
authorGuy Harris <[email protected]>
Sun, 31 Dec 2017 00:56:50 +0000 (16:56 -0800)
committerGuy Harris <[email protected]>
Sun, 31 Dec 2017 00:56:50 +0000 (16:56 -0800)
print-lwapp.c

index 76ce9f9f5f038575e4343d90b52fd370623ea4c0..516b85bed392db87e8da8a83277ba1eb9694105f 100644 (file)
  */
 
 struct lwapp_transport_header {
-    uint8_t  version;
-    uint8_t  frag_id;
-    uint8_t  length[2];
-    uint16_t status;
+    nd_uint8_t  version;
+    nd_uint8_t  frag_id;
+    nd_uint16_t length;
+    nd_uint16_t status;
 };
 
 /*
@@ -62,10 +62,10 @@ struct lwapp_transport_header {
  */
 
 struct lwapp_control_header {
-    uint8_t  msg_type;
-    uint8_t  seq_num;
-    uint8_t  len[2];
-    uint8_t  session_id[4];
+    nd_uint8_t  msg_type;
+    nd_uint8_t  seq_num;
+    nd_uint16_t len;
+    nd_uint32_t session_id;
 };
 
 #define LWAPP_VERSION 0
@@ -157,8 +157,8 @@ static const struct tok lwapp_msg_type_values[] = {
  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  */
 struct lwapp_message_header {
-    uint8_t type;
-    uint8_t length[2];
+    nd_uint8_t  type;
+    nd_uint16_t length;
 };
 
 void
@@ -168,8 +168,9 @@ lwapp_control_print(netdissect_options *ndo,
     const struct lwapp_transport_header *lwapp_trans_header;
     const struct lwapp_control_header *lwapp_control_header;
     const u_char *tptr;
-    int  tlen;
-    int  msg_tlen;
+    uint8_t version;
+    u_int tlen;
+    u_int msg_type, msg_tlen;
 
     tptr=pptr;
 
@@ -181,22 +182,23 @@ lwapp_control_print(netdissect_options *ndo,
         lwapp_trans_header = (const struct lwapp_transport_header *)pptr;
     }
     ND_TCHECK(*lwapp_trans_header);
+    version = EXTRACT_U_1(lwapp_trans_header->version);
 
     /*
      * Sanity checking of the header.
      */
-    if (LWAPP_EXTRACT_VERSION(lwapp_trans_header->version) != LWAPP_VERSION) {
+    if (LWAPP_EXTRACT_VERSION(version) != LWAPP_VERSION) {
        ND_PRINT((ndo, "LWAPP version %u packet not supported",
-               LWAPP_EXTRACT_VERSION(lwapp_trans_header->version)));
+               LWAPP_EXTRACT_VERSION(version)));
        return;
     }
 
     /* non-verbose */
     if (ndo->ndo_vflag < 1) {
         ND_PRINT((ndo, "LWAPPv%u, %s frame, Flags [%s], length %u",
-               LWAPP_EXTRACT_VERSION(lwapp_trans_header->version),
-               LWAPP_EXTRACT_CONTROL_BIT(lwapp_trans_header->version) ? "Control" : "Data",
-               bittok2str(lwapp_header_bits_values,"none",(lwapp_trans_header->version)&0x07),
+               LWAPP_EXTRACT_VERSION(version),
+               LWAPP_EXTRACT_CONTROL_BIT(version) ? "Control" : "Data",
+               bittok2str(lwapp_header_bits_values,"none",version&0x07),
                len));
         return;
     }
@@ -205,11 +207,11 @@ lwapp_control_print(netdissect_options *ndo,
     tlen=EXTRACT_BE_U_2(lwapp_trans_header->length);
 
     ND_PRINT((ndo, "LWAPPv%u, %s frame, Radio-id %u, Flags [%s], Frag-id %u, length %u",
-           LWAPP_EXTRACT_VERSION(lwapp_trans_header->version),
-           LWAPP_EXTRACT_CONTROL_BIT(lwapp_trans_header->version) ? "Control" : "Data",
-           LWAPP_EXTRACT_RID(lwapp_trans_header->version),
-           bittok2str(lwapp_header_bits_values,"none",(lwapp_trans_header->version)&0x07),
-          lwapp_trans_header->frag_id,
+           LWAPP_EXTRACT_VERSION(version),
+           LWAPP_EXTRACT_CONTROL_BIT(version) ? "Control" : "Data",
+           LWAPP_EXTRACT_RID(version),
+           bittok2str(lwapp_header_bits_values,"none",version&0x07),
+          EXTRACT_U_1(lwapp_trans_header->frag_id),
           tlen));
 
     if (has_ap_ident) {
@@ -219,19 +221,28 @@ lwapp_control_print(netdissect_options *ndo,
         tptr+=sizeof(struct lwapp_transport_header);
     }
 
-    while(tlen>0) {
+    while(tlen!=0) {
 
         /* did we capture enough for fully decoding the object header ? */
         ND_TCHECK_LEN(tptr, sizeof(struct lwapp_control_header));
+        if (tlen < sizeof(struct lwapp_control_header)) {
+            ND_PRINT((ndo, "\n\t  Msg goes past end of PDU"));
+            break;
+        }
 
         lwapp_control_header = (const struct lwapp_control_header *)tptr;
        msg_tlen = EXTRACT_BE_U_2(lwapp_control_header->len);
+        if (tlen < sizeof(struct lwapp_control_header) + msg_tlen) {
+            ND_PRINT((ndo, "\n\t  Msg goes past end of PDU"));
+            break;
+        }
 
        /* print message header */
-        ND_PRINT((ndo, "\n\t  Msg type: %s (%u), Seqnum: %u, Msg len: %d, Session: 0x%08x",
-               tok2str(lwapp_msg_type_values,"Unknown",lwapp_control_header->msg_type),
-               lwapp_control_header->msg_type,
-               lwapp_control_header->seq_num,
+       msg_type = EXTRACT_U_1(lwapp_control_header->msg_type);
+        ND_PRINT((ndo, "\n\t  Msg type: %s (%u), Seqnum: %u, Msg len: %u, Session: 0x%08x",
+               tok2str(lwapp_msg_type_values,"Unknown",msg_type),
+               msg_type,
+               EXTRACT_U_1(lwapp_control_header->seq_num),
                msg_tlen,
                EXTRACT_BE_U_4(lwapp_control_header->session_id)));
 
@@ -239,7 +250,7 @@ lwapp_control_print(netdissect_options *ndo,
         ND_TCHECK_LEN(tptr, msg_tlen);
 
        /* XXX - Decode sub messages for each message */
-        switch(lwapp_control_header->msg_type) {
+        switch(msg_type) {
         case LWAPP_MSGTYPE_DISCOVERY_REQUEST:
         case LWAPP_MSGTYPE_DISCOVERY_RESPONSE:
         case LWAPP_MSGTYPE_JOIN_REQUEST:
@@ -290,7 +301,8 @@ lwapp_data_print(netdissect_options *ndo,
 {
     const struct lwapp_transport_header *lwapp_trans_header;
     const u_char *tptr;
-    int tlen;
+    u_int tlen;
+    u_int version;
 
     tptr=pptr;
 
@@ -298,35 +310,45 @@ lwapp_data_print(netdissect_options *ndo,
     ND_TCHECK_6(tptr);
     lwapp_trans_header = (const struct lwapp_transport_header *)pptr;
     ND_TCHECK(*lwapp_trans_header);
+    version = EXTRACT_U_1(lwapp_trans_header->version);
 
     /*
      * Sanity checking of the header.
      */
-    if (LWAPP_EXTRACT_VERSION(lwapp_trans_header->version) != LWAPP_VERSION) {
+    if (LWAPP_EXTRACT_VERSION(version) != LWAPP_VERSION) {
         ND_PRINT((ndo, "LWAPP version %u packet not supported",
-               LWAPP_EXTRACT_VERSION(lwapp_trans_header->version)));
+               LWAPP_EXTRACT_VERSION(version)));
         return;
     }
 
     /* non-verbose */
     if (ndo->ndo_vflag < 1) {
         ND_PRINT((ndo, "LWAPPv%u, %s frame, Flags [%s], length %u",
-               LWAPP_EXTRACT_VERSION(lwapp_trans_header->version),
-               LWAPP_EXTRACT_CONTROL_BIT(lwapp_trans_header->version) ? "Control" : "Data",
-               bittok2str(lwapp_header_bits_values,"none",(lwapp_trans_header->version)&0x07),
+               LWAPP_EXTRACT_VERSION(version),
+               LWAPP_EXTRACT_CONTROL_BIT(version) ? "Control" : "Data",
+               bittok2str(lwapp_header_bits_values,"none",version&0x07),
                len));
         return;
     }
 
     /* ok they seem to want to know everything - lets fully decode it */
     tlen=EXTRACT_BE_U_2(lwapp_trans_header->length);
+    if (tlen < sizeof(struct lwapp_transport_header)) {
+        ND_PRINT((ndo, "LWAPPv%u, %s frame, Radio-id  %u, Flags [%s], length %u < transport header length",
+               LWAPP_EXTRACT_VERSION(version),
+               LWAPP_EXTRACT_CONTROL_BIT(version) ? "Control" : "Data",
+               LWAPP_EXTRACT_RID(version),
+               bittok2str(lwapp_header_bits_values,"none",version&0x07),
+               tlen));
+        return;
+    }
 
     ND_PRINT((ndo, "LWAPPv%u, %s frame, Radio-id  %u, Flags [%s], Frag-id  %u, length %u",
-           LWAPP_EXTRACT_VERSION(lwapp_trans_header->version),
-           LWAPP_EXTRACT_CONTROL_BIT(lwapp_trans_header->version) ? "Control" : "Data",
-           LWAPP_EXTRACT_RID(lwapp_trans_header->version),
-           bittok2str(lwapp_header_bits_values,"none",(lwapp_trans_header->version)&0x07),
-           lwapp_trans_header->frag_id,
+           LWAPP_EXTRACT_VERSION(version),
+           LWAPP_EXTRACT_CONTROL_BIT(version) ? "Control" : "Data",
+           LWAPP_EXTRACT_RID(version),
+           bittok2str(lwapp_header_bits_values,"none",version&0x07),
+           EXTRACT_U_1(lwapp_trans_header->frag_id),
            tlen));
 
     tptr+=sizeof(struct lwapp_transport_header);