unix: remove clang compiler warning pragmas (#3989)
Instead of suppressing the VLA warning, use a fixed-size buffer that is big enough to receive at least one control message but not so big that IBMi PASE rejects it.
This commit is contained in:
parent
30fc896cc1
commit
44b8153005
@ -60,6 +60,16 @@ struct uv__stream_select_s {
|
|||||||
};
|
};
|
||||||
#endif /* defined(__APPLE__) */
|
#endif /* defined(__APPLE__) */
|
||||||
|
|
||||||
|
union uv__cmsg {
|
||||||
|
struct cmsghdr hdr;
|
||||||
|
/* This cannot be larger because of the IBMi PASE limitation that
|
||||||
|
* the total size of control messages cannot exceed 256 bytes.
|
||||||
|
*/
|
||||||
|
char pad[256];
|
||||||
|
};
|
||||||
|
|
||||||
|
STATIC_ASSERT(256 == sizeof(union uv__cmsg));
|
||||||
|
|
||||||
static void uv__stream_connect(uv_stream_t*);
|
static void uv__stream_connect(uv_stream_t*);
|
||||||
static void uv__write(uv_stream_t* stream);
|
static void uv__write(uv_stream_t* stream);
|
||||||
static void uv__read(uv_stream_t* stream);
|
static void uv__read(uv_stream_t* stream);
|
||||||
@ -769,18 +779,14 @@ static int uv__try_write(uv_stream_t* stream,
|
|||||||
if (send_handle != NULL) {
|
if (send_handle != NULL) {
|
||||||
int fd_to_send;
|
int fd_to_send;
|
||||||
struct msghdr msg;
|
struct msghdr msg;
|
||||||
struct cmsghdr *cmsg;
|
union uv__cmsg cmsg;
|
||||||
union {
|
|
||||||
char data[64];
|
|
||||||
struct cmsghdr alias;
|
|
||||||
} scratch;
|
|
||||||
|
|
||||||
if (uv__is_closing(send_handle))
|
if (uv__is_closing(send_handle))
|
||||||
return UV_EBADF;
|
return UV_EBADF;
|
||||||
|
|
||||||
fd_to_send = uv__handle_fd((uv_handle_t*) send_handle);
|
fd_to_send = uv__handle_fd((uv_handle_t*) send_handle);
|
||||||
|
|
||||||
memset(&scratch, 0, sizeof(scratch));
|
memset(&cmsg, 0, sizeof(cmsg));
|
||||||
|
|
||||||
assert(fd_to_send >= 0);
|
assert(fd_to_send >= 0);
|
||||||
|
|
||||||
@ -790,14 +796,13 @@ static int uv__try_write(uv_stream_t* stream,
|
|||||||
msg.msg_iovlen = iovcnt;
|
msg.msg_iovlen = iovcnt;
|
||||||
msg.msg_flags = 0;
|
msg.msg_flags = 0;
|
||||||
|
|
||||||
msg.msg_control = &scratch.alias;
|
msg.msg_control = &cmsg.hdr;
|
||||||
msg.msg_controllen = CMSG_SPACE(sizeof(fd_to_send));
|
msg.msg_controllen = CMSG_SPACE(sizeof(fd_to_send));
|
||||||
|
|
||||||
cmsg = CMSG_FIRSTHDR(&msg);
|
cmsg.hdr.cmsg_level = SOL_SOCKET;
|
||||||
cmsg->cmsg_level = SOL_SOCKET;
|
cmsg.hdr.cmsg_type = SCM_RIGHTS;
|
||||||
cmsg->cmsg_type = SCM_RIGHTS;
|
cmsg.hdr.cmsg_len = CMSG_LEN(sizeof(fd_to_send));
|
||||||
cmsg->cmsg_len = CMSG_LEN(sizeof(fd_to_send));
|
memcpy(CMSG_DATA(&cmsg.hdr), &fd_to_send, sizeof(fd_to_send));
|
||||||
memcpy(CMSG_DATA(cmsg), &fd_to_send, sizeof(fd_to_send));
|
|
||||||
|
|
||||||
do
|
do
|
||||||
n = sendmsg(uv__stream_fd(stream), &msg, 0);
|
n = sendmsg(uv__stream_fd(stream), &msg, 0);
|
||||||
@ -972,15 +977,6 @@ static int uv__stream_queue_fd(uv_stream_t* stream, int fd) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#if defined(__PASE__)
|
|
||||||
/* on IBMi PASE the control message length can not exceed 256. */
|
|
||||||
# define UV__CMSG_FD_COUNT 60
|
|
||||||
#else
|
|
||||||
# define UV__CMSG_FD_COUNT 64
|
|
||||||
#endif
|
|
||||||
#define UV__CMSG_FD_SIZE (UV__CMSG_FD_COUNT * sizeof(int))
|
|
||||||
|
|
||||||
|
|
||||||
static int uv__stream_recv_cmsg(uv_stream_t* stream, struct msghdr* msg) {
|
static int uv__stream_recv_cmsg(uv_stream_t* stream, struct msghdr* msg) {
|
||||||
struct cmsghdr* cmsg;
|
struct cmsghdr* cmsg;
|
||||||
int fd;
|
int fd;
|
||||||
@ -1021,17 +1017,11 @@ static int uv__stream_recv_cmsg(uv_stream_t* stream, struct msghdr* msg) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef __clang__
|
|
||||||
# pragma clang diagnostic push
|
|
||||||
# pragma clang diagnostic ignored "-Wgnu-folding-constant"
|
|
||||||
# pragma clang diagnostic ignored "-Wvla-extension"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static void uv__read(uv_stream_t* stream) {
|
static void uv__read(uv_stream_t* stream) {
|
||||||
uv_buf_t buf;
|
uv_buf_t buf;
|
||||||
ssize_t nread;
|
ssize_t nread;
|
||||||
struct msghdr msg;
|
struct msghdr msg;
|
||||||
char cmsg_space[CMSG_SPACE(UV__CMSG_FD_SIZE)];
|
union uv__cmsg cmsg;
|
||||||
int count;
|
int count;
|
||||||
int err;
|
int err;
|
||||||
int is_ipc;
|
int is_ipc;
|
||||||
@ -1077,8 +1067,8 @@ static void uv__read(uv_stream_t* stream) {
|
|||||||
msg.msg_name = NULL;
|
msg.msg_name = NULL;
|
||||||
msg.msg_namelen = 0;
|
msg.msg_namelen = 0;
|
||||||
/* Set up to receive a descriptor even if one isn't in the message */
|
/* Set up to receive a descriptor even if one isn't in the message */
|
||||||
msg.msg_controllen = sizeof(cmsg_space);
|
msg.msg_controllen = sizeof(cmsg);
|
||||||
msg.msg_control = cmsg_space;
|
msg.msg_control = &cmsg.hdr;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
nread = uv__recvmsg(uv__stream_fd(stream), &msg, 0);
|
nread = uv__recvmsg(uv__stream_fd(stream), &msg, 0);
|
||||||
@ -1162,14 +1152,6 @@ static void uv__read(uv_stream_t* stream) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef __clang__
|
|
||||||
# pragma clang diagnostic pop
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#undef UV__CMSG_FD_COUNT
|
|
||||||
#undef UV__CMSG_FD_SIZE
|
|
||||||
|
|
||||||
|
|
||||||
int uv_shutdown(uv_shutdown_t* req, uv_stream_t* stream, uv_shutdown_cb cb) {
|
int uv_shutdown(uv_shutdown_t* req, uv_stream_t* stream, uv_shutdown_cb cb) {
|
||||||
assert(stream->type == UV_TCP ||
|
assert(stream->type == UV_TCP ||
|
||||||
stream->type == UV_TTY ||
|
stream->type == UV_TTY ||
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user