lkml.org 
[lkml]   [2004]   [Nov]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: [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 ");
    \
     
     \ /
      Last update: 2005-03-22 14:07    [W:0.021 / U:88.144 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site