]> The Tcpdump Group git mirrors - tcpdump/commitdiff
PKTAP,PPI: Fix printing NULL string pointers
authorFrancois-Xavier Le Bail <[email protected]>
Thu, 13 Oct 2016 19:45:44 +0000 (21:45 +0200)
committerFrancois-Xavier Le Bail <[email protected]>
Thu, 13 Oct 2016 20:18:21 +0000 (22:18 +0200)
Printing NULL string pointers with printf format %s is an undefined
behaviour.
pcap_datalink_val_to_name() may return NULL on unknown DLT_ value.

tcpdump terminated with Segmentation Fault on such case on Solaris 10
SPARC with Solaris Studio 12.3 compiler.

print-pktap.c
print-ppi.c

index 0680f9e011b4dc335655a3fd0138a233e5627335..7144f3c6e9657b851ad4f302c94ecf56f48467bf 100644 (file)
@@ -72,16 +72,18 @@ pktap_header_print(netdissect_options *ndo, const u_char *bp, u_int length)
 {
        const pktap_header_t *hdr;
        uint32_t dlt, hdrlen;
+       const char *dltname;
 
        hdr = (const pktap_header_t *)bp;
 
        dlt = EXTRACT_LE_32BITS(&hdr->pkt_dlt);
        hdrlen = EXTRACT_LE_32BITS(&hdr->pkt_len);
+       dltname = pcap_datalink_val_to_name(dlt);
        if (!ndo->ndo_qflag) {
-               ND_PRINT((ndo,"DLT %s (%d) len %d",
-                         pcap_datalink_val_to_name(dlt), dlt, hdrlen));
+               ND_PRINT((ndo,"DLT %s (%d) len %d",
+                         (dltname != NULL ? dltname : "UNKNOWN"), dlt, hdrlen));
         } else {
-               ND_PRINT((ndo,", %s", pcap_datalink_val_to_name(dlt)));
+               ND_PRINT((ndo,"%s", (dltname != NULL ? dltname : "UNKNOWN")));
         }
 
        ND_PRINT((ndo, ", length %u: ", length));
index cb8f3b95100b9e16c4bad3e834fbbb5dc0bf05a9..72cd1b867fd502b9b5699f1ee669a0f10011aed6 100644 (file)
@@ -30,18 +30,20 @@ ppi_header_print(netdissect_options *ndo, const u_char *bp, u_int length)
        const ppi_header_t *hdr;
        uint16_t len;
        uint32_t dlt;
+       const char *dltname;
 
        hdr = (const ppi_header_t *)bp;
 
        len = EXTRACT_LE_16BITS(&hdr->ppi_len);
        dlt = EXTRACT_LE_32BITS(&hdr->ppi_dlt);
+       dltname = pcap_datalink_val_to_name(dlt);
 
        if (!ndo->ndo_qflag) {
                ND_PRINT((ndo, "V.%d DLT %s (%d) len %d", hdr->ppi_ver,
-                         pcap_datalink_val_to_name(dlt), dlt,
+                         (dltname != NULL ? dltname : "UNKNOWN"), dlt,
                           len));
         } else {
-               ND_PRINT((ndo, "%s", pcap_datalink_val_to_name(dlt)));
+               ND_PRINT((ndo, "%s", (dltname != NULL ? dltname : "UNKNOWN")));
         }
 
        ND_PRINT((ndo, ", length %u: ", length));