summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRainer Gerhards <rgerhards@adiscon.com>2013-10-18 17:52:15 +0200
committerRainer Gerhards <rgerhards@adiscon.com>2013-10-18 17:52:15 +0200
commitee0feecceaf0082b307be78198a672cb3ad78f46 (patch)
tree8e3c797fe3cb3223aa3e8011c8a58008f022fe30
parent65d338824885c5afaa4963159d39a5d638eaead7 (diff)
downloadrsyslog-ee0feecceaf0082b307be78198a672cb3ad78f46.tar.gz
rsyslog-ee0feecceaf0082b307be78198a672cb3ad78f46.tar.bz2
rsyslog-ee0feecceaf0082b307be78198a672cb3ad78f46.zip
bugfix: imudp when using recvmmsg could report wrong sender IP
-rw-r--r--ChangeLog1
-rw-r--r--plugins/imudp/imudp.c8
2 files changed, 6 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index c7566d2e..025b071d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -2,6 +2,7 @@
Version 7.5.6 [devel] 2013-10-??
- bugfix: running imupd on multiple threads lead to segfault if recvmmsg
is available
+- bugfix: imudp when using recvmmsg could report wrong sender IP
- bugfix: segfault if re_extract() function was used and no match found
- bugfix: omelasticsearch did not compile on platforms without atomic
instructions
diff --git a/plugins/imudp/imudp.c b/plugins/imudp/imudp.c
index 0a6f8207..f13bd148 100644
--- a/plugins/imudp/imudp.c
+++ b/plugins/imudp/imudp.c
@@ -132,6 +132,7 @@ static struct wrkrInfo_s {
STATSCOUNTER_DEF(ctrMsgsRcvd, mutCtrMsgsRcvd)
uchar *pRcvBuf; /* receive buffer (for a single packet) */
# ifdef HAVE_RECVMMSG
+ struct sockaddr_storage *frominet;
struct mmsghdr *recvmsg_mmh;
struct iovec *recvmsg_iov;
# endif
@@ -435,7 +436,6 @@ processSocket(struct wrkrInfo_s *pWrkr, struct lstn_s *lstn, struct sockaddr_sto
int iNbrTimeUsed;
time_t ttGenTime;
struct syslogTime stTime;
- struct sockaddr_storage frominet;
char errStr[1024];
msg_t *pMsgs[CONF_NUM_MULTISUB];
multi_submit_t multiSub;
@@ -454,8 +454,8 @@ processSocket(struct wrkrInfo_s *pWrkr, struct lstn_s *lstn, struct sockaddr_sto
for(i = 0 ; i < runModConf->batchSize ; ++i) {
pWrkr->recvmsg_iov[i].iov_base = pWrkr->pRcvBuf+(i*(iMaxLine+1));
pWrkr->recvmsg_iov[i].iov_len = iMaxLine;
- pWrkr->recvmsg_mmh[i].msg_hdr.msg_name = &frominet;
pWrkr->recvmsg_mmh[i].msg_hdr.msg_namelen = sizeof(struct sockaddr_storage);
+ pWrkr->recvmsg_mmh[i].msg_hdr.msg_name = &(pWrkr->frominet[i]);
pWrkr->recvmsg_mmh[i].msg_hdr.msg_iov = &(pWrkr->recvmsg_iov[i]);
pWrkr->recvmsg_mmh[i].msg_hdr.msg_iovlen = 1;
}
@@ -488,7 +488,7 @@ processSocket(struct wrkrInfo_s *pWrkr, struct lstn_s *lstn, struct sockaddr_sto
pWrkr->ctrMsgsRcvd += nelem;
for(i = 0 ; i < nelem ; ++i) {
processPacket(pWrkr->pThrd, lstn, frominetPrev, pbIsPermitted, pWrkr->recvmsg_mmh[i].msg_hdr.msg_iov->iov_base,
- pWrkr->recvmsg_mmh[i].msg_len, &stTime, ttGenTime, &frominet,
+ pWrkr->recvmsg_mmh[i].msg_len, &stTime, ttGenTime, &(pWrkr->frominet[i]),
pWrkr->recvmsg_mmh[i].msg_hdr.msg_namelen, &multiSub);
}
}
@@ -1046,6 +1046,7 @@ CODESTARTactivateCnf
# ifdef HAVE_RECVMMSG
CHKmalloc(wrkrInfo[i].recvmsg_iov = MALLOC(runModConf->batchSize * sizeof(struct iovec)));
CHKmalloc(wrkrInfo[i].recvmsg_mmh = MALLOC(runModConf->batchSize * sizeof(struct mmsghdr)));
+ CHKmalloc(wrkrInfo[i].frominet = MALLOC(runModConf->batchSize * sizeof(struct sockaddr_storage)));
# endif
CHKmalloc(wrkrInfo[i].pRcvBuf = MALLOC(lenRcvBuf));
wrkrInfo[i].id = i;
@@ -1172,6 +1173,7 @@ CODESTARTafterRun
# ifdef HAVE_RECVMMSG
free(wrkrInfo[i].recvmsg_iov);
free(wrkrInfo[i].recvmsg_mmh);
+ free(wrkrInfo[i].frominet);
# endif
free(wrkrInfo[i].pRcvBuf);
}