Changeset 6327ce6


Ignore:
Timestamp:
12/19/18 14:47:21 (2 years ago)
Author:
Jacob Van Walraven <jcv9@…>
Branches:
develop
Children:
8df87c4
Parents:
1668208
Message:

Fix memory leak when configuring bpf filters issue #87

Location:
lib
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • lib/format_linux_common.c

    r509ee47 r6327ce6  
    6666        unsigned int arphrd;
    6767        libtrace_dlt_t dlt;
    68         libtrace_filter_t *f;
    6968        int sock;
    7069        pcap_t *pcap;
    71 
    72         /* Take a copy of the filter object as it was passed in */
    73         f = (libtrace_filter_t *) malloc(sizeof(libtrace_filter_t));
    74         memcpy(f, filter, sizeof(libtrace_filter_t));
    7570
    7671        /* If we are passed a filter with "flag" set to zero, then we must
     
    8378         * anything (we've just copied it above).
    8479         */
    85         if (f->flag == 0) {
     80        if (filter->flag == 0) {
    8681                sock = socket(PF_INET, SOCK_STREAM, 0);
    8782                memset(&ifr, 0, sizeof(struct ifreq));
     
    9994                                FORMAT_DATA->snaplen);
    10095
    101                 if (pcap_compile(pcap, &f->filter, f->filterstring, 0, 0) == -1) {
     96                if (pcap_compile(pcap, &filter->filter, filter->filterstring, 0, 0) == -1) {
    10297                        /* Filter didn't compile, set flag to 0 so we can
    10398                         * detect this when trace_start() is called and
    10499                         * produce a useful error
    105100                         */
    106                         f->flag = 0;
     101                        filter->flag = 0;
    107102                        trace_set_err(libtrace, TRACE_ERR_INIT_FAILED,
    108103                                      "Failed to compile BPF filter (%s): %s",
    109                                       f->filterstring, pcap_geterr(pcap));
     104                                      filter->filterstring, pcap_geterr(pcap));
    110105                } else {
    111106                        /* Set the "flag" to indicate that the filterstring
    112107                         * has been compiled
    113108                         */
    114                         f->flag = 1;
     109                        filter->flag = 1;
    115110                }
    116111
     
    119114        }
    120115
    121         if (FORMAT_DATA->filter != NULL)
    122                 free(FORMAT_DATA->filter);
    123 
    124         FORMAT_DATA->filter = f;
     116        FORMAT_DATA->filter = filter;
    125117
    126118        return 0;
     
    497489{
    498490        if (libtrace->format_data) {
    499                 if (FORMAT_DATA->filter != NULL)
    500                         free(FORMAT_DATA->filter);
    501491
    502492                if (FORMAT_DATA->per_stream)
  • lib/format_linux_ring.c

    rd439067 r6327ce6  
    307307                        }
    308308                }
    309 
    310                 if (FORMAT_DATA->filter != NULL)
    311                         free(FORMAT_DATA->filter);
    312309
    313310                if (FORMAT_DATA->per_stream)
Note: See TracChangeset for help on using the changeset viewer.