Messages in this thread Patch in this message | | | Date | Fri, 05 Nov 2004 21:23:50 +0100 | From | Pablo Neira <> | Subject | Re: [BK PATCH] Fix ip_conntrack_amanda data corruption bug that breaks amanda dumps |
| |
Patrick McHardy wrote:
> Matthias Andree wrote: > >> On Thu, 04 Nov 2004, Patrick McHardy wrote: >> >>> The data that is changed is only a copy, the actual packet is not >>> touched. >>> >> >> >> Why then does the application not see the packets as long as >> ip_conntrack_amanda is loaded and starts seeing them again as soon as >> "rmmod ip_conntrack_amanda" has completed? >> >> > > Your observation and your patch were correct, thanks. It is supposed > to be just a copy, I missed that it wasn't anymore. While your patch > works too, and is even faster with non-linear skbs, I don't like the > idea of using the skb as a scratch-area, so I sent this patch to Dave > instead.
Patrick, what about this? this way we save a copy to a buffer for linear skbs.
Signed-off-by: Pablo Neira Ayuso <pablo@eurodev.net> ===== net/ipv4/netfilter/ip_conntrack_amanda.c 1.10 vs edited ===== --- 1.10/net/ipv4/netfilter/ip_conntrack_amanda.c 2004-08-19 02:14:53 +02:00 +++ edited/net/ipv4/netfilter/ip_conntrack_amanda.c 2004-11-05 17:32:04 +01:00 @@ -49,9 +49,10 @@ { struct ip_conntrack_expect *exp; struct ip_ct_amanda_expect *exp_amanda_info; - char *amp, *data, *data_limit, *tmp; + char *amp, *data, *tmp; unsigned int dataoff, i; u_int16_t port, len; + int found = 0; /* Only look at packets from the Amanda server */ if (CTINFO2DIR(ctinfo) == IP_CT_DIR_ORIGINAL) @@ -74,12 +75,17 @@ skb->len - dataoff, amanda_buffer); BUG_ON(amp == NULL); data = amp; - data_limit = amp + skb->len - dataoff; - *data_limit = '\0'; /* Search for the CONNECT string */ - data = strstr(data, "CONNECT "); - if (!data) + while((data = memchr(data, 'C', skb->len - dataoff)) != NULL) { + if (strncmp(data, "CONNECT ", 8) == 0) { + found = 1; + break; + } + data++; + } + + if (!found) goto out; data += strlen("CONNECT "); | |