[NETFILTER]: nfnetlink_{queue,log}: return proper error codes in instance_create
authorPatrick McHardy <kaber@trash.net>
Tue, 18 Dec 2007 06:41:21 +0000 (22:41 -0800)
committerDavid S. Miller <davem@davemloft.net>
Mon, 28 Jan 2008 22:59:02 +0000 (14:59 -0800)
Currently we return EINVAL for "instance exists", "allocation failed" and
"module unloaded below us", which is completely inapproriate.

Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/netfilter/nfnetlink_log.c
net/netfilter/nfnetlink_queue.c

index c12e1d1bd00e1a8874db401a27f89eabf38beb56..ac58dc9d72476cd335907b8230ff2680bdb18dd4 100644 (file)
@@ -128,19 +128,23 @@ static struct nfulnl_instance *
 instance_create(u_int16_t group_num, int pid)
 {
        struct nfulnl_instance *inst;
+       int err;
 
        write_lock_bh(&instances_lock);
        if (__instance_lookup(group_num)) {
-               inst = NULL;
+               err = -EEXIST;
                goto out_unlock;
        }
 
        inst = kzalloc(sizeof(*inst), GFP_ATOMIC);
-       if (!inst)
+       if (!inst) {
+               err = -ENOMEM;
                goto out_unlock;
+       }
 
        if (!try_module_get(THIS_MODULE)) {
                kfree(inst);
+               err = -EAGAIN;
                goto out_unlock;
        }
 
@@ -169,7 +173,7 @@ instance_create(u_int16_t group_num, int pid)
 
 out_unlock:
        write_unlock_bh(&instances_lock);
-       return NULL;
+       return ERR_PTR(err);
 }
 
 static void __nfulnl_flush(struct nfulnl_instance *inst);
@@ -731,8 +735,8 @@ nfulnl_recv_config(struct sock *ctnl, struct sk_buff *skb,
 
                        inst = instance_create(group_num,
                                               NETLINK_CB(skb).pid);
-                       if (!inst) {
-                               ret = -EINVAL;
+                       if (IS_ERR(inst)) {
+                               ret = PTR_ERR(inst);
                                goto out;
                        }
                        break;
index 370f0af50f487338a91e385fce307843bda7c785..51476f82bb54733af8f997d782284bbeafa1eae2 100644 (file)
@@ -89,16 +89,21 @@ instance_lookup(u_int16_t queue_num)
 static struct nfqnl_instance *
 instance_create(u_int16_t queue_num, int pid)
 {
-       struct nfqnl_instance *inst = NULL;
+       struct nfqnl_instance *inst;
        unsigned int h;
+       int err;
 
        spin_lock(&instances_lock);
-       if (instance_lookup(queue_num))
+       if (instance_lookup(queue_num)) {
+               err = -EEXIST;
                goto out_unlock;
+       }
 
        inst = kzalloc(sizeof(*inst), GFP_ATOMIC);
-       if (!inst)
+       if (!inst) {
+               err = -ENOMEM;
                goto out_unlock;
+       }
 
        inst->queue_num = queue_num;
        inst->peer_pid = pid;
@@ -109,8 +114,10 @@ instance_create(u_int16_t queue_num, int pid)
        INIT_LIST_HEAD(&inst->queue_list);
        INIT_RCU_HEAD(&inst->rcu);
 
-       if (!try_module_get(THIS_MODULE))
+       if (!try_module_get(THIS_MODULE)) {
+               err = -EAGAIN;
                goto out_free;
+       }
 
        h = instance_hashfn(queue_num);
        hlist_add_head_rcu(&inst->hlist, &instance_table[h]);
@@ -123,7 +130,7 @@ out_free:
        kfree(inst);
 out_unlock:
        spin_unlock(&instances_lock);
-       return NULL;
+       return ERR_PTR(err);
 }
 
 static void nfqnl_flush(struct nfqnl_instance *queue, nfqnl_cmpfn cmpfn,
@@ -724,8 +731,8 @@ nfqnl_recv_config(struct sock *ctnl, struct sk_buff *skb,
                                goto err_out_unlock;
                        }
                        queue = instance_create(queue_num, NETLINK_CB(skb).pid);
-                       if (!queue) {
-                               ret = -EINVAL;
+                       if (IS_ERR(queue)) {
+                               ret = PTR_ERR(queue);
                                goto err_out_unlock;
                        }
                        break;