Changeset b8d8186


Ignore:
Timestamp:
08/07/14 11:21:10 (6 years ago)
Author:
Shane Alcock <salcock@…>
Branches:
4.0.1-hotfixes, cachetimestamps, develop, dpdk-ndag, etsilive, 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:
4649fea
Parents:
cd8efa6
Message:

Fix strangeness when using bogus filters on int:

Changes:

  • Make sure trace_start returns -1 for int: if the provided filter failed to compile, rather than falling through to using trace_apply_filter on the first packet (and failing). This is also more consistent with what pcapint: already does.
  • Check for -1 return value from trace_apply_filter, rather than treating -1 as a successful match.
Location:
lib
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • lib/format_helper.c

    r74ecbc7 rb8d8186  
    111111
    112112        if (FD_ISSET(event.fd, &rfds_param)) {
    113                 event.size = trace_read_packet(trace,packet);
    114                
     113                event.size = trace_read_packet(trace,packet);
    115114                if (event.size < 1) {
    116115                        /* Covers error and EOF events - terminate rather
  • lib/format_linux.c

    r53eb1aa rb8d8186  
    501501         */
    502502        if (filter != NULL) {
    503                 assert(filter->flag == 1);
    504                 if (setsockopt(FORMAT(libtrace->format_data)->fd,
     503                /* Check if the filter was successfully compiled. If not,
     504                 * it is probably a bad filter and we should return an error
     505                 * before the caller tries to read any packets */
     506                if (filter->flag == 0) {
     507                        return -1;
     508                }
     509               
     510                if (setsockopt(FORMAT(libtrace->format_data)->fd,
    505511                                        SOL_SOCKET,
    506512                                        SO_ATTACH_FILTER,
     
    746752
    747753                if (pcap_compile(pcap, &f->filter, f->filterstring, 0, 0) == -1) {
    748                         perror("PCAP failed to compile the filterstring");
    749                         return -1;
    750                 }
     754                        /* Filter didn't compile, set flag to 0 so we can
     755                         * detect this when trace_start() is called and
     756                         * produce a useful error
     757                         */
     758                        f->flag = 0;
     759                        trace_set_err(libtrace, TRACE_ERR_INIT_FAILED,
     760                                        "Failed to compile BPF filter (%s): %s",
     761                                        f->filterstring, pcap_geterr(pcap));
     762                } else {
     763                        /* Set the "flag" to indicate that the filterstring
     764                         * has been compiled
     765                         */
     766                        f->flag = 1;
     767                }
    751768
    752769                pcap_close(pcap);
    753770               
    754                 /* Set the "flag" to indicate that the filterstring has been
    755                  * compiled
    756                  */
    757                 f->flag = 1;
    758771        }
    759772       
  • lib/trace.c

    rf7bcbfb rb8d8186  
    723723                do {
    724724                        size_t ret;
     725                        int filtret;
    725726                        /* Clear the packet cache */
    726727                        trace_clear_cache(packet);
     
    733734                                 * packet
    734735                                 */
    735                                 if (!trace_apply_filter(libtrace->filter,packet)){
     736                                filtret = trace_apply_filter(libtrace->filter, packet);
     737                                if (filtret == -1) {
     738                                        /* Error compiling filter, probably */
     739                                        return ~0U;
     740                                }
     741                               
     742                                if (filtret == 0) {
    736743                                        ++libtrace->filtered_packets;
    737744                                        continue;
     
    11131120        if (packet->trace->format->trace_event) {
    11141121                event=packet->trace->format->trace_event(trace,packet);
    1115                 if (event.type == TRACE_EVENT_PACKET) {
     1122                if (event.type == TRACE_EVENT_PACKET) {
    11161123                        ++trace->accepted_packets;
    11171124                }
Note: See TracChangeset for help on using the changeset viewer.