diff options
| author | Pavan Deolasee | 2014-12-17 07:12:11 +0000 |
|---|---|---|
| committer | Pavan Deolasee | 2015-04-15 05:46:43 +0000 |
| commit | 249ce6794ba66cedc29be7ab1b42b28b55fbb574 (patch) | |
| tree | c93e2cd1adfdedf3824f5147dedc9ab7ad6c10f1 | |
| parent | 72a588dac2b662f72f8a67a4cf0ada7b506e621a (diff) | |
Use proper MACROs to send ancillary data over sockets.
The existing code while survived on most Linux distros, it failed on FreeBSD.
Report and patch by Jov
| -rw-r--r-- | src/backend/pgxc/pool/poolcomm.c | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/src/backend/pgxc/pool/poolcomm.c b/src/backend/pgxc/pool/poolcomm.c index d5124715ee..591aff0a39 100644 --- a/src/backend/pgxc/pool/poolcomm.c +++ b/src/backend/pgxc/pool/poolcomm.c @@ -503,7 +503,7 @@ pool_sendfds(PoolPort *port, int *fds, int count) struct msghdr msg; char buf[SEND_MSG_BUFFER_SIZE]; uint n32; - int controllen = sizeof(struct cmsghdr) + count * sizeof(int); + int controllen = CMSG_LEN(count * sizeof(int)); struct cmsghdr *cmptr = NULL; buf[0] = 'f'; @@ -525,7 +525,7 @@ pool_sendfds(PoolPort *port, int *fds, int count) } else { - if ((cmptr = malloc(controllen)) == NULL) + if ((cmptr = malloc(CMSG_SPACE(count * sizeof(int)))) == NULL) return EOF; cmptr->cmsg_level = SOL_SOCKET; cmptr->cmsg_type = SCM_RIGHTS; @@ -533,7 +533,7 @@ pool_sendfds(PoolPort *port, int *fds, int count) msg.msg_control = (caddr_t) cmptr; msg.msg_controllen = controllen; /* the fd to pass */ - memcpy(CMSG_DATA(cmptr), fds, count * sizeof(int)); + memcpy(CMSG_DATA(CMSG_FIRSTHDR(&msg)), fds, count * sizeof(int)); } if (sendmsg(Socket(*port), &msg, 0) != SEND_MSG_BUFFER_SIZE) @@ -561,8 +561,8 @@ pool_recvfds(PoolPort *port, int *fds, int count) char buf[SEND_MSG_BUFFER_SIZE]; struct iovec iov[1]; struct msghdr msg; - int controllen = sizeof(struct cmsghdr) + count * sizeof(int); - struct cmsghdr *cmptr = malloc(controllen); + int controllen = CMSG_LEN(count * sizeof(int)); + struct cmsghdr *cmptr = malloc(CMSG_SPACE(count * sizeof(int))); if (cmptr == NULL) return EOF; @@ -642,7 +642,7 @@ pool_recvfds(PoolPort *port, int *fds, int count) goto failure; } - memcpy(fds, CMSG_DATA(cmptr), count * sizeof(int)); + memcpy(fds, CMSG_DATA(CMSG_FIRSTHDR(&msg)), count * sizeof(int)); free(cmptr); return 0; failure: |
