Commit e02f7d16 authored by Patrick McHardy's avatar Patrick McHardy Committed by David S. Miller

[NETFILTER]: nf_queue: don't copy registered rerouter data

Use the registered data structure instead of copying it.
Signed-off-by: default avatarPatrick McHardy <kaber@trash.net>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 752c1f4c
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
* for queueing and must reinject all packets it receives, no matter what. * for queueing and must reinject all packets it receives, no matter what.
*/ */
static struct nf_queue_handler *queue_handler[NPROTO]; static struct nf_queue_handler *queue_handler[NPROTO];
static struct nf_queue_rerouter *queue_rerouter; static struct nf_queue_rerouter *queue_rerouter[NPROTO];
static DEFINE_RWLOCK(queue_handler_lock); static DEFINE_RWLOCK(queue_handler_lock);
...@@ -64,7 +64,7 @@ int nf_register_queue_rerouter(int pf, struct nf_queue_rerouter *rer) ...@@ -64,7 +64,7 @@ int nf_register_queue_rerouter(int pf, struct nf_queue_rerouter *rer)
return -EINVAL; return -EINVAL;
write_lock_bh(&queue_handler_lock); write_lock_bh(&queue_handler_lock);
memcpy(&queue_rerouter[pf], rer, sizeof(queue_rerouter[pf])); queue_rerouter[pf] = rer;
write_unlock_bh(&queue_handler_lock); write_unlock_bh(&queue_handler_lock);
return 0; return 0;
...@@ -77,7 +77,7 @@ int nf_unregister_queue_rerouter(int pf) ...@@ -77,7 +77,7 @@ int nf_unregister_queue_rerouter(int pf)
return -EINVAL; return -EINVAL;
write_lock_bh(&queue_handler_lock); write_lock_bh(&queue_handler_lock);
memset(&queue_rerouter[pf], 0, sizeof(queue_rerouter[pf])); queue_rerouter[pf] = NULL;
write_unlock_bh(&queue_handler_lock); write_unlock_bh(&queue_handler_lock);
return 0; return 0;
} }
...@@ -123,7 +123,7 @@ int nf_queue(struct sk_buff **skb, ...@@ -123,7 +123,7 @@ int nf_queue(struct sk_buff **skb,
return 1; return 1;
} }
info = kmalloc(sizeof(*info)+queue_rerouter[pf].rer_size, GFP_ATOMIC); info = kmalloc(sizeof(*info)+queue_rerouter[pf]->rer_size, GFP_ATOMIC);
if (!info) { if (!info) {
if (net_ratelimit()) if (net_ratelimit())
printk(KERN_ERR "OOM queueing packet %p\n", printk(KERN_ERR "OOM queueing packet %p\n",
...@@ -155,14 +155,14 @@ int nf_queue(struct sk_buff **skb, ...@@ -155,14 +155,14 @@ int nf_queue(struct sk_buff **skb,
if (physoutdev) dev_hold(physoutdev); if (physoutdev) dev_hold(physoutdev);
} }
#endif #endif
if (queue_rerouter[pf].save) if (queue_rerouter[pf]->save)
queue_rerouter[pf].save(*skb, info); queue_rerouter[pf]->save(*skb, info);
status = queue_handler[pf]->outfn(*skb, info, queuenum, status = queue_handler[pf]->outfn(*skb, info, queuenum,
queue_handler[pf]->data); queue_handler[pf]->data);
if (status >= 0 && queue_rerouter[pf].reroute) if (status >= 0 && queue_rerouter[pf]->reroute)
status = queue_rerouter[pf].reroute(skb, info); status = queue_rerouter[pf]->reroute(skb, info);
read_unlock(&queue_handler_lock); read_unlock(&queue_handler_lock);
...@@ -322,22 +322,12 @@ int __init netfilter_queue_init(void) ...@@ -322,22 +322,12 @@ int __init netfilter_queue_init(void)
{ {
#ifdef CONFIG_PROC_FS #ifdef CONFIG_PROC_FS
struct proc_dir_entry *pde; struct proc_dir_entry *pde;
#endif
queue_rerouter = kmalloc(NPROTO * sizeof(struct nf_queue_rerouter),
GFP_KERNEL);
if (!queue_rerouter)
return -ENOMEM;
#ifdef CONFIG_PROC_FS
pde = create_proc_entry("nf_queue", S_IRUGO, proc_net_netfilter); pde = create_proc_entry("nf_queue", S_IRUGO, proc_net_netfilter);
if (!pde) { if (!pde)
kfree(queue_rerouter);
return -1; return -1;
}
pde->proc_fops = &nfqueue_file_ops; pde->proc_fops = &nfqueue_file_ops;
#endif #endif
memset(queue_rerouter, 0, NPROTO * sizeof(struct nf_queue_rerouter));
return 0; return 0;
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment