lkml.org 
[lkml]   [2004]   [Nov]   [4]   [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
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.

Regards
Patrick

# This is a BitKeeper generated diff -Nru style patch.
#
# ChangeSet
# 2004/11/04 22:50:11+01:00 kaber@coreworks.de
# [NETFILTER]: Don't use skb_header_pointer in amanda conntrack helper
#
# Fixes broken packets, noticed by Matthias Andree <matthias.andree@gmx.de>
#
# Signed-off-by: Patrick McHardy <kaber@trash.net>
#
# net/ipv4/netfilter/ip_conntrack_amanda.c
# 2004/11/04 22:50:04+01:00 kaber@coreworks.de +5 -7
# [NETFILTER]: Don't use skb_header_pointer in amanda conntrack helper
#
# Fixes broken packets, noticed by Matthias Andree <matthias.andree@gmx.de>
#
# Signed-off-by: Patrick McHardy <kaber@trash.net>
#
diff -Nru a/net/ipv4/netfilter/ip_conntrack_amanda.c b/net/ipv4/netfilter/ip_conntrack_amanda.c
--- a/net/ipv4/netfilter/ip_conntrack_amanda.c 2004-11-04 22:50:37 +01:00
+++ b/net/ipv4/netfilter/ip_conntrack_amanda.c 2004-11-04 22:50:37 +01:00
@@ -49,7 +49,7 @@
{
struct ip_conntrack_expect *exp;
struct ip_ct_amanda_expect *exp_amanda_info;
- char *amp, *data, *data_limit, *tmp;
+ char *data, *data_limit, *tmp;
unsigned int dataoff, i;
u_int16_t port, len;

@@ -70,11 +70,9 @@
}

LOCK_BH(&amanda_buffer_lock);
- amp = skb_header_pointer(skb, dataoff,
- skb->len - dataoff, amanda_buffer);
- BUG_ON(amp == NULL);
- data = amp;
- data_limit = amp + skb->len - dataoff;
+ skb_copy_bits(skb, dataoff, amanda_buffer, skb->len - dataoff);
+ data = amanda_buffer;
+ data_limit = amanda_buffer + skb->len - dataoff;
*data_limit = '\0';

/* Search for the CONNECT string */
@@ -110,7 +108,7 @@
exp->mask.dst.u.tcp.port = 0xFFFF;

exp_amanda_info = &exp->help.exp_amanda_info;
- exp_amanda_info->offset = tmp - amp;
+ exp_amanda_info->offset = tmp - amanda_buffer;
exp_amanda_info->port = port;
exp_amanda_info->len = len;
\
 
 \ /
  Last update: 2005-03-22 14:07    [W:0.082 / U:0.124 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site