Merge tag 'v3.10.80' into update
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / net / socket.c
index 53b6e411f7a4202eed2f755754202716fa6ff525..354969e1fecd1012b6e60253a664535610af5f79 100644 (file)
@@ -97,6 +97,7 @@
 #include <net/cls_cgroup.h>
 
 #include <net/sock.h>
+#include <net/inet_sock.h>
 #include <linux/netfilter.h>
 
 #include <linux/if_tun.h>
@@ -587,7 +588,7 @@ void sock_release(struct socket *sock)
        }
 
        if (rcu_dereference_protected(sock->wq, 1)->fasync_list)
-               printk(KERN_ERR "sock_release: fasync list not empty!\n");
+               printk(KERN_ERR "[mtk_net][socket]sock_release: fasync list not empty!\n");
 
        if (test_bit(SOCK_EXTERNALLY_ALLOCATED, &sock->flags))
                return;
@@ -1161,7 +1162,22 @@ static int sock_mmap(struct file *file, struct vm_area_struct *vma)
 
 static int sock_close(struct inode *inode, struct file *filp)
 {
+       /*
+        *      It was possible the inode is NULL we were
+        *      closing an unfinished socket.
+        */
+
+       if (!inode) {
+               #ifdef CONFIG_MTK_NET_LOGGING 
+               printk(KERN_DEBUG "[mtk_net][socket]sock_close: NULL inode\n");
+               #endif
+               return 0;
+       }
+    #ifdef CONFIG_MTK_NET_LOGGING 
+       printk(KERN_INFO "[mtk_net][socekt]socket_close[%lu] \n",inode->i_ino); 
+       #endif
        sock_release(SOCKET_I(inode));
+       
        return 0;
 }
 
@@ -1257,8 +1273,10 @@ int __sock_create(struct net *net, int family, int type, int protocol,
                static int warned;
                if (!warned) {
                        warned = 1;
-                       printk(KERN_INFO "%s uses obsolete (PF_INET,SOCK_PACKET)\n",
+                       #ifdef CONFIG_MTK_NET_LOGGING 
+                       printk(KERN_INFO "[mtk_net][socket]%s uses obsolete (PF_INET,SOCK_PACKET)\n",
                               current->comm);
+                       #endif
                }
                family = PF_PACKET;
        }
@@ -1388,6 +1406,19 @@ SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol)
 
 out:
        /* It may be already another descriptor 8) Not kernel problem. */
+
+       if((retval >= 0)&& sock && SOCK_INODE(sock) )
+       {
+          #ifdef CONFIG_MTK_NET_LOGGING 
+          printk(KERN_INFO "[mtk_net][socket]socket_create[%lu]:fd=%d \n",SOCK_INODE(sock)->i_ino,retval);
+          #endif               
+       }
+        else
+        {
+               #ifdef CONFIG_MTK_NET_LOGGING   
+          printk(KERN_INFO "[mtk_net][socket]socket_create:fd=%d \n",retval); 
+          #endif
+        }
        return retval;
 
 out_release:
@@ -1398,7 +1429,6 @@ out_release:
 /*
  *     Create a pair of connected sockets.
  */
