From c40a98c1d6ba9c669a04ed49455d1dffec893e28 Mon Sep 17 00:00:00 2001 From: Petr Baudis Date: Thu, 1 Mar 2012 04:03:12 +0100 Subject: [PATCH] compctld recvmsg(): Allocate space for cmsg --- compctl.c | 7 ++++--- compctld.c | 16 ++++++++++++---- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/compctl.c b/compctl.c index ddeccc2..dd73291 100644 --- a/compctl.c +++ b/compctl.c @@ -30,9 +30,10 @@ connectd(void) }; char cbuf[CMSG_SPACE(sizeof(cred))]; - struct msghdr msg = {0}; - msg.msg_control = cbuf; - msg.msg_controllen = sizeof(cbuf); + struct msghdr msg = { + .msg_control = cbuf, + .msg_controllen = sizeof(cbuf), + }; struct cmsghdr *cmsg = CMSG_FIRSTHDR(&msg); cmsg->cmsg_level = SOL_SOCKET; diff --git a/compctld.c b/compctld.c index ad1283f..6ca9dfd 100644 --- a/compctld.c +++ b/compctld.c @@ -121,19 +121,27 @@ main(int argc, char *argv[]) /* Decode the message with credentials. */ - struct msghdr msg; + struct ucred *cred; + char cbuf[CMSG_SPACE(sizeof(*cred))]; + struct msghdr msg = { + .msg_control = cbuf, + .msg_controllen = sizeof(cbuf), + }; char *errmsg; - if (recvmsg(fd, &msg, MSG_WAITALL) <= 0) { +recvagain: + if (recvmsg(fd, &msg, MSG_WAITALL) < 0) { + if (errno == EAGAIN) + goto recvagain; errmsg = "recvmsg"; sockerror: logperror(errmsg); close(fd); continue; } - struct ucred *cred; struct cmsghdr *cmsg; cmsg = CMSG_FIRSTHDR(&msg); - if (cmsg == NULL || cmsg->cmsg_len != CMSG_LEN(sizeof(struct ucred))) { + if (cmsg == NULL || cmsg->cmsg_len != CMSG_LEN(sizeof(*cred))) { + syslog(LOG_INFO, "want %lu", CMSG_LEN(sizeof(*cred))); errmsg = "cmsg"; goto sockerror; } -- 2.11.4.GIT