ipc/mqueue: improve exception handling in do_mq_notify()
[sfrench/cifs-2.6.git] / ipc / mqueue.c
index b02eb842b42e8e9579c010dcf06bc9f7c1a84044..3d920ff15c80dd26532c72c0c3dea77ef6557a9e 100644 (file)
@@ -1240,15 +1240,14 @@ static int do_mq_notify(mqd_t mqdes, const struct sigevent *notification)
 
                        /* create the notify skb */
                        nc = alloc_skb(NOTIFY_COOKIE_LEN, GFP_KERNEL);
-                       if (!nc) {
-                               ret = -ENOMEM;
-                               goto out;
-                       }
+                       if (!nc)
+                               return -ENOMEM;
+
                        if (copy_from_user(nc->data,
                                        notification->sigev_value.sival_ptr,
                                        NOTIFY_COOKIE_LEN)) {
                                ret = -EFAULT;
-                               goto out;
+                               goto free_skb;
                        }
 
                        /* TODO: add a header? */
@@ -1264,8 +1263,7 @@ retry:
                        fdput(f);
                        if (IS_ERR(sock)) {
                                ret = PTR_ERR(sock);
-                               sock = NULL;
-                               goto out;
+                               goto free_skb;
                        }
 
                        timeo = MAX_SCHEDULE_TIMEOUT;
@@ -1274,11 +1272,8 @@ retry:
                                sock = NULL;
                                goto retry;
                        }
-                       if (ret) {
-                               sock = NULL;
-                               nc = NULL;
-                               goto out;
-                       }
+                       if (ret)
+                               return ret;
                }
        }
 
@@ -1334,6 +1329,7 @@ out:
        if (sock)
                netlink_detachskb(sock, nc);
        else
+free_skb:
                dev_kfree_skb(nc);
 
        return ret;