Changeset f398c61


Ignore:
Timestamp:
04/21/17 14:40:32 (4 years ago)
Author:
Shane Alcock <salcock@…>
Branches:
cachetimestamps, develop, dpdk-ndag, etsilive, master, ndag_format, rc-4.0.2, rc-4.0.3, rc-4.0.4, ringdecrementfix, ringperformance
Children:
633339d, b606855, d47ca18, e9c089a
Parents:
ed3a238
Message:

Libpacketdump now recognises truncated IPv6 headers

This should fix #48, as well as avoid displaying bogus IPv6
header fields when the captured packet is too short to actually
contain useful values for them.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libpacketdump/eth_34525.c

    ree6e802 rf398c61  
    3838{
    3939        libtrace_ip6_t *ip = (libtrace_ip6_t*)packet;
    40        
    4140        uint32_t tmp = ntohl(*(uint32_t*)ip);
    4241
    43         printf(" IPv6: Version %u\n", (tmp >> 28) & 0x000000f);
    44         printf(" IPv6: Class %u\n", (tmp >> 20) & 0x000000ff);
    45         printf(" IPv6: Flow Label %u\n", tmp & 0x000fffff);
    46         printf(" IPv6: Payload Length %u\n", ntohs(ip->plen));
    47         printf(" IPv6: Next Header %u\n", ip->nxt);
    48         printf(" IPv6: Hop Limit %u\n", ip->hlim);
     42        int truncated = 0;
     43        char ipstr[INET6_ADDRSTRLEN];
    4944
     45        do {
     46                if (len < 4) {
     47                        truncated = 1;
     48                        break;
     49                }
    5050
    51         char ipstr[INET6_ADDRSTRLEN];                             
    52         inet_ntop(AF_INET6, &(ip->ip_src), ipstr, INET6_ADDRSTRLEN);
     51                printf(" IPv6: Version %u\n", (tmp >> 28) & 0x000000f);
     52                printf(" IPv6: Class %u\n", (tmp >> 20) & 0x000000ff);
     53                printf(" IPv6: Flow Label %u\n", tmp & 0x000fffff);
    5354
    54         printf(" IPv6: Source IP %s\n", ipstr);
    55         inet_ntop(AF_INET6, &(ip->ip_dst), ipstr, INET6_ADDRSTRLEN);
    56         printf(" IPv6: Destination IP %s\n", ipstr);
     55                if (len < 6) {
     56                        truncated = 1;
     57                        break;
     58                }
     59                printf(" IPv6: Payload Length %u\n", ntohs(ip->plen));
     60
     61                if (len < 7) {
     62                        truncated = 1;
     63                        break;
     64                }
     65                printf(" IPv6: Next Header %u\n", ip->nxt);
     66                if (len < 8) {
     67                        truncated = 1;
     68                        break;
     69                }
     70                printf(" IPv6: Hop Limit %u\n", ip->hlim);
     71
     72                if (len < 24) {
     73                        truncated = 1;
     74                        break;
     75                }
     76
     77                inet_ntop(AF_INET6, &(ip->ip_src), ipstr, INET6_ADDRSTRLEN);
     78                printf(" IPv6: Source IP %s\n", ipstr);
     79
     80                if (len < 40) {
     81                        truncated = 1;
     82                        break;
     83                }
     84
     85                inet_ntop(AF_INET6, &(ip->ip_dst), ipstr, INET6_ADDRSTRLEN);
     86                printf(" IPv6: Destination IP %s\n", ipstr);
     87        } while (0);
     88
     89        if (truncated) {
     90                printf(" IPv6: [Truncated]\n");
     91                return;
     92        }
    5793
    5894        decode_next(packet+sizeof(libtrace_ip6_t),len-sizeof(libtrace_ip6_t),"ip",ip->nxt);
Note: See TracChangeset for help on using the changeset viewer.