Changeset 5e5b6ca


Ignore:
Timestamp:
02/13/19 11:37:55 (20 months ago)
Author:
Jacob van Walraven <jacobvw@…>
Branches:
develop
Children:
b9af56e
Parents:
c876f29
Message:

Allocate space for 10 headers at a time rather than calling realloc for every header found, Ensure we check for NULL after calling realloc, If a VLAN or MPLS id is not found set remaining to 0

File:
1 edited

Legend:

Unmodified
Added
Removed
  • lib/protocols_l2.c

    rc876f29 r5e5b6ca  
    112112        uint16_t ethertype;
    113113        libtrace_layer2_headers_t *r;
     114        int allocated_headers = 0;
    114115
    115116        if (packet == NULL) {
     
    136137                return NULL;
    137138        }
    138         r->header = calloc(1, sizeof(libtrace_layer2_header_t));
     139        /* Alloc enough space for 10 headers */
     140        r->header = calloc(1, sizeof(libtrace_layer2_header_t)*10);
    139141        if (r->header == NULL) {
    140142                trace_set_err(packet->trace, TRACE_ERR_OUT_OF_MEMORY,
     
    143145                return NULL;
    144146        }
     147        allocated_headers = 10;
    145148
    146149        /* get the first layer2 header */
     
    198201                        }
    199202
    200                         r->header = realloc(r->header,
    201                                 sizeof(libtrace_layer2_header_t)*(r->num+1));
     203                        if ((r->num+1) >= allocated_headers) {
     204                                allocated_headers += 10;
     205                                r->header = realloc(r->header,
     206                                        sizeof(libtrace_layer2_header_t)*allocated_headers);
     207
     208                                if (r->header == NULL) {
     209                                        trace_set_err(packet->trace, TRACE_ERR_OUT_OF_MEMORY,
     210                                                "Unable to allocate memory in trace_get_layer2_headers()");
     211                                        free(r);
     212                                        return NULL;
     213                                }
     214                        }
     215
    202216                        r->header[r->num].ethertype = ethertype;
    203217                        r->header[r->num++].data = ptr;
     
    214228
    215229        /* If no results were found free memory now and just return NULL */
    216         if (r->num) {
     230        if (r->num == 0) {
    217231                free(r->header);
    218232                free(r);
     
    235249                fprintf(stderr, "NULL packet passed into trace_get_outermost_vlan()\n");
    236250                *vlanptr = NULL;
    237                 *remaining = rem;
     251                *remaining = 0;
    238252                return vlanid;
    239253        }
     
    243257        if (ptr == NULL) {
    244258                *vlanptr = NULL;
    245                         *remaining = rem;
     259                *remaining = 0;
    246260                return vlanid;
    247261        }
     
    253267
    254268                        *vlanptr = NULL;
    255                         *remaining = rem;
     269                        *remaining = 0;
    256270                        return vlanid;
    257271                }
     
    290304        /* No layer2 */
    291305        if (ptr == NULL) {
    292                 *remaining = rem;
     306                *remaining = 0;
    293307                *mplsptr = NULL;
    294308                return mplslabel;
     
    299313                if (rem == 0 || ptr == NULL) {
    300314
    301                         *remaining = rem;
     315                        *remaining = 0;
    302316                        *mplsptr = NULL;
    303317                        return mplslabel;
Note: See TracChangeset for help on using the changeset viewer.