From 5fbc01b991de87f6b70dcee711ab475599dcbde8 Mon Sep 17 00:00:00 2001 From: Jan Engelhardt Date: Tue, 1 Apr 2008 08:15:01 +0200 Subject: [PATCH] compat: add check for pskb relocation The Xtables-addons compat layer does not support pskb relocation (result of possible memory allocation in kernels before 2.6.24) and we just assume it does not happen. Add a check to warn if relocation did happen and packet loss is to be expected. --- extensions/compat_xtables.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/extensions/compat_xtables.c b/extensions/compat_xtables.c index 3952295..a2e3d81 100644 --- a/extensions/compat_xtables.c +++ b/extensions/compat_xtables.c @@ -12,6 +12,14 @@ #include "compat_skbuff.h" #include "compat_xtnu.h" +static inline int unable(const char *cause) +{ + if (net_ratelimit()) + printk(KERN_ERR KBUILD_MODNAME + ": compat layer limits reached (%s) - dropping packets\n", cause); + return -1; +} + #if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 22) static int xtnu_match_run(const struct sk_buff *skb, const struct net_device *in, const struct net_device *out, @@ -288,11 +296,17 @@ EXPORT_SYMBOL_GPL(xtnu_request_find_match); #if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 23) int xtnu_ip_route_me_harder(struct sk_buff *skb, unsigned int addr_type) { + struct sk_buff *nskb = skb; + int ret; + #if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 18) - return ip_route_me_harder(&skb); + ret = ip_route_me_harder(&skb); #elif LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 23) - return ip_route_me_harder(&skb, addr_type); + ret = ip_route_me_harder(&nskb, addr_type); #endif + if (nskb != skb) + return unable(__func__); + return ret; } EXPORT_SYMBOL_GPL(xtnu_ip_route_me_harder); #endif