diff options
author | Patrick McHardy <kaber@trash.net> | 2006-02-04 05:13:57 -0500 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2006-02-05 02:51:19 -0500 |
commit | ad2ad0f96546d6d56b2665bcc863c33ae57c49c4 (patch) | |
tree | 9c5f6357bd7a0ecb4748acfaf19a04ea3149707b /net/ipv4 | |
parent | c2db292438c20c3f13db6e5563e0ce5b449bedac (diff) |
[NETFILTER]: Fix undersized skb allocation in ipt_ULOG/ebt_ulog/nfnetlink_log
The skb allocated is always of size nlbufsize, even if that is smaller than
the size needed for the current packet.
Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4')
-rw-r--r-- | net/ipv4/netfilter/ipt_ULOG.c | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/net/ipv4/netfilter/ipt_ULOG.c b/net/ipv4/netfilter/ipt_ULOG.c index 2fe64133bba3..180a9ea57b69 100644 --- a/net/ipv4/netfilter/ipt_ULOG.c +++ b/net/ipv4/netfilter/ipt_ULOG.c | |||
@@ -147,22 +147,26 @@ static void ulog_timer(unsigned long data) | |||
147 | static struct sk_buff *ulog_alloc_skb(unsigned int size) | 147 | static struct sk_buff *ulog_alloc_skb(unsigned int size) |
148 | { | 148 | { |
149 | struct sk_buff *skb; | 149 | struct sk_buff *skb; |
150 | unsigned int n; | ||
150 | 151 | ||
151 | /* alloc skb which should be big enough for a whole | 152 | /* alloc skb which should be big enough for a whole |
152 | * multipart message. WARNING: has to be <= 131000 | 153 | * multipart message. WARNING: has to be <= 131000 |
153 | * due to slab allocator restrictions */ | 154 | * due to slab allocator restrictions */ |
154 | 155 | ||
155 | skb = alloc_skb(nlbufsiz, GFP_ATOMIC); | 156 | n = max(size, nlbufsiz); |
157 | skb = alloc_skb(n, GFP_ATOMIC); | ||
156 | if (!skb) { | 158 | if (!skb) { |
157 | PRINTR("ipt_ULOG: can't alloc whole buffer %ub!\n", | 159 | PRINTR("ipt_ULOG: can't alloc whole buffer %ub!\n", n); |
158 | nlbufsiz); | ||
159 | 160 | ||
160 | /* try to allocate only as much as we need for | 161 | if (n > size) { |
161 | * current packet */ | 162 | /* try to allocate only as much as we need for |
163 | * current packet */ | ||
162 | 164 | ||
163 | skb = alloc_skb(size, GFP_ATOMIC); | 165 | skb = alloc_skb(size, GFP_ATOMIC); |
164 | if (!skb) | 166 | if (!skb) |
165 | PRINTR("ipt_ULOG: can't even allocate %ub\n", size); | 167 | PRINTR("ipt_ULOG: can't even allocate %ub\n", |
168 | size); | ||
169 | } | ||
166 | } | 170 | } |
167 | 171 | ||
168 | return skb; | 172 | return skb; |