Changeset 411666a for lib


Ignore:
Timestamp:
12/19/07 11:17:58 (14 years ago)
Author:
Shane Alcock <salcock@…>
Branches:
4.0.1-hotfixes, cachetimestamps, develop, dpdk-ndag, etsilive, getfragoff, help, libtrace4, master, ndag_format, pfring, rc-4.0.1, rc-4.0.2, rc-4.0.3, rc-4.0.4, ringdecrementfix, ringperformance, ringtimestampfixes
Children:
a78665c
Parents:
287b2b4
Message:
  • Fixed get_payload_from_X functions not returning NULL in cases where they have a full X header but no subsequent payload (i.e. remaining would be exactly 0 upon return)
  • trace_get_layer3 should not be a SIMPLE_FUNCTION anymore
  • trace_get_ip now checks that at least a full IPv4 header is present
  • Calls to payload_from_ethernet functions inside trace_get_layer3 will now update remaining correctly
Location:
lib
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • lib/libtrace.h.in

    r50bbce8 r411666a  
    11281128 * bytes after the pointer returned.
    11291129 */
    1130 DLLEXPORT SIMPLE_FUNCTION
     1130DLLEXPORT
    11311131void *trace_get_layer3(const libtrace_packet_t *packet,
    11321132                uint16_t *ethertype, uint32_t *remaining);
  • lib/protocols_l2.c

    r8f18776 r411666a  
    3636
    3737                if (remaining) {
    38                         if (*remaining < sizeof(libtrace_8021q_t))
     38                        if (*remaining <= sizeof(libtrace_8021q_t))
    3939                                return NULL;
    4040
     
    7878                ethernet=(char*)ethernet+4;
    7979                if (remaining) {
    80                         if (*remaining<4)
     80                        if (*remaining<=4)
    8181                                return NULL;
    8282                        else
     
    9898
    9999        if (remaining) {
    100                 if (*remaining < sizeof(libtrace_llcsnap_t))
     100                if (*remaining <= sizeof(libtrace_llcsnap_t))
    101101                        return NULL;
    102102                *remaining-=(sizeof(libtrace_llcsnap_t));
     
    117117        int8_t extra = 0; /* how many QoS bytes to skip */
    118118       
    119         if (remaining && *remaining < sizeof(libtrace_80211_t))
     119        if (remaining && *remaining <= sizeof(libtrace_80211_t))
    120120                return NULL;
    121121
     
    159159
    160160        if (remaining) {
    161                 if (*remaining < sizeof(libtrace_ppp_t))
     161                if (*remaining <= sizeof(libtrace_ppp_t))
    162162                        return NULL;
    163163                *remaining-=sizeof(libtrace_ppp_t);
     
    186186
    187187        if (remaining) {
    188                 if (*remaining < sizeof(libtrace_chdlc_t))
     188                if (*remaining <= sizeof(libtrace_chdlc_t))
    189189                        return NULL;
    190190                *remaining-=sizeof(libtrace_chdlc_t);
     
    253253{
    254254        libtrace_atm_capture_cell_t *cell;
    255         if (remaining && *remaining<sizeof(libtrace_atm_capture_cell_t))
     255        if (remaining && *remaining<=sizeof(libtrace_atm_capture_cell_t))
    256256                return NULL;
    257257        cell=(libtrace_atm_capture_cell_t*)link;
  • lib/protocols_l3.c

    r75453c2 r411666a  
    1616                return NULL;
    1717
     18        /* Make sure we have at least a base IPv4 header */
     19        if (remaining < sizeof(libtrace_ip_t))
     20                return NULL;
     21       
    1822        /* Not an IPv4 packet */
    1923        if (((libtrace_ip_t*)ret)->ip_v != 4)
     
    5054
    5155        if (remaining) {
    52                 if (*remaining<(ipptr->ip_hl*4U)) {
     56                if (*remaining<=(ipptr->ip_hl*4U)) {
    5357                        return NULL;
    5458                }
     
    135139
    136140        link = trace_get_layer2(packet,&linktype,remaining);
    137 
    138141        iphdr = trace_get_payload_from_layer2(
    139142                        link,
     
    142145                        remaining);
    143146
    144         if (!iphdr)
    145                 return NULL;
    146 
     147        /* These should really update remaining */
    147148        for(;;) {
     149                if (!iphdr || *remaining == 0)
     150                        return NULL;
    148151                switch(*ethertype) {
    149152                case 0x8100: /* VLAN */
    150153                        iphdr=trace_get_vlan_payload_from_ethernet_payload(
    151                                           iphdr,ethertype,NULL);
     154                                          iphdr,ethertype,remaining);
    152155                        continue;
    153156                case 0x8847: /* MPLS */
    154157                        iphdr=trace_get_mpls_payload_from_ethernet_payload(
    155                                           iphdr,ethertype,NULL);
     158                                          iphdr,ethertype,remaining);
    156159
    157160                        if (iphdr && ethertype == 0x0) {
    158161                                iphdr=trace_get_payload_from_ethernet(
    159                                                 iphdr,ethertype,NULL);
     162                                                iphdr,ethertype,remaining);
    160163                        }
    161164                        continue;
     
    167170        }
    168171
     172        if (!iphdr || *remaining == 0)
     173                return NULL;
    169174        /* Store values in the cache for later */
    170175        /* Cast away constness, nasty, but this is just a cache */
    171176        ((libtrace_packet_t*)packet)->l3_ethertype = *ethertype;
    172177        ((libtrace_packet_t*)packet)->l3_header = iphdr;
    173 
    174178        return iphdr;
    175179}
  • lib/protocols_pktmeta.c

    r8b98289 r411666a  
    2626
    2727        if (remaining) {
    28                 if (*remaining < sizeof(*sll))
     28                if (*remaining <= sizeof(*sll))
    2929                        return NULL;
    3030                *remaining-=sizeof(*sll);
     
    4343        libtrace_pflog_header_t *pflog = (libtrace_pflog_header_t*)link;
    4444        if (remaining) {
    45                 if (*remaining<sizeof(*pflog))
     45                if (*remaining<=sizeof(*pflog))
    4646                        return NULL;
    4747                *remaining-=sizeof(*pflog);
     
    5858{
    5959        if (remaining) {
    60                 if (*remaining<144)
     60                if (*remaining<=144)
    6161                        return NULL;
    6262                *remaining-=144;
     
    7575        uint16_t rtaplen = bswap_le_to_host16(rtap->it_len);
    7676        if (remaining) {
    77                 if (*remaining < rtaplen)
     77                if (*remaining <= rtaplen)
    7878                        return NULL;
    7979                *remaining -= rtaplen;
  • lib/protocols_transport.c

    ra81d2fc r411666a  
    1919        transport = trace_get_layer3(packet,&ethertype,remaining);
    2020
    21         if (!transport)
     21        if (!transport || *remaining == 0)
    2222                return NULL;
    2323
     
    118118{
    119119        if (remaining) {
    120                 if (*remaining < sizeof(libtrace_udp_t))
     120                if (*remaining <= sizeof(libtrace_udp_t))
    121121                        return NULL;
    122122                *remaining-=sizeof(libtrace_udp_t);
     
    129129        unsigned int dlen = tcp->doff*4;
    130130        if (remaining) {
    131                 if (*remaining < dlen)
     131                if (*remaining <= dlen)
    132132                        return NULL;
    133133                *remaining-=dlen;
     
    139139{
    140140        if (remaining) {
    141                 if (*remaining < sizeof(libtrace_icmp_t))
     141                if (*remaining <= sizeof(libtrace_icmp_t))
    142142                        return NULL;
    143143                *remaining-=sizeof(libtrace_icmp_t);
Note: See TracChangeset for help on using the changeset viewer.