static inline void
rspamd_control_fill_msghdr(struct rspamd_control_command *cmd,
int attached_fd, struct msghdr *msg,
- struct iovec *iov)
+ struct iovec *iov,
+ void *control_buf,
+ size_t control_len)
{
struct cmsghdr *cmsg;
- unsigned char fdspace[CMSG_SPACE(sizeof(int))];
memset(msg, 0, sizeof(*msg));
/* Attach fd to the message */
if (attached_fd != -1) {
- memset(fdspace, 0, sizeof(fdspace));
- msg->msg_control = fdspace;
- msg->msg_controllen = sizeof(fdspace);
+ memset(control_buf, 0, control_len);
+ msg->msg_control = control_buf;
+ msg->msg_controllen = control_len;
cmsg = CMSG_FIRSTHDR(msg);
cmsg->cmsg_level = SOL_SOCKET;
cmsg->cmsg_type = SCM_RIGHTS;
struct iovec iov;
rspamd_main = cur->worker->srv;
- rspamd_control_fill_msghdr(&cur->cmd, cur->attached_fd, &msg, &iov);
+ /* Provide a control buffer with correct lifetime for sendmsg */
+ unsigned char fdspace[CMSG_SPACE(sizeof(int))];
+ rspamd_control_fill_msghdr(&cur->cmd, cur->attached_fd, &msg, &iov, fdspace, sizeof(fdspace));
ssize_t r = sendmsg(cur->worker->control_pipe[0], &msg, 0);
if (r == sizeof(cur->cmd)) {
/* We can send command */
struct msghdr msg;
struct iovec iov;
+ unsigned char fdspace[CMSG_SPACE(sizeof(int))];
- rspamd_control_fill_msghdr(cmd, attached_fd, &msg, &iov);
+ rspamd_control_fill_msghdr(cmd, attached_fd, &msg, &iov, fdspace, sizeof(fdspace));
r = sendmsg(wrk->control_pipe[0], &msg, 0);
if (r == sizeof(*cmd)) {
static struct rspamd_control_command cmd;
static struct msghdr msg;
static struct iovec iov;
- static unsigned char fdspace[CMSG_SPACE(sizeof(int))];
+ unsigned char fdspace[CMSG_SPACE(sizeof(int))];
int rfd = -1;
gssize r;
struct msghdr msg;
struct cmsghdr *cmsg;
static struct iovec iov;
- static unsigned char fdspace[CMSG_SPACE(sizeof(int))];
+ unsigned char fdspace[CMSG_SPACE(sizeof(int))];
int *spair, rfd = -1;
char *nid;
struct rspamd_control_command wcmd;