diff options
Diffstat (limited to 'net/core/sock.c')
-rw-r--r-- | net/core/sock.c | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/net/core/sock.c b/net/core/sock.c index db8335ad755..0229d5566a4 100644 --- a/net/core/sock.c +++ b/net/core/sock.c | |||
@@ -915,11 +915,15 @@ int sock_getsockopt(struct socket *sock, int level, int optname, | |||
915 | break; | 915 | break; |
916 | 916 | ||
917 | case SO_PEERCRED: | 917 | case SO_PEERCRED: |
918 | if (len > sizeof(sk->sk_peercred)) | 918 | { |
919 | len = sizeof(sk->sk_peercred); | 919 | struct ucred peercred; |
920 | if (copy_to_user(optval, &sk->sk_peercred, len)) | 920 | if (len > sizeof(peercred)) |
921 | len = sizeof(peercred); | ||
922 | cred_to_ucred(sk->sk_peer_pid, sk->sk_peer_cred, &peercred); | ||
923 | if (copy_to_user(optval, &peercred, len)) | ||
921 | return -EFAULT; | 924 | return -EFAULT; |
922 | goto lenout; | 925 | goto lenout; |
926 | } | ||
923 | 927 | ||
924 | case SO_PEERNAME: | 928 | case SO_PEERNAME: |
925 | { | 929 | { |
@@ -1133,6 +1137,9 @@ static void __sk_free(struct sock *sk) | |||
1133 | printk(KERN_DEBUG "%s: optmem leakage (%d bytes) detected.\n", | 1137 | printk(KERN_DEBUG "%s: optmem leakage (%d bytes) detected.\n", |
1134 | __func__, atomic_read(&sk->sk_omem_alloc)); | 1138 | __func__, atomic_read(&sk->sk_omem_alloc)); |
1135 | 1139 | ||
1140 | if (sk->sk_peer_cred) | ||
1141 | put_cred(sk->sk_peer_cred); | ||
1142 | put_pid(sk->sk_peer_pid); | ||
1136 | put_net(sock_net(sk)); | 1143 | put_net(sock_net(sk)); |
1137 | sk_prot_free(sk->sk_prot_creator, sk); | 1144 | sk_prot_free(sk->sk_prot_creator, sk); |
1138 | } | 1145 | } |
@@ -1968,9 +1975,8 @@ void sock_init_data(struct socket *sock, struct sock *sk) | |||
1968 | sk->sk_sndmsg_page = NULL; | 1975 | sk->sk_sndmsg_page = NULL; |
1969 | sk->sk_sndmsg_off = 0; | 1976 | sk->sk_sndmsg_off = 0; |
1970 | 1977 | ||
1971 | sk->sk_peercred.pid = 0; | 1978 | sk->sk_peer_pid = NULL; |
1972 | sk->sk_peercred.uid = -1; | 1979 | sk->sk_peer_cred = NULL; |
1973 | sk->sk_peercred.gid = -1; | ||
1974 | sk->sk_write_pending = 0; | 1980 | sk->sk_write_pending = 0; |
1975 | sk->sk_rcvlowat = 1; | 1981 | sk->sk_rcvlowat = 1; |
1976 | sk->sk_rcvtimeo = MAX_SCHEDULE_TIMEOUT; | 1982 | sk->sk_rcvtimeo = MAX_SCHEDULE_TIMEOUT; |