-
 SYSCALL_DEFINE4(socketpair, int, family, int, type, int, protocol,
                int __user *, usockvec)
 {
@@ -1473,10 +1503,22 @@ SYSCALL_DEFINE4(socketpair, int, family, int, type, int, protocol,
        if (!err)
                err = put_user(fd2, &usockvec[1]);
        if (!err)
+        {
+            if(sock1 && SOCK_INODE(sock1) && sock2&& SOCK_INODE(sock2) )
+            {
+                       #ifdef CONFIG_MTK_NET_LOGGING 
+                   printk(KERN_INFO "[mtk_net][socket]socketpair:fd1[%lu]=%d, fd2[%lu]=%d \n", SOCK_INODE(sock1)->i_ino,fd1,SOCK_INODE(sock2)->i_ino,fd2);
+                   #endif             
+            }
+         
                return 0;
+        }
 
        sys_close(fd2);
        sys_close(fd1);
+       #ifdef CONFIG_MTK_NET_LOGGING 
+       printk(KERN_INFO "[mtk_net][socket]socketpair fail1: %d \n", err);
+       #endif
        return err;
 
 out_release_both:
@@ -1484,6 +1526,9 @@ out_release_both:
 out_release_1:
        sock_release(sock1);
 out:
+       #ifdef CONFIG_MTK_NET_LOGGING 
+    printk(KERN_INFO "[mtk_net][socket]socketpair fail2: %d \n", err);
+    #endif
        return err;
 }
 
@@ -1504,6 +1549,7 @@ SYSCALL_DEFINE3(bind, int, fd, struct sockaddr __user *, umyaddr, int, addrlen)
        sock = sockfd_lookup_light(fd, &err, &fput_needed);
        if (sock) {
                err = move_addr_to_kernel(umyaddr, addrlen, &address);
+
                if (err >= 0) {
                        err = security_socket_bind(sock,
                                                   (struct sockaddr *)&address,
@@ -1512,6 +1558,13 @@ SYSCALL_DEFINE3(bind, int, fd, struct sockaddr __user *, umyaddr, int, addrlen)
                                err = sock->ops->bind(sock,
                                                      (struct sockaddr *)
                                                      &address, addrlen);
+                       
+      #ifdef CONFIG_MTK_NET_LOGGING 
+                   if((((struct sockaddr_in *)&address)->sin_family) != AF_UNIX)
+                       {
+                                printk(KERN_WARNING "[mtk_net][socket] bind addr->sin_port:%d,err:%d \n",htons(((struct sockaddr_in *)&address)->sin_port),err);
+          }
+        #endif               
                }
                fput_light(sock->file, fput_needed);
        }
@@ -1556,7 +1609,6 @@ SYSCALL_DEFINE2(listen, int, fd, int, backlog)
  *     status to recvmsg. We need to add that support in a way thats
  *     clean when we restucture accept also.
  */
-
 SYSCALL_DEFINE4(accept4, int, fd, struct sockaddr __user *, upeer_sockaddr,
                int __user *, upeer_addrlen, int, flags)
 {
@@ -1631,6 +1683,13 @@ SYSCALL_DEFINE4(accept4, int, fd, struct sockaddr __user *, upeer_sockaddr,
 out_put:
        fput_light(sock->file, fput_needed);
 out:
+        if( (err>=0)&& newsock && SOCK_INODE(newsock) )
+      {
+               #ifdef CONFIG_MTK_NET_LOGGING 
+               printk(KERN_INFO "[mtk_net][socket]socket_accept:fd=%d \n",err);
+               #endif
+           }  
+           
        return err;
 out_fd:
        fput(newfile);
@@ -1764,6 +1823,8 @@ SYSCALL_DEFINE6(sendto, int, fd, void __user *, buff, size_t, len,
 
        if (len > INT_MAX)
                len = INT_MAX;
+       if (unlikely(!access_ok(VERIFY_READ, buff, len)))
+               return -EFAULT;
        sock = sockfd_lookup_light(fd, &err, &fput_needed);
        if (!sock)
                goto out;
@@ -1823,6 +1884,8 @@ SYSCALL_DEFINE6(recvfrom, int, fd, void __user *, ubuf, size_t, size,
 
        if (size > INT_MAX)
                size = INT_MAX;
+       if (unlikely(!access_ok(VERIFY_WRITE, ubuf, size)))
+               return -EFAULT;
        sock = sockfd_lookup_light(fd, &err, &fput_needed);
        if (!sock)
                goto out;
@@ -2381,13 +2444,14 @@ int __sys_recvmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen,
                        break;
        }
 
-out_put:
-       fput_light(sock->file, fput_needed);
-
        if (err == 0)
-               return datagrams;
+               goto out_put;           
+
+       if (datagrams == 0) {
+               datagrams = err;
+               goto out_put;
+       }
 
-       if (datagrams != 0) {
                /*
                 * We may return less entries than requested (vlen) if the
                 * sock is non block and there aren't enough datagrams...
@@ -2402,10 +2466,10 @@ out_put:
                        sock->sk->sk_err = -err;
                }
 
-               return datagrams;
-       }
+out_put:
+       fput_light(sock->file, fput_needed);
 
-       return err;
+       return datagrams;
 }
 
 SYSCALL_DEFINE5(recvmmsg, int, fd, struct mmsghdr __user *, mmsg,
@@ -2574,7 +2638,7 @@ int sock_register(const struct net_proto_family *ops)
        int err;
 
        if (ops->family >= NPROTO) {
-               printk(KERN_CRIT "protocol %d >= NPROTO(%d)\n", ops->family,
+               printk(KERN_CRIT "[mtk_net][sock]protocol %d >= NPROTO(%d)\n", ops->family,
                       NPROTO);
                return -ENOBUFS;
        }
@@ -2588,8 +2652,9 @@ int sock_register(const struct net_proto_family *ops)
                err = 0;
        }
        spin_unlock(&net_family_lock);
-
-       printk(KERN_INFO "NET: Registered protocol family %d\n", ops->family);
+    #ifdef CONFIG_MTK_NET_LOGGING 
+       printk(KERN_INFO "[mtk_net][socekt]NET: Registered protocol family %d\n", ops->family);
+       #endif
        return err;
 }
 EXPORT_SYMBOL(sock_register);
@@ -2616,8 +2681,9 @@ void sock_unregister(int family)
        spin_unlock(&net_family_lock);
 
        synchronize_rcu();
-
-       printk(KERN_INFO "NET: Unregistered protocol family %d\n", family);
+    #ifdef CONFIG_MTK_NET_LOGGING 
+       printk(KERN_INFO "[mtk_net][socket]NET: Unregistered protocol family %d\n", family);
+       #endif
 }
 EXPORT_SYMBOL(sock_unregister);