diff options
Diffstat (limited to 'net')
| -rw-r--r-- | net/core/scm.c | 17 | ||||
| -rw-r--r-- | net/netlink/af_netlink.c | 2 | 
2 files changed, 12 insertions, 7 deletions
diff --git a/net/core/scm.c b/net/core/scm.c index 6ab491d6c26..9c1c63da3ca 100644 --- a/net/core/scm.c +++ b/net/core/scm.c @@ -155,19 +155,21 @@ int __scm_send(struct socket *sock, struct msghdr *msg, struct scm_cookie *p)  			break;  		case SCM_CREDENTIALS:  		{ +			struct ucred creds;  			kuid_t uid;  			kgid_t gid;  			if (cmsg->cmsg_len != CMSG_LEN(sizeof(struct ucred)))  				goto error; -			memcpy(&p->creds, CMSG_DATA(cmsg), sizeof(struct ucred)); -			err = scm_check_creds(&p->creds); +			memcpy(&creds, CMSG_DATA(cmsg), sizeof(struct ucred)); +			err = scm_check_creds(&creds);  			if (err)  				goto error; -			if (!p->pid || pid_vnr(p->pid) != p->creds.pid) { +			p->creds.pid = creds.pid; +			if (!p->pid || pid_vnr(p->pid) != creds.pid) {  				struct pid *pid;  				err = -ESRCH; -				pid = find_get_pid(p->creds.pid); +				pid = find_get_pid(creds.pid);  				if (!pid)  					goto error;  				put_pid(p->pid); @@ -175,11 +177,14 @@ int __scm_send(struct socket *sock, struct msghdr *msg, struct scm_cookie *p)  			}  			err = -EINVAL; -			uid = make_kuid(current_user_ns(), p->creds.uid); -			gid = make_kgid(current_user_ns(), p->creds.gid); +			uid = make_kuid(current_user_ns(), creds.uid); +			gid = make_kgid(current_user_ns(), creds.gid);  			if (!uid_valid(uid) || !gid_valid(gid))  				goto error; +			p->creds.uid = uid; +			p->creds.gid = gid; +  			if (!p->cred ||  			    !uid_eq(p->cred->euid, uid) ||  			    !gid_eq(p->cred->egid, gid)) { diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index 38211991716..f530b1ca177 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c @@ -1399,7 +1399,7 @@ static int netlink_sendmsg(struct kiocb *kiocb, struct socket *sock,  	NETLINK_CB(skb).pid	= nlk->pid;  	NETLINK_CB(skb).dst_group = dst_group; -	memcpy(NETLINK_CREDS(skb), &siocb->scm->creds, sizeof(struct ucred)); +	NETLINK_CB(skb).creds	= siocb->scm->creds;  	err = -EFAULT;  	if (memcpy_fromiovec(skb_put(skb, len), msg->msg_iov, len)) {  |