summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPavan Deolasee2014-12-17 07:12:11 +0000
committerPavan Deolasee2015-04-15 05:46:43 +0000
commit249ce6794ba66cedc29be7ab1b42b28b55fbb574 (patch)
treec93e2cd1adfdedf3824f5147dedc9ab7ad6c10f1 /src
parent72a588dac2b662f72f8a67a4cf0ada7b506e621a (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.c12
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: