Don't treat the packet length as unsigned.
authorGuy Harris <guy@alum.mit.edu>
Sun, 1 May 2016 23:22:40 +0000 (16:22 -0700)
committerGuy Harris <guy@alum.mit.edu>
Sun, 1 May 2016 23:23:29 +0000 (23:23 +0000)
The scanf family of functions are as annoyingly bad at handling unsigned
numbers as strtoul() is - both of them are perfectly willing to accept a
value beginning with a negative sign as an unsigned value.  When using
strtoul(), you can compensate for this by explicitly checking for a '-'
as the first character of the string, but you can't do that with
sscanf().

So revert to having pkt_len be signed, and scanning it with %d, but
check for a negative value and fail if we see a negative value.

Bug: 12395
Change-Id: I43b458a73b0934e9a5c2c89d34eac5a8f21a7455
Reviewed-on: https://code.wireshark.org/review/15223
Reviewed-by: Guy Harris <guy@alum.mit.edu>
wiretap/cosine.c

index 5d48b912e83b0722e747df15f2d0f5ee5bb6070d..c7f5952294211a2c289b1f40531d3a06d452c620 100644 (file)
@@ -330,8 +330,7 @@ parse_cosine_packet(FILE_T fh, struct wtap_pkthdr *phdr, Buffer *buf,
 {
        union wtap_pseudo_header *pseudo_header = &phdr->pseudo_header;
        int     num_items_scanned;
-       int     yy, mm, dd, hr, min, sec, csec;
-       guint   pkt_len;
+       int     yy, mm, dd, hr, min, sec, csec, pkt_len;
        int     pro, off, pri, rm, error;
        guint   code1, code2;
        char    if_name[COSINE_MAX_IF_NAME_LEN] = "", direction[6] = "";
@@ -343,7 +342,7 @@ parse_cosine_packet(FILE_T fh, struct wtap_pkthdr *phdr, Buffer *buf,
                   &yy, &mm, &dd, &hr, &min, &sec, &csec) == 7) {
                /* appears to be output to a control blade */
                num_items_scanned = sscanf(line,
-                  "%4d-%2d-%2d,%2d:%2d:%2d.%9d: %5s (%127[A-Za-z0-9/:]), Length:%9u, Pro:%9d, Off:%9d, Pri:%9d, RM:%9d, Err:%9d [%8x, %8x]",
+                  "%4d-%2d-%2d,%2d:%2d:%2d.%9d: %5s (%127[A-Za-z0-9/:]), Length:%9d, Pro:%9d, Off:%9d, Pri:%9d, RM:%9d, Err:%9d [%8x, %8x]",
                        &yy, &mm, &dd, &hr, &min, &sec, &csec,
                                   direction, if_name, &pkt_len,
                                   &pro, &off, &pri, &rm, &error,
@@ -357,7 +356,7 @@ parse_cosine_packet(FILE_T fh, struct wtap_pkthdr *phdr, Buffer *buf,
        } else {
                /* appears to be output to PE */
                num_items_scanned = sscanf(line,
-                  "%5s (%127[A-Za-z0-9/:]), Length:%9u, Pro:%9d, Off:%9d, Pri:%9d, RM:%9d, Err:%9d [%8x, %8x]",
+                  "%5s (%127[A-Za-z0-9/:]), Length:%9d, Pro:%9d, Off:%9d, Pri:%9d, RM:%9d, Err:%9d [%8x, %8x]",
                                   direction, if_name, &pkt_len,
                                   &pro, &off, &pri, &rm, &error,
                                   &code1, &code2);
@@ -369,6 +368,11 @@ parse_cosine_packet(FILE_T fh, struct wtap_pkthdr *phdr, Buffer *buf,
                }
                yy = mm = dd = hr = min = sec = csec = 0;
        }
+       if (pkt_len < 0) {
+               *err = WTAP_ERR_BAD_FILE;
+               *err_info = g_strdup("cosine: packet header has a negative packet length");
+               return FALSE;
+       }
        if (pkt_len > WTAP_MAX_PACKET_SIZE) {
                /*
                 * Probably a corrupt capture file; don't blow up trying