From 20a707586280cf57d97e56f55fc190cf4dcde180 Mon Sep 17 00:00:00 2001 From: Jeremy Fitzhardinge Date: Wed, 5 Sep 2012 16:28:36 -0700 Subject: [PATCH] ipc_us: slightly more robust cmsg handling Cope with multiple cmsg structures in the received msg. --- lib/ipc_us.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/lib/ipc_us.c b/lib/ipc_us.c index 3549b9e6f..48b451d1f 100644 --- a/lib/ipc_us.c +++ b/lib/ipc_us.c @@ -856,16 +856,19 @@ qb_ipcs_uc_recv_and_auth(int32_t sock, void *msg, size_t len, */ { struct ucred cred; - struct cmsghdr *cmsg = CMSG_FIRSTHDR(&msg_recv); - assert(cmsg != NULL); - if (CMSG_DATA(cmsg)) { + struct cmsghdr *cmsg; + + res = -EINVAL; + for (cmsg = CMSG_FIRSTHDR(&msg_recv); cmsg != NULL; cmsg = CMSG_NXTHDR(&msg_recv, cmsg)) { + if (cmsg->cmsg_type != SCM_CREDENTIALS) + continue; + memcpy(&cred, CMSG_DATA(cmsg), sizeof(struct ucred)); res = 0; ugp->pid = cred.pid; ugp->uid = cred.uid; ugp->gid = cred.gid; - } else { - res = -EINVAL; + break; } } #else /* no credentials */