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 /src | |
| 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
Diffstat (limited to 'src')
| -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: |
