Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
authorDavid S. Miller <davem@davemloft.net>
Fri, 7 Jun 2013 06:39:26 +0000 (23:39 -0700)
committerDavid S. Miller <davem@davemloft.net>
Fri, 7 Jun 2013 06:39:26 +0000 (23:39 -0700)
Merge 'net' into 'net-next' to get the MSG_CMSG_COMPAT
regression fix.

Signed-off-by: David S. Miller <davem@davemloft.net>
1  2 
net/socket.c

diff --combined net/socket.c
@@@ -1956,7 -1956,7 +1956,7 @@@ struct used_address 
        unsigned int name_len;
  };
  
- static int __sys_sendmsg(struct socket *sock, struct msghdr __user *msg,
+ static int ___sys_sendmsg(struct socket *sock, struct msghdr __user *msg,
                         struct msghdr *msg_sys, unsigned int flags,
                         struct used_address *used_address)
  {
   *    BSD sendmsg interface
   */
  
SYSCALL_DEFINE3(sendmsg, int, fd, struct msghdr __user *, msg, unsigned int, flags)
long __sys_sendmsg(int fd, struct msghdr __user *msg, unsigned flags)
  {
        int fput_needed, err;
        struct msghdr msg_sys;
        struct socket *sock;
  
-       if (flags & MSG_CMSG_COMPAT)
-               return -EINVAL;
        sock = sockfd_lookup_light(fd, &err, &fput_needed);
        if (!sock)
                goto out;
  
-       err = __sys_sendmsg(sock, msg, &msg_sys, flags, NULL);
+       err = ___sys_sendmsg(sock, msg, &msg_sys, flags, NULL);
  
        fput_light(sock->file, fput_needed);
  out:
        return err;
  }
  
+ SYSCALL_DEFINE3(sendmsg, int, fd, struct msghdr __user *, msg, unsigned int, flags)
+ {
+       if (flags & MSG_CMSG_COMPAT)
+               return -EINVAL;
+       return __sys_sendmsg(fd, msg, flags);
+ }
  /*
   *    Linux sendmmsg interface
   */
@@@ -2121,15 -2125,16 +2125,16 @@@ int __sys_sendmmsg(int fd, struct mmsgh
  
        while (datagrams < vlen) {
                if (MSG_CMSG_COMPAT & flags) {
-                       err = __sys_sendmsg(sock, (struct msghdr __user *)compat_entry,
-                                           &msg_sys, flags, &used_address);
+                       err = ___sys_sendmsg(sock, (struct msghdr __user *)compat_entry,
+                                            &msg_sys, flags, &used_address);
                        if (err < 0)
                                break;
                        err = __put_user(err, &compat_entry->msg_len);
                        ++compat_entry;
                } else {
-                       err = __sys_sendmsg(sock, (struct msghdr __user *)entry,
-                                           &msg_sys, flags, &used_address);
+                       err = ___sys_sendmsg(sock,
+                                            (struct msghdr __user *)entry,
+                                            &msg_sys, flags, &used_address);
                        if (err < 0)
                                break;
                        err = put_user(err, &entry->msg_len);
@@@ -2158,7 -2163,7 +2163,7 @@@ SYSCALL_DEFINE4(sendmmsg, int, fd, stru
        return __sys_sendmmsg(fd, mmsg, vlen, flags);
  }
  
- static int __sys_recvmsg(struct socket *sock, struct msghdr __user *msg,
+ static int ___sys_recvmsg(struct socket *sock, struct msghdr __user *msg,
                         struct msghdr *msg_sys, unsigned int flags, int nosec)
  {
        struct compat_msghdr __user *msg_compat =
   *    BSD recvmsg interface
   */
  
- SYSCALL_DEFINE3(recvmsg, int, fd, struct msghdr __user *, msg,
-               unsigned int, flags)
+ long __sys_recvmsg(int fd, struct msghdr __user *msg, unsigned flags)
  {
        int fput_needed, err;
        struct msghdr msg_sys;
        struct socket *sock;
  
-       if (flags & MSG_CMSG_COMPAT)
-               return -EINVAL;
        sock = sockfd_lookup_light(fd, &err, &fput_needed);
        if (!sock)
                goto out;
  
-       err = __sys_recvmsg(sock, msg, &msg_sys, flags, 0);
+       err = ___sys_recvmsg(sock, msg, &msg_sys, flags, 0);
  
        fput_light(sock->file, fput_needed);
  out:
        return err;
  }
  
+ SYSCALL_DEFINE3(recvmsg, int, fd, struct msghdr __user *, msg,
+               unsigned int, flags)
+ {
+       if (flags & MSG_CMSG_COMPAT)
+               return -EINVAL;
+       return __sys_recvmsg(fd, msg, flags);
+ }
  /*
   *     Linux recvmmsg interface
   */
@@@ -2308,17 -2317,18 +2317,18 @@@ int __sys_recvmmsg(int fd, struct mmsgh
                 * No need to ask LSM for more than the first datagram.
                 */
                if (MSG_CMSG_COMPAT & flags) {
-                       err = __sys_recvmsg(sock, (struct msghdr __user *)compat_entry,
-                                           &msg_sys, flags & ~MSG_WAITFORONE,
-                                           datagrams);
+                       err = ___sys_recvmsg(sock, (struct msghdr __user *)compat_entry,
+                                            &msg_sys, flags & ~MSG_WAITFORONE,
+                                            datagrams);
                        if (err < 0)
                                break;
                        err = __put_user(err, &compat_entry->msg_len);
                        ++compat_entry;
                } else {
-                       err = __sys_recvmsg(sock, (struct msghdr __user *)entry,
-                                           &msg_sys, flags & ~MSG_WAITFORONE,
-                                           datagrams);
+                       err = ___sys_recvmsg(sock,
+                                            (struct msghdr __user *)entry,
+                                            &msg_sys, flags & ~MSG_WAITFORONE,
+                                            datagrams);
                        if (err < 0)
                                break;
                        err = put_user(err, &entry->msg_len);
@@@ -2505,31 -2515,15 +2515,15 @@@ SYSCALL_DEFINE2(socketcall, int, call, 
                                   (int __user *)a[4]);
                break;
        case SYS_SENDMSG:
-               if (a[2] & MSG_CMSG_COMPAT) {
-                       err = -EINVAL;
-                       break;
-               }
                err = sys_sendmsg(a0, (struct msghdr __user *)a1, a[2]);
                break;
        case SYS_SENDMMSG:
-               if (a[3] & MSG_CMSG_COMPAT) {
-                       err = -EINVAL;
-                       break;
-               }
                err = sys_sendmmsg(a0, (struct mmsghdr __user *)a1, a[2], a[3]);
                break;
        case SYS_RECVMSG:
-               if (a[2] & MSG_CMSG_COMPAT) {
-                       err = -EINVAL;
-                       break;
-               }
                err = sys_recvmsg(a0, (struct msghdr __user *)a1, a[2]);
                break;
        case SYS_RECVMMSG:
-               if (a[3] & MSG_CMSG_COMPAT) {
-                       err = -EINVAL;
-                       break;
-               }
                err = sys_recvmmsg(a0, (struct mmsghdr __user *)a1, a[2], a[3],
                                   (struct timespec __user *)a[4]);
                break;
@@@ -2641,9 -2635,7 +2635,9 @@@ static int __init sock_init(void
         */
  
  #ifdef CONFIG_NETFILTER
 -      netfilter_init();
 +      err = netfilter_init();
 +      if (err)
 +              goto out;
  #endif
  
  #ifdef CONFIG_NETWORK_PHY_TIMESTAMPING