diff options
author | Tanu Kaskinen <tanuk@iki.fi> | 2017-02-04 14:19:01 +0200 |
---|---|---|
committer | Tanu Kaskinen <tanuk@iki.fi> | 2017-03-07 15:17:27 +0200 |
commit | 18ec0fe53ef3d296c8878efce768684b73e3fc8a (patch) | |
tree | 3389b8ac408c7225139e881e21e7fe6568eeceec /src/pulsecore | |
parent | 0cb72beaceca1e8e8e3eb330cbaa516912fa6dbd (diff) |
iochannel: don't use variable length array in union
Clang didn't like the variable length array:
pulsecore/iochannel.c:358:17: error: fields must have a constant size:
'variable length array in structure' extension will never be supported
uint8_t data[CMSG_SPACE(sizeof(int) * nfd)];
^
Commit 451d1d6762 introduced the variable length array in order to have
the correct value in msg_controllen. This patch reverts that commit and
uses a different way to achieve the same goal.
BugLink: https://bugs.freedesktop.org/show_bug.cgi?id=99458
Diffstat (limited to 'src/pulsecore')
-rw-r--r-- | src/pulsecore/iochannel.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/src/pulsecore/iochannel.c b/src/pulsecore/iochannel.c index 8ace297f..89733752 100644 --- a/src/pulsecore/iochannel.c +++ b/src/pulsecore/iochannel.c @@ -355,7 +355,7 @@ ssize_t pa_iochannel_write_with_fds(pa_iochannel*io, const void*data, size_t l, struct iovec iov; union { struct cmsghdr hdr; - uint8_t data[CMSG_SPACE(sizeof(int) * nfd)]; + uint8_t data[CMSG_SPACE(sizeof(int) * MAX_ANCIL_DATA_FDS)]; } cmsg; pa_assert(io); @@ -382,7 +382,13 @@ ssize_t pa_iochannel_write_with_fds(pa_iochannel*io, const void*data, size_t l, mh.msg_iov = &iov; mh.msg_iovlen = 1; mh.msg_control = &cmsg; - mh.msg_controllen = sizeof(cmsg); + + /* If we followed the example on the cmsg man page, we'd use + * sizeof(cmsg.data) here, but if nfd < MAX_ANCIL_DATA_FDS, then the data + * buffer is larger than needed, and the kernel doesn't like it if we set + * msg_controllen to a larger than necessary value. The commit message for + * commit 451d1d6762 contains a longer explanation. */ + mh.msg_controllen = CMSG_SPACE(sizeof(int) * nfd); if ((r = sendmsg(io->ofd, &mh, MSG_NOSIGNAL)) >= 0) { io->writable = io->hungup = false; |