Update to 8.2210 version

Signed-off-by: pengyi37 <pengyi37@huawei.com>
This commit is contained in:
pengyi37 2023-02-04 16:27:38 +08:00
parent 75bbb262f7
commit 5aabd9b744
27 changed files with 55 additions and 1757 deletions

View File

@ -1,39 +0,0 @@
From 4fc5ed645a125661ce773ecf5376df5062305976 Mon Sep 17 00:00:00 2001
From: alakatos <alakatos@redhat.com>
Date: Tue, 30 Nov 2021 18:13:23 +0100
Subject: [PATCH] Deallocate outchannel resources in rsconf destructor
Conflict:NA
Reference:https://github.com/rsyslog/rsyslog/commit/4fc5ed645a125661ce773ecf5376df5062305976
---
outchannel.c | 4 ++++
runtime/rsconf.c | 1 +
2 files changed, 5 insertions(+)
diff --git a/outchannel.c b/outchannel.c
index db78d93763..ba5809f4af 100644
--- a/outchannel.c
+++ b/outchannel.c
@@ -272,6 +272,10 @@ void ochDeleteAll(void)
pOch = pOch->pNext;
if(pOchDel->pszName != NULL)
free(pOchDel->pszName);
+ if(pOchDel->pszFileTemplate != NULL)
+ free(pOchDel->pszFileTemplate);
+ if(pOchDel->cmdOnSizeLimit != NULL)
+ free(pOchDel->cmdOnSizeLimit);
free(pOchDel);
}
}
diff --git a/runtime/rsconf.c b/runtime/rsconf.c
index 3042a16849..6eb7042526 100644
--- a/runtime/rsconf.c
+++ b/runtime/rsconf.c
@@ -240,6 +240,7 @@ CODESTARTobjDestruct(rsconf)
tplDeleteAll(pThis);
dynstats_destroyAllBuckets();
perctileBucketsDestruct();
+ ochDeleteAll();
free(pThis->globals.mainQ.pszMainMsgQFName);
free(pThis->globals.pszConfDAGFile);
lookupDestroyCnf();

View File

@ -1,29 +0,0 @@
From eab250be3701b6aa5ccc65f2f79fd5b41f08b2b2 Mon Sep 17 00:00:00 2001
From: "t.feng" <t.feng94@foxmail.com>
Date: Mon, 8 Aug 2022 11:36:59 +0800
Subject: [PATCH] Fix Segmentation fault in close journal
Conflict:NA
Reference:https://github.com/rsyslog/rsyslog/commit/eab250be3701b6aa5ccc65f2f79fd5b41f08b2b2
---
plugins/imjournal/imjournal.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/plugins/imjournal/imjournal.c b/plugins/imjournal/imjournal.c
index 53034fe..6fb3b7a 100644
--- a/plugins/imjournal/imjournal.c
+++ b/plugins/imjournal/imjournal.c
@@ -1001,7 +1001,9 @@ CODESTARTafterRun
persistJournalState();
}
closeJournal();
- ratelimitDestruct(ratelimiter);
+ if (ratelimiter) {
+ ratelimitDestruct(ratelimiter);
+ }
ENDafterRun
--
2.23.0

View File

@ -1,32 +0,0 @@
From b3ba1d7280bab1b623e1b2aaf390bbae8aa8c484 Mon Sep 17 00:00:00 2001
From: seuzw930 <76191785+seuzw930@users.noreply.github.com>
Date: Sun, 14 Aug 2022 16:52:53 +0800
Subject: [PATCH] Fix memory leak when SetString
During SetString reassign to pThis->szVal.psz, pThis->szVal.psz might not null. It resulted in memory leak and this patch fixes this behaviour.
The problem is mentioned here:
https://github.com/rsyslog/rsyslog/issues/4961From f65b8860358b7aaca76d3abe086ac2bf80e2079b Mon Sep 17 00:00:00 2001
Conflict:NA
Reference:https://github.com/rsyslog/rsyslog/commit/b3ba1d7280bab1b623e1b2aaf390bbae8aa8c484
---
runtime/prop.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/runtime/prop.c b/runtime/prop.c
index 866b691..c4de5d7 100644
--- a/runtime/prop.c
+++ b/runtime/prop.c
@@ -84,6 +84,9 @@ static rsRetVal SetString(prop_t *pThis, const uchar *psz, const int len)
if(len < CONF_PROP_BUFSIZE) {
memcpy(pThis->szVal.sz, psz, len + 1);
} else {
+ if(pThis->szVal.psz != NULL) {
+ free(pThis->szVal.psz);
+ }
CHKmalloc(pThis->szVal.psz = malloc(len + 1));
memcpy(pThis->szVal.psz, psz, len + 1);
}
--
2.27.0

View File

@ -1,50 +0,0 @@
From 63e5d6845aedd649eee1f807e85784a066163ad0 Mon Sep 17 00:00:00 2001
From: seuzw930 <76191785+seuzw930@users.noreply.github.com>
Date: Mon, 18 Jul 2022 15:43:17 +0800
Subject: [PATCH] Fix memory leak when free action worker data table
During free action worker data table when action destruct, worker instance in worker data table were not null. It resulted in memory leak and this patch fixes this behaviour.
Conflict:NA
Reference:https://github.com/rsyslog/rsyslog/commit/d59feba46b8d8c2c3c5c25c6fc6e99f93bdae8b9
---
action.c | 16 +++++++++++++++-
1 file changed, 15 insertions(+), 1 deletion(-)
diff --git a/action.c b/action.c
index e0d05ed..4cea500 100644
--- a/action.c
+++ b/action.c
@@ -326,6 +326,20 @@ actionResetQueueParams(void)
RETiRet;
}
+/* free action worker data table
+*/
+static void freeWrkrDataTable(action_t * const pThis)
+{
+ int freeSpot;
+ for(freeSpot = 0; freeSpot < pThis->wrkrDataTableSize; ++freeSpot) {
+ if(pThis->wrkrDataTable[freeSpot] != NULL) {
+ pThis->pMod->mod.om.freeWrkrInstance(pThis->wrkrDataTable[freeSpot]);
+ pThis->wrkrDataTable[freeSpot] = NULL;
+ }
+ }
+ free(pThis->wrkrDataTable);
+ return;
+}
/* destructs an action descriptor object
* rgerhards, 2007-08-01
@@ -363,7 +377,7 @@ rsRetVal actionDestruct(action_t * const pThis)
free(pThis->pszName);
free(pThis->ppTpl);
free(pThis->peParamPassing);
- free(pThis->wrkrDataTable);
+ freeWrkrDataTable(pThis);
finalize_it:
free(pThis);
--
2.33.0

View File

@ -1,29 +0,0 @@
From 81236d6ec506dd84c78e6c09fc39d5019ea483f2 Mon Sep 17 00:00:00 2001
From: seuzw930 <76191785+seuzw930@users.noreply.github.com>
Date: Thu, 7 Jul 2022 20:47:11 +0800
Subject: [PATCH] Fix memory leak when globally de-initialize GnuTLS
During globally de-initialize GnuTLS, server anon credentials and server DH parameters for anon mode were not null. It resulted in memory leak and this patch fixes this behaviour.
Conflict:NA
Reference:https://github.com/rsyslog/rsyslog/commit/8e13d9d718d26b15263ecd53e26fed1a2af3f3e9
---
runtime/nsd_gtls.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/runtime/nsd_gtls.c b/runtime/nsd_gtls.c
index 01b0ec6..8f13810 100644
--- a/runtime/nsd_gtls.c
+++ b/runtime/nsd_gtls.c
@@ -1307,6 +1307,8 @@ static rsRetVal
gtlsGlblExit(void)
{
DEFiRet;
+ gnutls_anon_free_server_credentials(anoncredSrv);
+ gnutls_dh_params_deinit(dh_params);
gnutls_global_deinit();
RETiRet;
}
--
2.33.0

View File

@ -1,35 +0,0 @@
From 6aeec7bf83135224400362598f0cc7ebef655195 Mon Sep 17 00:00:00 2001
From: David Buckley <davidbuckley@gambitresearch.com>
Date: Tue, 12 Apr 2022 17:38:49 +0100
Subject: [PATCH] Fix non-null-terminated-string used with strlen
The `failedmsg_entry` expects a null-terminated string in `key`, but
here we allocate with malloc and copy a string-with-length-n into only
the first n bytes. If the final byte is null, this is by coincidence
only.
We've observed this by means of seeing random binary data appended to
keys submitted to kafka apparently at random, and this looks like a
smoking gun.
Conflict:NA
Reference:https://github.com/rsyslog/rsyslog/commit/2c8c9db065cef3b5086c90c3782ac48da40c8b2f
---
plugins/omkafka/omkafka.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/plugins/omkafka/omkafka.c b/plugins/omkafka/omkafka.c
index 850dfc0..e6cb2ea 100644
--- a/plugins/omkafka/omkafka.c
+++ b/plugins/omkafka/omkafka.c
@@ -350,6 +350,7 @@ const size_t msglen, const char *const topicname)
return NULL;
}
memcpy(etry->key, key, keylen);
+ etry->key[keylen] = '\0';
} else {
etry->key=NULL;
}
--
2.33.0

View File

@ -1,37 +0,0 @@
From 640af90afaf13bef5a99a458ed8e862359588d8f Mon Sep 17 00:00:00 2001
From: Kailash Sethuraman <hsaliak@gmail.com>
Date: Thu, 13 Jan 2022 13:52:46 -0500
Subject: [PATCH] Fixes #4395 by correctly checking for EPIPE.
kmsg is a unique device, which can recover from EPIPE errors.
The original code checked for this, but checked the return value for the libc
read call, which always returns -1 and sets the appropriate errno.
This meant that when an EPIPE error actually happened, the fd was infinitely retried. The 'for loop' was broken out of, but the readikmsg() function is repeatedly called.
Note: there is an additional bug here. The readikmsg function needs better error checking on the fd. I suspect that this was rarely an issue because /dev/kmsg goes truly invalid when the system is actually shutting down.
The fix here is to check the return value as well as the errno.
Conflict:NA
Reference:https://github.com/rsyslog/rsyslog/commit/feb6420148c351072a190990622b58124fd44506
---
contrib/imkmsg/kmsg.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/contrib/imkmsg/kmsg.c b/contrib/imkmsg/kmsg.c
index beb4076..5a3f45e 100644
--- a/contrib/imkmsg/kmsg.c
+++ b/contrib/imkmsg/kmsg.c
@@ -214,7 +214,7 @@ readkmsg(void)
if (i > 0) {
/* successful read of message of nonzero length */
pRcv[i] = '\0';
- } else if (i == -EPIPE) {
+ } else if (i < 0 && errno == EPIPE) {
imkmsgLogIntMsg(LOG_WARNING,
"imkmsg: some messages in circular buffer got overwritten");
continue;
--
2.33.0

View File

@ -1,218 +0,0 @@
From a335ec06f0897a71356afee3362f67e68b91a3de Mon Sep 17 00:00:00 2001
From: Andre lorbach <alorbach@adiscon.com>
Date: Thu, 28 Jul 2022 16:17:41 +0200
Subject: [PATCH] mmanon: Simplified and fixed IPv4 digit detection.
- Fixed an issue with numbers above int64 in syntax_ipv4.
Numbers that were up to 256 above the max of an int64
could incorrectly be detected as valid ipv4 digit.
- Simplified the IPv4 digit detection function and renamed
to isPosByte.
- added testcasse for malformed IPvc4 addresses
closes: https://github.com/rsyslog/rsyslog/issues/4940
Conflict:NA
Reference:https://github.com/rsyslog/rsyslog/commit/a335ec06f0897a71356afee3362f67e68b91a3de
---
plugins/mmanon/mmanon.c | 55 ++++++++++++++------------
tests/Makefile.am | 2 +
tests/mmanon_recognize_ipv4.sh | 4 ++
tests/mmanon_simple_mallformed_ipv4.sh | 37 +++++++++++++++++
4 files changed, 73 insertions(+), 25 deletions(-)
create mode 100755 tests/mmanon_simple_mallformed_ipv4.sh
diff --git a/plugins/mmanon/mmanon.c b/plugins/mmanon/mmanon.c
index a2ebd7b..4f83076 100644
--- a/plugins/mmanon/mmanon.c
+++ b/plugins/mmanon/mmanon.c
@@ -22,6 +22,7 @@
#include "config.h"
#include "rsyslog.h"
#include <stdio.h>
+#include <ctype.h>
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>
@@ -388,72 +389,76 @@ getHexVal(char c)
}
-/* returns -1 if no integer found, else integer */
-static int64_t
-getPosInt(const uchar *const __restrict__ buf,
+/* returns 1 if valid IPv4 digit, 0 if not */
+static int
+isPosByte(const uchar *const __restrict__ buf,
const size_t buflen,
size_t *const __restrict__ nprocessed)
{
- int64_t val = 0;
+ int val = 0; /* Default means no byte found */
size_t i;
- for(i = 0 ; i < buflen ; i++) {
- if('0' <= buf[i] && buf[i] <= '9')
- val = val*10 + buf[i]-'0';
- else
+ for(i = 0 ; i < buflen; i++) {
+ if('0' <= buf[i] && buf[i] <= '9') {
+ /* Maximum 3 digits for single IPv4 Number, we only copy up to 4 numbers
+ * but process forward to non digits */
+ if (i < 4) {
+ val = val*10 + buf[i]-'0';
+ }
+ } else
break;
}
*nprocessed = i;
- if(i == 0)
- val = -1;
- return val;
+ /* Return 1 if more than 1 and less the 4 digits and between 0 and 255 */
+ if( i > 0 &&
+ i < 4 &&
+ (val >= 0 && val <= 255)) {
+ return 1;
+ } else {
+ return 0;
+ }
}
/* 1 - is IPv4, 0 not */
-
static int
syntax_ipv4(const uchar *const __restrict__ buf,
const size_t buflen,
size_t *const __restrict__ nprocessed)
{
- int64_t val;
- size_t nproc;
+ size_t nproc = 0;
size_t i;
int r = 0;
-
- val = getPosInt(buf, buflen, &i);
- if(val < 0 || val > 255)
+ if(isPosByte(buf, buflen, &i) == 0) {
goto done;
-
+ }
if(i >= buflen || buf[i] != '.') {
goto done;
}
i++;
- val = getPosInt(buf+i, buflen-i, &nproc);
- if(val < 0 || val > 255)
+ if(isdigit(buf[i]) == 0 || isPosByte(buf+i, buflen-i, &nproc) == 0) {
goto done;
+ }
i += nproc;
if(i >= buflen || buf[i] != '.') {
goto done;
}
i++;
- val = getPosInt(buf+i, buflen-i, &nproc);
- if(val < 0 || val > 255)
+ if(isdigit(buf[i]) == 0 || isPosByte(buf+i, buflen-i, &nproc) == 0) {
goto done;
+ }
i += nproc;
if(i >= buflen || buf[i] != '.') {
goto done;
}
i++;
- val = getPosInt(buf+i, buflen-i, &nproc);
- if(val < 0 || val > 255)
+ if(isdigit(buf[i]) == 0 || isPosByte(buf+i, buflen-i, &nproc) == 0) {
goto done;
+ }
i += nproc;
*nprocessed = i;
r = 1;
-
done:
return r;
}
diff --git a/tests/Makefile.am b/tests/Makefile.am
index d3b040b..5e4f4fe 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -587,6 +587,7 @@ TESTS += \
mmanon_simple_12_ipv4.sh \
mmanon_simple_33_ipv4.sh \
mmanon_simple_8_ipv4.sh \
+ mmanon_simple_mallformed_ipv4.sh \
mmanon_random_128_ipv6.sh \
mmanon_zero_128_ipv6.sh \
mmanon_zero_96_ipv6.sh \
@@ -1872,6 +1873,7 @@ EXTRA_DIST= \
mmanon_simple_12_ipv4.sh \
mmanon_simple_33_ipv4.sh \
mmanon_simple_8_ipv4.sh \
+ mmanon_simple_mallformed_ipv4.sh \
mmanon_random_128_ipv6.sh \
mmanon_zero_128_ipv6.sh \
mmanon_zero_96_ipv6.sh \
diff --git a/tests/mmanon_recognize_ipv4.sh b/tests/mmanon_recognize_ipv4.sh
index fb7eb9f..cd9dcca 100755
--- a/tests/mmanon_recognize_ipv4.sh
+++ b/tests/mmanon_recognize_ipv4.sh
@@ -2,6 +2,10 @@
# add 2016-11-22 by Jan Gerhards, released under ASL 2.0
. ${srcdir:=.}/diag.sh init
+
+#export RSYSLOG_DEBUG="debug nostdout noprintmutexaction"
+#export RSYSLOG_DEBUGLOG="$RSYSLOG_DYNNAME.debuglog"
+
generate_conf
add_conf '
template(name="outfmt" type="string" string="%msg%\n")
diff --git a/tests/mmanon_simple_mallformed_ipv4.sh b/tests/mmanon_simple_mallformed_ipv4.sh
new file mode 100755
index 0000000..7ef8899
--- /dev/null
+++ b/tests/mmanon_simple_mallformed_ipv4.sh
@@ -0,0 +1,37 @@
+#!/bin/bash
+# add 2022-07-28 by Andre Lorbach, released under ASL 2.0
+
+. ${srcdir:=.}/diag.sh init
+#export USE_VALGRIND="YES" # this test only makes sense with valgrind enabled
+#export RS_TEST_VALGRIND_EXTRA_OPTS="--keep-debuginfo=yes"
+
+#export RSYSLOG_DEBUG="debug nostdout noprintmutexaction"
+#export RSYSLOG_DEBUGLOG="$RSYSLOG_DYNNAME.debuglog"
+
+generate_conf
+add_conf '
+template(name="outfmt" type="string" string="%msg%\n")
+
+module(load="../plugins/mmanon/.libs/mmanon")
+module(load="../plugins/imtcp/.libs/imtcp")
+input(type="imtcp" port="0" listenPortFileName="'$RSYSLOG_DYNNAME'.tcpflood_port" ruleset="testing")
+
+ruleset(name="testing") {
+ action(type="mmanon" ipv4.bits="32" ipv4.mode="simple")
+ action(type="omfile" file=`echo $RSYSLOG_OUT_LOG` template="outfmt")
+}'
+
+startup
+tcpflood -m1 -M "\"<129>Mar 10 01:00:00 172.20.245.8 tag: 165874883373.1.15599155266856607338.91@whatever
+<129>Mar 10 01:00:00 172.20.245.8 tag: 1.165874883373.15599155266856607338.91@whatever
+<129>Mar 10 01:00:00 172.20.245.8 tag: 15599155266856607338.165874883373.1.91@whatever
+<129>Mar 10 01:00:00 172.20.245.8 tag: 91.165874883373.1.15599155266856607338.@whatever\""
+
+shutdown_when_empty
+wait_shutdown
+export EXPECTED=' 165874883373.1.15599155266856607338.91@whatever
+ 1.165874883373.15599155266856607338.91@whatever
+ 15599155266856607338.165874883373.1.91@whatever
+ 91.165874883373.1.15599155266856607338.@whatever'
+cmp_exact
+exit_test
--
2.27.0

View File

@ -1,30 +0,0 @@
From 178a36c9b497a78855e1eda03550c3089473ace7 Mon Sep 17 00:00:00 2001
From: Gabor Orosz <goro@goro.io>
Date: Fri, 14 Jan 2022 19:58:17 +0000
Subject: [PATCH] Terminate all tcpsrv threads properly
Graceful shutdown of Rsyslog could lead to segmentation faults when
multiple imtcp inputs are being used. That is because the rest of the
tcpsrv threads are left behind running, while their underlying objects
are being disposed by the main thread as part of the module
de-initialization.
Signed-off-by: Gabor Orosz <goro@goro.io>
Conflict:NA
Reference:https://github.com/rsyslog/rsyslog/commit/178a36c9b497a78855e1eda03550c3089473ace7
---
plugins/imtcp/imtcp.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/plugins/imtcp/imtcp.c b/plugins/imtcp/imtcp.c
index 0e689a28d8..a6256acad8 100644
--- a/plugins/imtcp/imtcp.c
+++ b/plugins/imtcp/imtcp.c
@@ -1007,6 +1007,7 @@ CODESTARTrunInput
iRet = tcpsrv.Run(tcpsrv_root->tcpsrv);
/* de-init remaining servers */
+ etry = tcpsrv_root->next;
while(etry != NULL) {
stopSrvWrkr(etry);
etry = etry->next;

View File

@ -1,210 +0,0 @@
From f83306fe2a58708455e5f3b83679aca22f1283d2 Mon Sep 17 00:00:00 2001
From: Rainer Gerhards <rgerhards@adiscon.com>
Date: Fri, 22 Oct 2021 18:02:23 +0200
Subject: [PATCH] imtcp: add support for permittedPeers setting at input()
level
The permittedPeers settig was actually forgotten during the refactoring
of TLS input() level settings. This functionality is now added.
closes: https://github.com/rsyslog/rsyslog/issues/4706
Conflict:NA
Reference:https://github.com/rsyslog/rsyslog/commit/f83306fe2a58708455e5f3b83679aca22f1283d2
---
plugins/imtcp/imtcp.c | 53 +++++++++++++++++++++++++++----------------
runtime/nsd_ossl.c | 1 +
runtime/tcps_sess.c | 2 ++
3 files changed, 36 insertions(+), 20 deletions(-)
diff --git a/plugins/imtcp/imtcp.c b/plugins/imtcp/imtcp.c
index 06774069c4..98a060e4c9 100644
--- a/plugins/imtcp/imtcp.c
+++ b/plugins/imtcp/imtcp.c
@@ -63,7 +63,7 @@
#include "tcpsrv.h"
#include "ruleset.h"
#include "rainerscript.h"
-#include "net.h" /* for permittedPeers, may be removed when this is removed */
+#include "net.h"
#include "parserif.h"
MODULE_TYPE_INPUT
@@ -144,6 +144,7 @@ struct instanceConf_s {
uchar *pszStrmDrvrCAFile;
uchar *pszStrmDrvrKeyFile;
uchar *pszStrmDrvrCertFile;
+ permittedPeers_t *pPermPeersRoot;
uchar *gnutlsPriorityString;
int iStrmDrvrExtendedCertCheck;
int iStrmDrvrSANPreference;
@@ -183,7 +184,7 @@ struct modConfData_s {
uchar *pszStrmDrvrCAFile;
uchar *pszStrmDrvrKeyFile;
uchar *pszStrmDrvrCertFile;
- struct cnfarray *permittedPeers;
+ permittedPeers_t *pPermPeersRoot;
sbool configSetViaV2Method;
sbool bPreserveCase; /* preserve case of fromhost; true by default */
};
@@ -251,6 +252,7 @@ static struct cnfparamdescr inppdescr[] = {
{ "streamdriver.cafile", eCmdHdlrString, 0 },
{ "streamdriver.keyfile", eCmdHdlrString, 0 },
{ "streamdriver.certfile", eCmdHdlrString, 0 },
+ { "permittedpeer", eCmdHdlrArray, 0 },
{ "gnutlsprioritystring", eCmdHdlrString, 0 },
{ "keepalive", eCmdHdlrBinary, 0 },
{ "keepalive.probes", eCmdHdlrNonNegInt, 0 },
@@ -365,6 +367,7 @@ createInstance(instanceConf_t **pinst)
inst->pszStrmDrvrCAFile = NULL;
inst->pszStrmDrvrKeyFile = NULL;
inst->pszStrmDrvrCertFile = NULL;
+ inst->pPermPeersRoot = NULL;
inst->gnutlsPriorityString = NULL;
inst->iStrmDrvrMode = loadModConf->iStrmDrvrMode;
inst->iStrmDrvrExtendedCertCheck = loadModConf->iStrmDrvrExtendedCertCheck;
@@ -451,6 +454,7 @@ addListner(modConfData_t *modConf, instanceConf_t *inst)
{
DEFiRet;
uchar *psz; /* work variable */
+ permittedPeers_t *peers;
tcpsrv_t *pOurTcpsrv;
CHKiRet(tcpsrv.Construct(&pOurTcpsrv));
@@ -508,8 +512,10 @@ addListner(modConfData_t *modConf, instanceConf_t *inst)
? modConf->pszStrmDrvrCertFile : inst->pszStrmDrvrCertFile;
CHKiRet(tcpsrv.SetDrvrCertFile(pOurTcpsrv, psz));
- if(pPermPeersRoot != NULL) {
- CHKiRet(tcpsrv.SetDrvrPermPeers(pOurTcpsrv, pPermPeersRoot));
+ peers = (inst->pPermPeersRoot == NULL)
+ ? modConf->pPermPeersRoot : inst->pPermPeersRoot;
+ if(peers != NULL) {
+ CHKiRet(tcpsrv.SetDrvrPermPeers(pOurTcpsrv, peers));
}
/* initialized, now add socket and listener params */
@@ -608,6 +614,12 @@ CODESTARTnewInpInst
inst->pszStrmDrvrName = (uchar*)es_str2cstr(pvals[i].val.d.estr, NULL);
} else if(!strcmp(inppblk.descr[i].name, "gnutlsprioritystring")) {
inst->gnutlsPriorityString = (uchar*)es_str2cstr(pvals[i].val.d.estr, NULL);
+ } else if(!strcmp(inppblk.descr[i].name, "permittedpeer")) {
+ for(int j = 0 ; j < pvals[i].val.d.ar->nmemb ; ++j) {
+ uchar *const peer = (uchar*) es_str2cstr(pvals[i].val.d.ar->arr[j], NULL);
+ CHKiRet(net.AddPermittedPeer(&inst->pPermPeersRoot, peer));
+ free(peer);
+ }
} else if(!strcmp(inppblk.descr[i].name, "flowcontrol")) {
inst->bUseFlowControl = (int) pvals[i].val.d.n;
} else if(!strcmp(inppblk.descr[i].name, "disablelfdelimiter")) {
@@ -689,7 +701,7 @@ CODESTARTbeginCnfLoad
loadModConf->pszStrmDrvrCAFile = NULL;
loadModConf->pszStrmDrvrKeyFile = NULL;
loadModConf->pszStrmDrvrCertFile = NULL;
- loadModConf->permittedPeers = NULL;
+ loadModConf->pPermPeersRoot = NULL;
loadModConf->configSetViaV2Method = 0;
loadModConf->bPreserveCase = 1; /* default to true */
bLegacyCnfModGlobalsPermitted = 1;
@@ -780,7 +792,11 @@ CODESTARTsetModCnf
} else if(!strcmp(modpblk.descr[i].name, "streamdriver.name")) {
loadModConf->pszStrmDrvrName = (uchar*)es_str2cstr(pvals[i].val.d.estr, NULL);
} else if(!strcmp(modpblk.descr[i].name, "permittedpeer")) {
- loadModConf->permittedPeers = cnfarrayDup(pvals[i].val.d.ar);
+ for(int j = 0 ; j < pvals[i].val.d.ar->nmemb ; ++j) {
+ uchar *const peer = (uchar*) es_str2cstr(pvals[i].val.d.ar->arr[j], NULL);
+ CHKiRet(net.AddPermittedPeer(&loadModConf->pPermPeersRoot, peer));
+ free(peer);
+ }
} else if(!strcmp(modpblk.descr[i].name, "preservecase")) {
loadModConf->bPreserveCase = (int) pvals[i].val.d.n;
} else {
@@ -818,6 +834,11 @@ CODESTARTendCnfLoad
pModConf->iKeepAliveProbes = cs.iKeepAliveProbes;
pModConf->iKeepAliveIntvl = cs.iKeepAliveIntvl;
pModConf->iKeepAliveTime = cs.iKeepAliveTime;
+ if(pPermPeersRoot != NULL) {
+ assert(pModConf->pPermPeersRoot == NULL);
+ pModConf->pPermPeersRoot = pPermPeersRoot;
+ pPermPeersRoot = NULL; /* memory handed over! */
+ }
if((cs.pszStrmDrvrAuthMode == NULL) || (cs.pszStrmDrvrAuthMode[0] == '\0')) {
loadModConf->pszStrmDrvrAuthMode = NULL;
} else {
@@ -860,15 +881,8 @@ ENDcheckCnf
BEGINactivateCnfPrePrivDrop
instanceConf_t *inst;
- int i;
CODESTARTactivateCnfPrePrivDrop
runModConf = pModConf;
- if(runModConf->permittedPeers != NULL) {
- for(i = 0 ; i < runModConf->permittedPeers->nmemb ; ++i) {
- setPermittedPeer(NULL, (uchar*)
- es_str2cstr(runModConf->permittedPeers->arr[i], NULL));
- }
- }
for(inst = runModConf->root ; inst != NULL ; inst = inst->next) {
addListner(runModConf, inst);
}
@@ -899,10 +913,10 @@ CODESTARTfreeCnf
free(pModConf->pszStrmDrvrCAFile);
free(pModConf->pszStrmDrvrKeyFile);
free(pModConf->pszStrmDrvrCertFile);
- if(pModConf->permittedPeers != NULL) {
- cnfarrayContentDestruct(pModConf->permittedPeers);
- free(pModConf->permittedPeers);
+ if(pModConf->pPermPeersRoot != NULL) {
+ net.DestructPermittedPeers(&pModConf->pPermPeersRoot);
}
+
for(inst = pModConf->root ; inst != NULL ; ) {
free((void*)inst->pszBindRuleset);
free((void*)inst->pszStrmDrvrAuthMode);
@@ -914,6 +928,9 @@ CODESTARTfreeCnf
free((void*)inst->gnutlsPriorityString);
free((void*)inst->pszInputName);
free((void*)inst->dfltTZ);
+ if(inst->pPermPeersRoot != NULL) {
+ net.DestructPermittedPeers(&inst->pPermPeersRoot);
+ }
del = inst;
inst = inst->next;
free(del);
@@ -1026,10 +1043,6 @@ ENDisCompatibleWithFeature
BEGINmodExit
CODESTARTmodExit
- if(pPermPeersRoot != NULL) {
- net.DestructPermittedPeers(&pPermPeersRoot);
- }
-
/* release objects we used */
objRelease(net, LM_NET_FILENAME);
objRelease(netstrm, LM_NETSTRMS_FILENAME);
diff --git a/runtime/nsd_ossl.c b/runtime/nsd_ossl.c
index 110e11038b..03ebc0ab33 100644
--- a/runtime/nsd_ossl.c
+++ b/runtime/nsd_ossl.c
@@ -612,6 +612,7 @@ osslChkPeerFingerprint(nsd_ossl_t *pThis, X509 *pCert)
dbgprintf("osslChkPeerFingerprint: peer's certificate MATCH found: %s\n", pPeer->pszID);
bFoundPositiveMatch = 1;
} else {
+ dbgprintf("osslChkPeerFingerprint: NOMATCH peer certificate: %s\n", pPeer->pszID);
pPeer = pPeer->pNext;
}
}
diff --git a/runtime/tcps_sess.c b/runtime/tcps_sess.c
index b12d873019..9e5dbcc5cb 100644
--- a/runtime/tcps_sess.c
+++ b/runtime/tcps_sess.c
@@ -444,8 +444,10 @@ processDataRcvd(tcps_sess_t *pThis,
}
} else {
assert(pThis->inputState == eInMsg);
+ #if 0 // set to 1 for ultra-verbose
DBGPRINTF("DEBUG: processDataRcvd c=%c remain=%d\n",
c, pThis->iOctetsRemain);
+ #endif
if(( ((c == '\n') && !pThis->pSrv->bDisableLFDelim)
|| ((pThis->pSrv->addtlFrameDelim != TCPSRV_NO_ADDTL_DELIMITER)

View File

@ -1,78 +0,0 @@
From 202e10e24ca658f91c3aef87c017e8f0525744b5 Mon Sep 17 00:00:00 2001
From: Rainer Gerhards <rgerhards@adiscon.com>
Date: Mon, 25 Oct 2021 09:18:44 +0200
Subject: [PATCH] testbench: add test for legacy permittedPeer statement
This is required to ensure backwards compatibility when doing changes
to the networking subsystem. So far this was not covered by any test.
Conflict:NA
Reference:https://github.com/rsyslog/rsyslog/commit/202e10e24ca658f91c3aef87c017e8f0525744b5
---
tests/Makefile.am | 2 ++
tests/imtcp-tls-gtls-x509name-legacy.sh | 33 +++++++++++++++++++++++++
2 files changed, 35 insertions(+)
create mode 100755 tests/imtcp-tls-gtls-x509name-legacy.sh
diff --git a/tests/Makefile.am b/tests/Makefile.am
index a68b6eb..9cc18a4 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -1267,6 +1267,7 @@ TESTS += \
imtcp-tls-gtls-x509fingerprint.sh \
imtcp-tls-gtls-x509name-invld.sh \
imtcp-tls-gtls-x509name.sh \
+ imtcp-tls-gtls-x509name-legacy.sh \
imtcp-drvr-in-input-basic.sh \
imtcp-multi-drvr-basic.sh \
imtcp-multi-drvr-basic-parallel.sh
@@ -2130,6 +2131,7 @@ EXTRA_DIST= \
imtcp-tls-gtls-x509fingerprint.sh \
imtcp-tls-gtls-x509name-invld.sh \
imtcp-tls-gtls-x509name.sh \
+ imtcp-tls-gtls-x509name-legacy.sh \
imtcp-drvr-in-input-basic.sh \
imtcp-multi-drvr-basic.sh \
imtcp-multi-drvr-basic-parallel.sh \
diff --git a/tests/imtcp-tls-gtls-x509name-legacy.sh b/tests/imtcp-tls-gtls-x509name-legacy.sh
new file mode 100755
index 0000000..c2c9bdd
--- /dev/null
+++ b/tests/imtcp-tls-gtls-x509name-legacy.sh
@@ -0,0 +1,33 @@
+#!/bin/bash
+# This file is part of the rsyslog project, released under ASL 2.0
+. ${srcdir:=.}/diag.sh init
+export NUMMESSAGES=1
+generate_conf
+add_conf '
+global( defaultNetstreamDriverCAFile="'$srcdir/tls-certs/ca.pem'"
+ defaultNetstreamDriverCertFile="'$srcdir/tls-certs/cert.pem'"
+ defaultNetstreamDriverKeyFile="'$srcdir/tls-certs/key.pem'"
+)
+
+
+# NOTE: we intentionally use legacy statements here! This *IS* what we want to test!
+$ModLoad ../plugins/imtcp/.libs/imtcp
+$inputTcpserverStreamdriverPermittedPeer rsyslog-client
+
+input(type="imtcp" port="0" listenPortFileName="'$RSYSLOG_DYNNAME'.tcpflood_port"
+ StreamDriver.Name="gtls"
+ StreamDriver.Mode="1"
+ StreamDriver.AuthMode="x509/name")
+
+template(name="outfmt" type="string" string="%msg:F,58:2%\n")
+:msg, contains, "msgnum:" action( type="omfile"
+ template="outfmt"
+ file=`echo $RSYSLOG_OUT_LOG`)
+'
+startup
+tcpflood -p'$TCPFLOOD_PORT' -m$NUMMESSAGES -Ttls -x$srcdir/tls-certs/ca.pem -Z$srcdir/tls-certs/cert.pem -z$srcdir/tls-certs/key.pem
+wait_file_lines
+shutdown_when_empty
+wait_shutdown
+seq_check
+exit_test
--
2.27.0

View File

@ -1,258 +0,0 @@
From ba00a9f25293f72137c9a85010276cca014ae7f0 Mon Sep 17 00:00:00 2001
From: Rainer Gerhards <rgerhards@adiscon.com>
Date: Wed, 31 Aug 2022 17:37:07 +0200
Subject: [PATCH] core bugfix: correct local host name after config processing
rsyslog.conf may affect the host's local name. These changes were
so far only activated after the first HUP. This patch now ensures
that the configured local host name is applied correctly throughout
all processing, including early startup.
This patch causes a slight change of behaviour. However, the behaviour
was inconsitent before. Now it is consistent and according to the config.
Please note: this patch also exposes a global entry point via "regular"
dynamic loading as this makes things much easier to do. This is in-line
with ongoing simplification effort.
Finally, we also remove a CI test that we do no longer need because
the problem covered is now addressed differently and the original issue
can no longer occur.
closes https://github.com/rsyslog/rsyslog/issues/4975
Conflict:NA
Reference:https://github.com/rsyslog/rsyslog/commit/ba00a9f25293f72137c9a85010276cca014ae7f0
---
runtime/glbl.c | 16 +++++++++++---
runtime/glbl.h | 3 ++-
runtime/rsyslog.h | 2 +-
tests/Makefile.am | 6 ------
tests/hostname-getaddrinfo-fail.sh | 34 ------------------------------
tools/iminternal.c | 7 +++++-
tools/rsyslogd.c | 10 ++-------
7 files changed, 24 insertions(+), 54 deletions(-)
delete mode 100755 tests/hostname-getaddrinfo-fail.sh
diff --git a/runtime/glbl.c b/runtime/glbl.c
index 52a598f..4feefc4 100644
--- a/runtime/glbl.c
+++ b/runtime/glbl.c
@@ -619,8 +619,8 @@ SetLocalHostName(uchar *const newname)
/* return our local hostname. if it is not set, "[localhost]" is returned
*/
-static uchar*
-GetLocalHostName(void)
+uchar*
+glblGetLocalHostName(void)
{
uchar *pszRet;
@@ -910,6 +910,8 @@ CODESTARTobjQueryInterface(glbl)
pIf->GetOption_DisallowWarning = getOption_DisallowWarning;
pIf->SetParseHOSTNAMEandTAG = setParseHOSTNAMEandTAG;
pIf->GetParseHOSTNAMEandTAG = getParseHOSTNAMEandTAG;
+ pIf->GetLocalHostName = glblGetLocalHostName;
+ pIf->SetLocalHostName = SetLocalHostName;
#define SIMP_PROP(name) \
pIf->Get##name = Get##name; \
pIf->Set##name = Set##name;
@@ -917,7 +919,6 @@ CODESTARTobjQueryInterface(glbl)
SIMP_PROP(DropMalPTRMsgs);
SIMP_PROP(mainqCnfObj);
SIMP_PROP(LocalFQDNName)
- SIMP_PROP(LocalHostName)
SIMP_PROP(LocalDomain)
SIMP_PROP(StripDomains)
SIMP_PROP(LocalHosts)
@@ -1541,6 +1542,15 @@ glblDoneLoadCnf(void)
stddbg = -1;
}
+ /* we have now read the config. We need to query the local host name now
+ * as it was set by the config.
+ *
+ * Note: early messages are already emited, and have "[localhost]" as
+ * hostname. These messages are currently in iminternal queue. Once they
+ * are taken from that queue, the hostname will be adapted.
+ */
+ queryLocalHostname();
+
finalize_it: RETiRet;
}
diff --git a/runtime/glbl.h b/runtime/glbl.h
index 9ccf7b6..4cb5770 100644
--- a/runtime/glbl.h
+++ b/runtime/glbl.h
@@ -8,7 +8,7 @@
* Please note that there currently is no glbl.c file as we do not yet
* have any implementations.
*
- * Copyright 2008-2019 Rainer Gerhards and Adiscon GmbH.
+ * Copyright 2008-2022 Rainer Gerhards and Adiscon GmbH.
*
* This file is part of the rsyslog runtime library.
*
@@ -162,5 +162,6 @@ const uchar* glblGetOperatingStateFile(void);
int glblGetOversizeMsgInputMode(void);
int glblReportOversizeMessage(void);
void glblReportChildProcessExit(const uchar *name, pid_t pid, int status);
+uchar *glblGetLocalHostName(void);
#endif /* #ifndef GLBL_H_INCLUDED */
diff --git a/runtime/rsyslog.h b/runtime/rsyslog.h
index 6492eea..58f8219 100644
--- a/runtime/rsyslog.h
+++ b/runtime/rsyslog.h
@@ -757,8 +757,8 @@ rsRetVal rsrtInit(const char **ppErrObj, obj_if_t *pObjIF);
rsRetVal rsrtExit(void);
int rsrtIsInit(void);
void rsrtSetErrLogger(void (*errLogger)(const int, const int, const uchar*));
-
void dfltErrLogger(const int, const int, const uchar *errMsg);
+rsRetVal queryLocalHostname(void);
/* this define below is (later) intended to be used to implement empty
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 5e4f4fe..34b5b38 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -175,7 +175,6 @@ TESTS += \
timestamp-mysql.sh \
timestamp-pgsql.sh \
timestamp-subseconds.sh \
- hostname-getaddrinfo-fail.sh \
msleep_usage_output.sh \
mangle_qi_usage_output.sh \
minitcpsrv_usage_output.sh \
@@ -1608,10 +1607,6 @@ TESTS += \
endif
endif # ENABLE_OMAMQP1
-# test samples...
-#empty-hostname.log: hostname-getaddrinfo-fail.log
-#hostname-getaddrinfo-fail.log: empty-hostname.log
-
endif # if ENABLE_TESTBENCH
TESTS_ENVIRONMENT = RSYSLOG_MODDIR='$(abs_top_builddir)'/runtime/.libs/
@@ -1648,7 +1643,6 @@ EXTRA_DIST= \
config_enabled-off.sh \
empty-app-name.sh \
empty-hostname.sh \
- hostname-getaddrinfo-fail.sh \
hostname-with-slash-pmrfc5424.sh \
hostname-with-slash-pmrfc3164.sh \
pmrfc3164-msgFirstSpace.sh \
diff --git a/tests/hostname-getaddrinfo-fail.sh b/tests/hostname-getaddrinfo-fail.sh
deleted file mode 100755
index d14a1c3..0000000
--- a/tests/hostname-getaddrinfo-fail.sh
+++ /dev/null
@@ -1,34 +0,0 @@
-#!/bin/bash
-# This test check what happens if we cannot doe getaddrinfo early
-# in rsyslog startup (this has caused an error in the past). Even more
-# importantly, it checks that error messages can be issued very early
-# during startup.
-# Note that we use the override of the hostname to ensure we do not
-# accidentally get an acceptable FQDN-type hostname during testing.
-#
-# IMPORTANT: We cannot use the regular plumbing here, as our preload
-# interferes with socket operations (we cannot bind the port for some
-# reason). As we do not necessarily need the full plumbing for this
-# simple test, we emulate what we need. It's a bit ugly, but actually
-# the simplest way forward.
-#
-# This is part of the rsyslog testbench, licensed under ASL 2.0
-. ${srcdir:=.}/diag.sh init
-skip_platform "AIX" "we cannot preload required dummy lib"
-
-echo 'action(type="omfile" file="'$RSYSLOG_DYNNAME'.out.log")' > ${RSYSLOG_DYNNAME}.conf
-LD_PRELOAD=".libs/liboverride_gethostname_nonfqdn.so:.libs/liboverride_getaddrinfo.so" \
- ../tools/rsyslogd -C -n -i$RSYSLOG_DYNNAME.pid -M../runtime/.libs:../.libs -f${RSYSLOG_DYNNAME}.conf &
-wait_process_startup $RSYSLOG_DYNNAME
-sleep 1 # wait a bit so that rsyslog can do some processing...
-kill $(cat $RSYSLOG_DYNNAME.pid )
-
-grep " nonfqdn " < $RSYSLOG_DYNNAME.out.log
-if [ ! $? -eq 0 ]; then
- echo "expected hostname \"nonfqdn\" not found in logs, $RSYSLOG_DYNNAME.out.log is:"
- cat $RSYSLOG_DYNNAME.out.log
- error_exit 1
-fi;
-
-echo EVERYTHING OK - error messages are just as expected!
-exit_test
diff --git a/tools/iminternal.c b/tools/iminternal.c
index 52e9df8..c4dd548 100644
--- a/tools/iminternal.c
+++ b/tools/iminternal.c
@@ -6,7 +6,7 @@
*
* File begun on 2007-08-03 by RGerhards
*
- * Copyright 2007-2017 Rainer Gerhards and Adiscon GmbH.
+ * Copyright 2007-2022 Rainer Gerhards and Adiscon GmbH.
*
* This file is part of rsyslog.
*
@@ -37,6 +37,7 @@
#include "syslogd.h"
#include "linkedlist.h"
#include "iminternal.h"
+#include "unicode-helper.h"
static linkedList_t llMsgs;
static pthread_mutex_t mutList = PTHREAD_MUTEX_INITIALIZER;
@@ -137,6 +138,10 @@ rsRetVal iminternalRemoveMsg(smsg_t **ppMsg)
pthread_mutex_lock(&mutList);
CHKiRet(llGetNextElt(&llMsgs, &llCookie, (void*)&pThis));
+ if(!strcmp((char*)pThis->pMsg->pszHOSTNAME, "[localhost]")) {
+ /* early (pre-conf) startup message detected, need to set real hostname now */
+ MsgSetHOSTNAME(pThis->pMsg, glblGetLocalHostName(), ustrlen(glblGetLocalHostName()));
+ }
*ppMsg = pThis->pMsg;
pThis->pMsg = NULL; /* we do no longer own it - important for destructor */
diff --git a/tools/rsyslogd.c b/tools/rsyslogd.c
index 8410d44..9dedd2f 100644
--- a/tools/rsyslogd.c
+++ b/tools/rsyslogd.c
@@ -3,7 +3,7 @@
* because it was either written from scratch by me (rgerhards) or
* contributors who agreed to ASL 2.0.
*
- * Copyright 2004-2019 Rainer Gerhards and Adiscon
+ * Copyright 2004-2022 Rainer Gerhards and Adiscon
*
* This file is part of rsyslog.
*
@@ -231,7 +231,7 @@ setsid(void)
#endif
-static rsRetVal
+rsRetVal
queryLocalHostname(void)
{
uchar *LocalHostName = NULL;
@@ -1384,12 +1384,6 @@ initAll(int argc, char **argv)
exit(1); /* "good" exit, leaving at init for fatal error */
}
- /* get our host and domain names - we need to do this early as we may emit
- * error log messages, which need the correct hostname. -- rgerhards, 2008-04-04
- * But we need to have imInternal up first!
- */
- queryLocalHostname();
-
/* we now can emit error messages "the regular way" */
if(getenv("TZ") == NULL) {
--
2.27.0

View File

@ -1,96 +0,0 @@
From 1ac3312e5a1e809158a0cccd5a332d3a67562a4f Mon Sep 17 00:00:00 2001
From: Andre lorbach <alorbach@adiscon.com>
Date: Mon, 22 Nov 2021 23:08:08 +0100
Subject: [PATCH] imtcp: fix memory leak in afterRun Code
- tcpsrv_etry_t was left in memory, is now freed
- Fix copy&paste error for pszLstnPortFileName init
- Free cnf_params if createInstance init fails
closes: https://github.com/rsyslog/rsyslog/issues/4646
Conflict:NA
Reference:https://github.com/rsyslog/rsyslog/commit/1ac3312e5a1e809158a0cccd5a332d3a67562a4f
---
plugins/imtcp/imtcp.c | 18 ++++++++++--------
1 file changed, 10 insertions(+), 8 deletions(-)
diff --git a/plugins/imtcp/imtcp.c b/plugins/imtcp/imtcp.c
index 98a060e4c9..0e689a28d8 100644
--- a/plugins/imtcp/imtcp.c
+++ b/plugins/imtcp/imtcp.c
@@ -350,7 +350,7 @@ createInstance(instanceConf_t **pinst)
instanceConf_t *inst = NULL;
DEFiRet;
- CHKmalloc(inst = malloc(sizeof(instanceConf_t)));
+ CHKmalloc(inst = (instanceConf_t*) calloc(1, sizeof(instanceConf_t)));
CHKmalloc(inst->cnf_params = (tcpLstnParams_t*) calloc(1, sizeof(tcpLstnParams_t)));
inst->next = NULL;
inst->pszBindRuleset = NULL;
@@ -400,6 +400,7 @@ createInstance(instanceConf_t **pinst)
*pinst = inst;
finalize_it:
if(iRet != RS_RET_OK) {
+ free(inst->cnf_params);
free(inst);
}
RETiRet;
@@ -431,7 +432,7 @@ static rsRetVal addInstance(void __attribute__((unused)) *pVal, uchar *pNewVal)
CHKmalloc(inst->cnf_params->pszAddr = ustrdup(cs.lstnIP));
}
if((cs.lstnPortFile == NULL) || (cs.lstnPortFile[0] == '\0')) {
- inst->cnf_params->pszAddr = NULL;
+ inst->cnf_params->pszLstnPortFileName = NULL;
} else {
CHKmalloc(inst->cnf_params->pszLstnPortFileName = ustrdup(cs.lstnPortFile));
}
@@ -706,7 +707,6 @@ CODESTARTbeginCnfLoad
loadModConf->bPreserveCase = 1; /* default to true */
bLegacyCnfModGlobalsPermitted = 1;
/* init legacy config variables */
- cs.pszStrmDrvrAuthMode = NULL;
resetConfigVariables(NULL, NULL); /* dummy parameters just to fulfill interface def */
ENDbeginCnfLoad
@@ -906,9 +906,9 @@ ENDactivateCnf
BEGINfreeCnf
instanceConf_t *inst, *del;
CODESTARTfreeCnf
+ free(pModConf->gnutlsPriorityString);
free(pModConf->pszStrmDrvrName);
free(pModConf->pszStrmDrvrAuthMode);
- free(pModConf->gnutlsPriorityString);
free(pModConf->pszStrmDrvrPermitExpiredCerts);
free(pModConf->pszStrmDrvrCAFile);
free(pModConf->pszStrmDrvrKeyFile);
@@ -1024,12 +1024,14 @@ ENDwillRun
BEGINafterRun
CODESTARTafterRun
tcpsrv_etry_t *etry = tcpsrv_root;
+ tcpsrv_etry_t *del;
while(etry != NULL) {
iRet = tcpsrv.Destruct(&etry->tcpsrv);
// TODO: check iRet, reprot error
+ del = etry;
etry = etry->next;
+ free(del);
}
-
net.clearAllowedSenders(UCHAR_CONSTANT("TCP"));
ENDafterRun
@@ -1068,11 +1070,11 @@ resetConfigVariables(uchar __attribute__((unused)) *pp, void __attribute__((unus
cs.iAddtlFrameDelim = TCPSRV_NO_ADDTL_DELIMITER;
cs.maxFrameSize = 200000;
cs.bDisableLFDelim = 0;
- free(cs.pszInputName);
- cs.pszInputName = NULL;
+ cs.bPreserveCase = 1;
free(cs.pszStrmDrvrAuthMode);
cs.pszStrmDrvrAuthMode = NULL;
- cs.bPreserveCase = 1;
+ free(cs.pszInputName);
+ cs.pszInputName = NULL;
free(cs.lstnPortFile);
cs.lstnPortFile = NULL;
return RS_RET_OK;

View File

@ -1,268 +0,0 @@
From 325203e4e2b2cc53283d9dbdff0aa677aded1e0d Mon Sep 17 00:00:00 2001
From: Andre lorbach <alorbach@adiscon.com>
Date: Wed, 9 Mar 2022 17:58:05 +0100
Subject: [PATCH] gnutls bugfix: Fix error handling in gtlsRecordRecv
There was a rare possibility that the E_AGAIN/E_INTERRUPT handling
could cause an infinite loop (100% CPU Usage), for example when a TLS
handshake is interrupted at a certain stage.
- After gnutls_record_recv is called, and E_AGAIN/E_INTERRUPT error
occurs, we need to do additional read/write direction handling
with gnutls_record_get_direction.
- After the second call of gnutls_record_recv (Expand buffer)
we needed to also check the eror codes for E_AGAIN/E_INTERRUPT
to do propper errorhandling.
- Add extra debug output based on ossl driver.
- Potential fix for 100% CPU Loop Receiveloop after gtlsRecordRecv
in doRetry call.
see also: https://github.com/rsyslog/rsyslog/issues/4818
Conflict:NA
Reference:https://github.com/rsyslog/rsyslog/commit/aefcfa4d0f6e213c9fac814c3e6bd53970b7e90e
---
runtime/nsd_gtls.c | 39 ++++++++++++++++++++++++++++++---------
runtime/nsd_gtls.h | 5 +++++
runtime/nsdsel_gtls.c | 28 +++++++++++++++++++++-------
runtime/tcpsrv.c | 11 +++++++----
tests/imtcp-tls-basic.sh | 3 +++
5 files changed, 66 insertions(+), 20 deletions(-)
diff --git a/runtime/nsd_gtls.c b/runtime/nsd_gtls.c
index 6fc300c..01b0ec6 100644
--- a/runtime/nsd_gtls.c
+++ b/runtime/nsd_gtls.c
@@ -550,8 +550,10 @@ gtlsRecordRecv(nsd_gtls_t *pThis)
DEFiRet;
ISOBJ_TYPE_assert(pThis, nsd_gtls);
- DBGPRINTF("gtlsRecordRecv: start\n");
+ DBGPRINTF("gtlsRecordRecv: start (Pending Data: %zd | Wanted Direction: %s)\n",
+ gnutls_record_check_pending(pThis->sess),
+ (gnutls_record_get_direction(pThis->sess) == gtlsDir_READ ? "READ" : "WRITE") );
lenRcvd = gnutls_record_recv(pThis->sess, pThis->pszRcvBuf, NSD_GTLS_MAX_RCVBUF);
if(lenRcvd >= 0) {
DBGPRINTF("gtlsRecordRecv: gnutls_record_recv received %zd bytes\n", lenRcvd);
@@ -575,14 +577,30 @@ gtlsRecordRecv(nsd_gtls_t *pThis)
(NSD_GTLS_MAX_RCVBUF+lenRcvd));
pThis->lenRcvBuf = NSD_GTLS_MAX_RCVBUF+lenRcvd;
} else {
- goto sslerr;
+ if (lenRcvd == GNUTLS_E_AGAIN || lenRcvd == GNUTLS_E_INTERRUPTED) {
+ goto sslerragain; /* Go to ERR AGAIN handling */
+ } else {
+ /* Do all other error handling */
+ int gnuRet = lenRcvd;
+ ABORTgnutls;
+ }
}
}
} else if(lenRcvd == GNUTLS_E_AGAIN || lenRcvd == GNUTLS_E_INTERRUPTED) {
-sslerr:
- pThis->rtryCall = gtlsRtry_recv;
- dbgprintf("GnuTLS receive requires a retry (this most probably is OK and no error condition)\n");
- ABORT_FINALIZE(RS_RET_RETRY);
+sslerragain:
+ /* Check if the underlaying file descriptor needs to read or write data!*/
+ if (gnutls_record_get_direction(pThis->sess) == gtlsDir_READ) {
+ pThis->rtryCall = gtlsRtry_recv;
+ dbgprintf("GnuTLS receive requires a retry, this most probably is OK and no error condition\n");
+ ABORT_FINALIZE(RS_RET_RETRY);
+ } else {
+ uchar *pErr = gtlsStrerror(lenRcvd);
+ LogError(0, RS_RET_GNUTLS_ERR, "GnuTLS receive error %zd has wrong read direction(wants write) "
+ "- this could be caused by a broken connection. GnuTLS reports: %s\n",
+ lenRcvd, pErr);
+ free(pErr);
+ ABORT_FINALIZE(RS_RET_GNUTLS_ERR);
+ }
} else {
int gnuRet = lenRcvd;
ABORTgnutls;
@@ -2031,6 +2049,7 @@ static rsRetVal
Send(nsd_t *pNsd, uchar *pBuf, ssize_t *pLenBuf)
{
int iSent;
+ int wantsWriteData = 0;
nsd_gtls_t *pThis = (nsd_gtls_t*) pNsd;
DEFiRet;
ISOBJ_TYPE_assert(pThis, nsd_gtls);
@@ -2051,10 +2070,12 @@ Send(nsd_t *pNsd, uchar *pBuf, ssize_t *pLenBuf)
break;
}
if(iSent != GNUTLS_E_INTERRUPTED && iSent != GNUTLS_E_AGAIN) {
+ /* Check if the underlaying file descriptor needs to read or write data!*/
+ wantsWriteData = gnutls_record_get_direction(pThis->sess);
uchar *pErr = gtlsStrerror(iSent);
- LogError(0, RS_RET_GNUTLS_ERR, "unexpected GnuTLS error %d - this "
- "could be caused by a broken connection. GnuTLS reports: %s \n",
- iSent, pErr);
+ LogError(0, RS_RET_GNUTLS_ERR, "unexpected GnuTLS error %d, wantsWriteData=%d - this "
+ "could be caused by a broken connection. GnuTLS reports: %s\n",
+ iSent, wantsWriteData, pErr);
free(pErr);
gnutls_perror(iSent);
ABORT_FINALIZE(RS_RET_GNUTLS_ERR);
diff --git a/runtime/nsd_gtls.h b/runtime/nsd_gtls.h
index a3ef59f..b9988ae 100644
--- a/runtime/nsd_gtls.h
+++ b/runtime/nsd_gtls.h
@@ -33,6 +33,11 @@ typedef enum {
gtlsRtry_recv = 2
} gtlsRtryCall_t; /**< IDs of calls that needs to be retried */
+typedef enum {
+ gtlsDir_READ = 0, /**< GNUTLS wants READ */
+ gtlsDir_WRITE = 1 /**< GNUTLS wants WRITE */
+} gtlsDirection_t;
+
typedef nsd_if_t nsd_gtls_if_t; /* we just *implement* this interface */
/* the nsd_gtls object */
diff --git a/runtime/nsdsel_gtls.c b/runtime/nsdsel_gtls.c
index 6ed7187..01cfb05 100644
--- a/runtime/nsdsel_gtls.c
+++ b/runtime/nsdsel_gtls.c
@@ -81,6 +81,7 @@ Add(nsdsel_t *pNsdsel, nsd_t *pNsd, nsdsel_waitOp_t waitOp)
ISOBJ_TYPE_assert(pThis, nsdsel_gtls);
ISOBJ_TYPE_assert(pNsdGTLS, nsd_gtls);
+ DBGPRINTF("Add on nsd %p:\n", pNsdGTLS);
if(pNsdGTLS->iMode == 1) {
if(waitOp == NSDSEL_RD && gtlsHasRcvInBuffer(pNsdGTLS)) {
++pThis->iBufferRcvReady;
@@ -99,6 +100,7 @@ Add(nsdsel_t *pNsdsel, nsd_t *pNsd, nsdsel_waitOp_t waitOp)
}
}
+ dbgprintf("nsdsel_gtls: reached end on nsd %p, calling nsdsel_ptcp.Add with waitOp %d... \n", pNsdGTLS, waitOp);
/* if we reach this point, we need no special handling */
CHKiRet(nsdsel_ptcp.Add(pThis->pTcp, pNsdGTLS->pTcp, waitOp));
@@ -120,7 +122,8 @@ Select(nsdsel_t *pNsdsel, int *piNumReady)
if(pThis->iBufferRcvReady > 0) {
/* we still have data ready! */
*piNumReady = pThis->iBufferRcvReady;
- dbgprintf("nsdsel_gtls: doing dummy select, data present\n");
+ dbgprintf("nsdsel_gtls: doing dummy select for %p->iBufferRcvReady=%d, data present\n",
+ pThis, pThis->iBufferRcvReady);
} else {
iRet = nsdsel_ptcp.Select(pThis->pTcp, piNumReady);
}
@@ -138,7 +141,7 @@ doRetry(nsd_gtls_t *pNsd)
DEFiRet;
int gnuRet;
- dbgprintf("GnuTLS requested retry of %d operation - executing\n", pNsd->rtryCall);
+ dbgprintf("doRetry: GnuTLS requested retry of %d operation - executing\n", pNsd->rtryCall);
/* We follow a common scheme here: first, we do the systen call and
* then we check the result. So far, the result is checked after the
@@ -151,7 +154,7 @@ doRetry(nsd_gtls_t *pNsd)
case gtlsRtry_handshake:
gnuRet = gnutls_handshake(pNsd->sess);
if(gnuRet == GNUTLS_E_AGAIN || gnuRet == GNUTLS_E_INTERRUPTED) {
- dbgprintf("GnuTLS handshake retry did not finish - "
+ dbgprintf("doRetry: GnuTLS handshake retry did not finish - "
"setting to retry (this is OK and can happen)\n");
FINALIZE;
} else if(gnuRet == 0) {
@@ -167,9 +170,20 @@ doRetry(nsd_gtls_t *pNsd)
}
break;
case gtlsRtry_recv:
- dbgprintf("retrying gtls recv, nsd: %p\n", pNsd);
- CHKiRet(gtlsRecordRecv(pNsd));
- pNsd->rtryCall = gtlsRtry_None; /* we are done */
+ dbgprintf("doRetry: retrying gtls recv, nsd: %p\n", pNsd);
+ iRet = gtlsRecordRecv(pNsd);
+ if (iRet == RS_RET_RETRY) {
+ // Check if there is pending data
+ size_t stBytesLeft = gnutls_record_check_pending(pNsd->sess);
+ if (stBytesLeft > 0) {
+ // We are in retry and more data waiting, finalize it
+ goto finalize_it;
+ } else {
+ dbgprintf("doRetry: gtlsRecordRecv returned RETRY, but there is no pending"
+ "data on nsd: %p\n", pNsd);
+ }
+ }
+ pNsd->rtryCall = gtlsRtry_None; /* no more data, we are done */
gnuRet = 0;
break;
case gtlsRtry_None:
@@ -241,7 +255,7 @@ IsReady(nsdsel_t *pNsdsel, nsd_t *pNsd, nsdsel_waitOp_t waitOp, int *pbIsReady)
* socket. -- rgerhards, 2010-11-20
*/
if(pThis->iBufferRcvReady) {
- dbgprintf("nsd_gtls: dummy read, buffer not available for this FD\n");
+ dbgprintf("nsd_gtls: dummy read, %p->buffer not available for this FD\n", pThis);
*pbIsReady = 0;
FINALIZE;
}
diff --git a/runtime/tcpsrv.c b/runtime/tcpsrv.c
index 61c9444..06b9abe 100644
--- a/runtime/tcpsrv.c
+++ b/runtime/tcpsrv.c
@@ -596,14 +596,15 @@ doReceive(tcpsrv_t *pThis, tcps_sess_t **ppSess, nspoll_t *pPoll)
int oserr = 0;
ISOBJ_TYPE_assert(pThis, tcpsrv);
- DBGPRINTF("netstream %p with new data\n", (*ppSess)->pStrm);
+ prop.GetString((*ppSess)->fromHostIP, &pszPeer, &lenPeer);
+ DBGPRINTF("netstream %p with new data from remote peer %s\n", (*ppSess)->pStrm, pszPeer);
/* Receive message */
iRet = pThis->pRcvData(*ppSess, buf, sizeof(buf), &iRcvd, &oserr);
switch(iRet) {
case RS_RET_CLOSED:
if(pThis->bEmitMsgOnClose) {
errno = 0;
- prop.GetString((*ppSess)->fromHostIP, &pszPeer, &lenPeer);
+ // prop.GetString((*ppSess)->fromHostIP, &pszPeer, &lenPeer);
LogError(0, RS_RET_PEER_CLOSED_CONN, "Netstream session %p closed by remote "
"peer %s.\n", (*ppSess)->pStrm, pszPeer);
}
@@ -619,13 +620,13 @@ doReceive(tcpsrv_t *pThis, tcps_sess_t **ppSess, nspoll_t *pPoll)
/* in this case, something went awfully wrong.
* We are instructed to terminate the session.
*/
- prop.GetString((*ppSess)->fromHostIP, &pszPeer, &lenPeer);
+ // prop.GetString((*ppSess)->fromHostIP, &pszPeer, &lenPeer);
LogError(oserr, localRet, "Tearing down TCP Session from %s", pszPeer);
CHKiRet(closeSess(pThis, ppSess, pPoll));
}
break;
default:
- prop.GetString((*ppSess)->fromHostIP, &pszPeer, &lenPeer);
+ // prop.GetString((*ppSess)->fromHostIP, &pszPeer, &lenPeer);
LogError(oserr, iRet, "netstream session %p from %s will be closed due to error",
(*ppSess)->pStrm, pszPeer);
CHKiRet(closeSess(pThis, ppSess, pPoll));
@@ -835,6 +836,8 @@ RunSelect(tcpsrv_t *pThis, nsd_epworkset_t workset[], size_t sizeWorkset)
while(iTCPSess != -1) {
/* TODO: access to pNsd is NOT really CLEAN, use method... */
CHKiRet(nssel.Add(pSel, pThis->pSessions[iTCPSess]->pStrm, NSDSEL_RD));
+ DBGPRINTF("tcpsrv process session %d:\n", iTCPSess);
+
/* now get next... */
iTCPSess = TCPSessGetNxtSess(pThis, iTCPSess);
}
diff --git a/tests/imtcp-tls-basic.sh b/tests/imtcp-tls-basic.sh
index 8643389..58c5946 100755
--- a/tests/imtcp-tls-basic.sh
+++ b/tests/imtcp-tls-basic.sh
@@ -4,6 +4,9 @@
. ${srcdir:=.}/diag.sh init
export NUMMESSAGES=50000
export QUEUE_EMPTY_CHECK_FUNC=wait_seq_check
+# uncomment for debugging support:
+#export RSYSLOG_DEBUG="debug nostdout noprintmutexaction"
+#export RSYSLOG_DEBUGLOG="$RSYSLOG_DYNNAME.debuglog"
generate_conf
add_conf '
global( defaultNetstreamDriverCAFile="'$srcdir'/tls-certs/ca.pem"
--
2.33.0

View File

@ -1,65 +0,0 @@
From 54cbda6cde9bf667d699f7b0093d48a3983edb42 Mon Sep 17 00:00:00 2001
From: Rainer Gerhards <rgerhards@adiscon.com>
Date: Fri, 4 Mar 2022 11:39:11 +0100
Subject: [PATCH] imptcp bugfix: worker thread starvation on extreme traffic
When connectes were totally busy, without any pause, the assigened worker
did never terminate its reading loop. As such, it could not service any
other conenctions. If this happened multiple time and to all configured
workers, all other connections could not be processed at all. This extreme
scenario is very unlikely, as the whole issue is relatively unlikely.
In practice, the issue could lead to somewhat degraded performance and
resolved itself after some time (in practice no connection is 100% busy
for an extended period of time).
Note that this patch sets a fixed limit of 16 iterations for very busy
connections. This sounds like a good compromise between non-starvation
and performance. The exact number may be made configurable if there
is really need to.
Conflict:NA
Reference:https://github.com/rsyslog/rsyslog/commit/34e72ced504458d804f8d1049be67ea8cc00a4b4
---
plugins/imptcp/imptcp.c | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/plugins/imptcp/imptcp.c b/plugins/imptcp/imptcp.c
index e47a7c9..72e32dd 100644
--- a/plugins/imptcp/imptcp.c
+++ b/plugins/imptcp/imptcp.c
@@ -10,7 +10,7 @@
*
* File begun on 2010-08-10 by RGerhards
*
- * Copyright 2007-2018 Rainer Gerhards and Adiscon GmbH.
+ * Copyright 2007-2022 Rainer Gerhards and Adiscon GmbH.
*
* This file is part of rsyslog.
*
@@ -1391,7 +1391,7 @@ addEPollSock(epolld_type_t typ, void *ptr, int sock, epolld_t **pEpd)
epd->ptr = ptr;
epd->sock = sock;
*pEpd = epd;
- epd->ev.events = EPOLLIN|EPOLLET|EPOLLONESHOT;
+ epd->ev.events = EPOLLIN|EPOLLONESHOT;
epd->ev.data.ptr = (void*) epd;
if(epoll_ctl(epollfd, EPOLL_CTL_ADD, sock, &(epd->ev)) != 0) {
@@ -1938,11 +1938,12 @@ sessActivity(ptcpsess_t *const pSess, int *const continue_polling)
int remsock = 0; /* init just to keep compiler happy... :-( */
sbool bEmitOnClose = 0;
char rcvBuf[128*1024];
+ int runs = 0;
DEFiRet;
DBGPRINTF("imptcp: new activity on session socket %d\n", pSess->sock);
- while(1) {
+ while(runs++ < 16) {
lenBuf = sizeof(rcvBuf);
lenRcv = recv(pSess->sock, rcvBuf, lenBuf, 0);
--
2.33.0

View File

@ -1,46 +0,0 @@
From e2d129880b6830bf7d26ab46d957b944f73f96e1 Mon Sep 17 00:00:00 2001
From: Yun Zhou <yun.zhou@windriver.com>
Date: Thu, 24 Mar 2022 16:34:09 +0800
Subject: [PATCH] rsyslogd: adjust the order of doHUP() and processImInternal()
After call doHUP(), probably there is a internal log in the list. However, it
will not be wrote out immediately, because the mainloop will be blocked at
pselect in wait_timeout() until a long timeout or next message occur.
More deadly, the log may be lost if the deamon exits unexpectedly.
We might as well put processImInternal() after doHUP(), so that the message
will be flushed out immediately.
Fixes: 723f6fdfa6(rsyslogd: Fix race between signals and main loop timeout)
Signed-off-by: Yun Zhou <yun.zhou@windriver.com>
Conflict:NA
Reference:https://github.com/rsyslog/rsyslog/commit/857f77906f95681aa15c7ba3f88cbda8952f7e5f
---
tools/rsyslogd.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/tools/rsyslogd.c b/tools/rsyslogd.c
index 9a126dd..8410d44 100644
--- a/tools/rsyslogd.c
+++ b/tools/rsyslogd.c
@@ -1966,8 +1966,6 @@ mainloop(void)
sigaddset(&sigblockset, SIGUSR1);
do {
- processImInternal();
-
pthread_sigmask(SIG_BLOCK, &sigblockset, &origmask);
if(bChildDied) {
reapChild();
@@ -1988,6 +1986,8 @@ mainloop(void)
g_bRecordQueue = 0;
}
+ processImInternal();
+
if(bFinished)
break; /* exit as quickly as possible */
--
2.33.0

View File

@ -1,39 +0,0 @@
From 22bef1c86200e594fd6d5d42fb10647d1303874f Mon Sep 17 00:00:00 2001
From: Rainer Gerhards <rgerhards@adiscon.com>
Date: Tue, 23 Aug 2022 14:45:11 +0200
Subject: [PATCH] tcpsrv: cleanup - remove commented out code
Conflict:NA
Reference:https://github.com/rsyslog/rsyslog/commit/22bef1c86200e594fd6d5d42fb10647d1303874f
---
runtime/tcpsrv.c | 3 ---
1 file changed, 3 deletions(-)
diff --git a/runtime/tcpsrv.c b/runtime/tcpsrv.c
index 2c91c2e..2feb2cc 100644
--- a/runtime/tcpsrv.c
+++ b/runtime/tcpsrv.c
@@ -604,7 +604,6 @@ doReceive(tcpsrv_t *pThis, tcps_sess_t **ppSess, nspoll_t *pPoll)
case RS_RET_CLOSED:
if(pThis->bEmitMsgOnClose) {
errno = 0;
- // prop.GetString((*ppSess)->fromHostIP, &pszPeer, &lenPeer);
LogError(0, RS_RET_PEER_CLOSED_CONN, "Netstream session %p closed by remote "
"peer %s.\n", (*ppSess)->pStrm, pszPeer);
}
@@ -620,13 +619,11 @@ doReceive(tcpsrv_t *pThis, tcps_sess_t **ppSess, nspoll_t *pPoll)
/* in this case, something went awfully wrong.
* We are instructed to terminate the session.
*/
- // prop.GetString((*ppSess)->fromHostIP, &pszPeer, &lenPeer);
LogError(oserr, localRet, "Tearing down TCP Session from %s", pszPeer);
CHKiRet(closeSess(pThis, ppSess, pPoll));
}
break;
default:
- // prop.GetString((*ppSess)->fromHostIP, &pszPeer, &lenPeer);
LogError(oserr, iRet, "netstream session %p from %s will be closed due to error",
(*ppSess)->pStrm, pszPeer);
CHKiRet(closeSess(pThis, ppSess, pPoll));
--
2.27.0

View File

@ -1,32 +0,0 @@
From d909290dc2d9ffab86409e054abd1abaaf998571 Mon Sep 17 00:00:00 2001
From: Iwan Timmer <iwan.timmer@northwave.nl>
Date: Fri, 29 Apr 2022 15:14:27 +0200
Subject: [PATCH] tcpsrv: do not decrease number of to be processed fds on
error
nfds should only be decreased for processed streams and not for
streams returning an error code, like RS_RET_RETRY.
Conflict:NA
Reference:https://github.com/rsyslog/rsyslog/commit/6ffc14fd450b90872272871130d29ab3ecf85f6f
---
runtime/tcpsrv.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/runtime/tcpsrv.c b/runtime/tcpsrv.c
index 06b9abe..2c91c2e 100644
--- a/runtime/tcpsrv.c
+++ b/runtime/tcpsrv.c
@@ -880,7 +880,8 @@ RunSelect(tcpsrv_t *pThis, nsd_epworkset_t workset[], size_t sizeWorkset)
processWorkset(pThis, NULL, iWorkset, workset);
iWorkset = 0;
}
- --nfds; /* indicate we have processed one */
+ if(bIsReady)
+ --nfds; /* indicate we have processed one */
}
iTCPSess = TCPSessGetNxtSess(pThis, iTCPSess);
}
--
2.33.0

View File

@ -1,35 +0,0 @@
From 62167fe37ee7af43d9eca49c8e025fa89959db20 Mon Sep 17 00:00:00 2001
From: Michael Biebl <biebl@debian.org>
Date: Tue, 19 Oct 2021 23:00:50 +0200
Subject: [PATCH] testbench: skip omfwd_fast_imuxsock.sh if liblogging-stdlog
is not available
Fixes #4712
Conflict:NA
Reference:https://github.com/rsyslog/rsyslog/commit/440fd1d51c5aa7763d3d810b542a7e373a6738eb
---
tests/omfwd_fast_imuxsock.sh | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/tests/omfwd_fast_imuxsock.sh b/tests/omfwd_fast_imuxsock.sh
index bb35b58..10f9f19 100755
--- a/tests/omfwd_fast_imuxsock.sh
+++ b/tests/omfwd_fast_imuxsock.sh
@@ -4,6 +4,13 @@
. ${srcdir:=.}/diag.sh init
skip_platform "SunOS" "We have no ATOMIC BUILTINS, so OverallQueueSize counting of imdiag is NOT threadsafe and the counting will fail on SunOS"
+./syslog_caller -fsyslog_inject-l -m0 > /dev/null 2>&1
+no_liblogging_stdlog=$?
+if [ $no_liblogging_stdlog -ne 0 ];then
+ echo "liblogging-stdlog not available - skipping test"
+ exit 77
+fi
+
# export RSYSLOG_DEBUG="debug nologfuncflow noprintmutexaction nostdout"
export NUMMESSAGES=100000
--
2.33.0

View File

@ -1,61 +0,0 @@
From 66c63027b95dce0fcfe50fa8baf2366ac83b340d Mon Sep 17 00:00:00 2001
From: Rainer Gerhards <rgerhards@adiscon.com>
Date: Fri, 22 Apr 2022 09:49:46 +0200
Subject: [PATCH] net bugfix: potential buffer overrun
Conflict:NA
Reference:https://github.com/rsyslog/rsyslog/commit/89955b0bcb1ff105e1374aad7e0e993faa6a038f
---
contrib/imhttp/imhttp.c | 4 +++-
plugins/imptcp/imptcp.c | 4 +++-
runtime/tcps_sess.c | 4 +++-
3 files changed, 9 insertions(+), 3 deletions(-)
diff --git a/contrib/imhttp/imhttp.c b/contrib/imhttp/imhttp.c
index f09260b..95704af 100644
--- a/contrib/imhttp/imhttp.c
+++ b/contrib/imhttp/imhttp.c
@@ -487,7 +487,9 @@ processOctetMsgLen(const instanceConf_t *const inst, struct conn_wrkr_s *connWrk
connWrkr->parseState.iOctetsRemain = connWrkr->parseState.iOctetsRemain * 10 + ch - '0';
}
// temporarily save this character into the message buffer
- connWrkr->pMsg[connWrkr->iMsg++] = ch;
+ if(connWrkr->iMsg + 1 < s_iMaxLine) {
+ connWrkr->pMsg[connWrkr->iMsg++] = ch;
+ }
} else {
const char *remoteAddr = "";
if (connWrkr->propRemoteAddr) {
diff --git a/plugins/imptcp/imptcp.c b/plugins/imptcp/imptcp.c
index cdd29d4..e47a7c9 100644
--- a/plugins/imptcp/imptcp.c
+++ b/plugins/imptcp/imptcp.c
@@ -1107,7 +1107,9 @@ processDataRcvd(ptcpsess_t *const __restrict__ pThis,
if(pThis->iOctetsRemain <= 200000000) {
pThis->iOctetsRemain = pThis->iOctetsRemain * 10 + c - '0';
}
- *(pThis->pMsg + pThis->iMsg++) = c;
+ if(pThis->iMsg < iMaxLine) {
+ *(pThis->pMsg + pThis->iMsg++) = c;
+ }
} else { /* done with the octet count, so this must be the SP terminator */
DBGPRINTF("TCP Message with octet-counter, size %d.\n", pThis->iOctetsRemain);
prop.GetString(pThis->peerName, &propPeerName, &lenPeerName);
diff --git a/runtime/tcps_sess.c b/runtime/tcps_sess.c
index b12d873..0831192 100644
--- a/runtime/tcps_sess.c
+++ b/runtime/tcps_sess.c
@@ -389,7 +389,9 @@ processDataRcvd(tcps_sess_t *pThis,
if(pThis->iOctetsRemain <= 200000000) {
pThis->iOctetsRemain = pThis->iOctetsRemain * 10 + c - '0';
}
- *(pThis->pMsg + pThis->iMsg++) = c;
+ if(pThis->iMsg < iMaxLine) {
+ *(pThis->pMsg + pThis->iMsg++) = c;
+ }
} else { /* done with the octet count, so this must be the SP terminator */
DBGPRINTF("TCP Message with octet-counter, size %d.\n", pThis->iOctetsRemain);
prop.GetString(pThis->fromHost, &propPeerName, &lenPeerName);
--
2.27.0

View File

@ -1,11 +1,16 @@
From 71e9b4eda329fc9e59fbbcdc86353a7609f8d383 Mon Sep 17 00:00:00 2001
From 71e9b4eda329fc9e59fbbcdc86353a7690f8d383 Mon Spe 17 00:00:00 2001
From: guoxiaoqi <guoxiaoqi2@huawei.com>
Date: Tue, 26 Feb 2019 23:33:08 +0000
Subject: [PATCH] add configuration to avoid memory leak for bugfix of rsyslog-7.4.7
Subject: [PATCH] bugfix-rsyslog-7.4.7-add-configuration-to-avoid-memory-leak
reason: add configuration to avoid memory leak for bugfix of rsyslog-7.4.7
reason: add configuration to avoid memory leak for bugfix of rsyslog-7.4.7i
---
From a633ee629468562499ead31e26c8dfca5a5f3293 Mon Sep 17 00:00:00 2001
From: pengyi <pengyi37@huawei.com>
Date: Fri, 3 Feb 2023 15:26:23 +0800
Subject: [PATCH] bugfix-rsyslog-7.4.7-add-configuration-to-avoid-memory-leak
Signed-off-by: guoxiaoqi <guoxiaoqi2@huawei.com>
V-2: adapt due to line mismatch
---
action.c | 7 ++++++-
runtime/queue.c | 30 +++++++++++++++++++++++++++++-
@ -13,10 +18,10 @@ Signed-off-by: guoxiaoqi <guoxiaoqi2@huawei.com>
3 files changed, 37 insertions(+), 2 deletions(-)
diff --git a/action.c b/action.c
index 1bc0ad2..e973f72 100644
index 4c3b581..4fa53ed 100644
--- a/action.c
+++ b/action.c
@@ -174,6 +174,7 @@ typedef struct configSettings_s {
@@ -176,6 +176,7 @@ typedef struct configSettings_s {
int iActionQWrkMinMsgs; /* minimum messages per worker needed to start a new one */
int bActionQSaveOnShutdown; /* save queue on shutdown (when DA enabled)? */
int64 iActionQueMaxDiskSpace; /* max disk space allocated 0 ==> unlimited */
@ -24,7 +29,7 @@ index 1bc0ad2..e973f72 100644
int iActionQueueDeqSlowdown; /* dequeue slowdown (simple rate limiting) */
int iActionQueueDeqtWinFromHr; /* hour begin of time frame when queue is to be dequeued */
int iActionQueueDeqtWinToHr; /* hour begin of time frame when queue is to be dequeued */
@@ -309,7 +310,8 @@ actionResetQueueParams(void)
@@ -303,7 +304,8 @@ actionResetQueueParams(void)
cs.iActionQtoWrkShutdown = 60000; /* timeout for worker thread shutdown */
cs.iActionQWrkMinMsgs = -1; /* minimum messages per worker needed to start a new one */
cs.bActionQSaveOnShutdown = 1; /* save queue on shutdown (when DA enabled)? */
@ -34,7 +39,7 @@ index 1bc0ad2..e973f72 100644
cs.iActionQueueDeqSlowdown = 0;
cs.iActionQueueDeqtWinFromHr = 0;
cs.iActionQueueDeqtWinToHr = 25; /* 25 disables time windowed dequeuing */
@@ -543,6 +545,7 @@ actionConstructFinalize(action_t *__restrict__ const pThis, struct nvlst *lst)
@@ -539,6 +541,7 @@ actionConstructFinalize(action_t *__restrict__ const pThis, struct nvlst *lst)
error %d. Ignored, running with default setting", iRet); \
}
setQPROP(qqueueSetsizeOnDiskMax, "$ActionQueueMaxDiskSpace", cs.iActionQueMaxDiskSpace);
@ -42,7 +47,7 @@ index 1bc0ad2..e973f72 100644
setQPROP(qqueueSetiDeqBatchSize, "$ActionQueueDequeueBatchSize", cs.iActionQueueDeqBatchSize);
setQPROP(qqueueSetMaxFileSize, "$ActionQueueFileSize", cs.iActionQueMaxFileSize);
setQPROPstr(qqueueSetFilePrefix, "$ActionQueueFileName", cs.pszActionQFName);
@@ -2229,6 +2232,8 @@ rsRetVal actionClassInit(void)
@@ -2318,6 +2321,8 @@ rsRetVal actionClassInit(void)
&cs.iActionQueueDeqBatchSize, NULL));
CHKiRet(regCfSysLineHdlr((uchar *)"actionqueuemaxdiskspace", 0, eCmdHdlrSize, NULL,
&cs.iActionQueMaxDiskSpace, NULL));
@ -52,7 +57,7 @@ index 1bc0ad2..e973f72 100644
&cs.iActionQHighWtrMark, NULL));
CHKiRet(regCfSysLineHdlr((uchar *)"actionqueuelowwatermark", 0, eCmdHdlrInt, NULL,
diff --git a/runtime/queue.c b/runtime/queue.c
index 23de366..0c2485c 100644
index bd3fb8e..de9c619 100644
--- a/runtime/queue.c
+++ b/runtime/queue.c
@@ -46,6 +46,7 @@
@ -63,7 +68,7 @@ index 23de366..0c2485c 100644
#include "rsyslog.h"
#include "queue.h"
@@ -125,6 +126,7 @@ static struct cnfparamdescr cnfpdescr[] = {
@@ -115,6 +116,7 @@ static struct cnfparamdescr cnfpdescr[] = {
{ "queue.mindequeuebatchsize", eCmdHdlrInt, 0 },
{ "queue.mindequeuebatchsize.timeout", eCmdHdlrInt, 0 },
{ "queue.maxdiskspace", eCmdHdlrSize, 0 },
@ -71,7 +76,7 @@ index 23de366..0c2485c 100644
{ "queue.highwatermark", eCmdHdlrInt, 0 },
{ "queue.lowwatermark", eCmdHdlrInt, 0 },
{ "queue.fulldelaymark", eCmdHdlrInt, 0 },
@@ -472,6 +474,7 @@ StartDA(qqueue_t *pThis)
@@ -464,6 +466,7 @@ StartDA(qqueue_t *pThis)
CHKiRet(qqueueSetpAction(pThis->pqDA, pThis->pAction));
CHKiRet(qqueueSetsizeOnDiskMax(pThis->pqDA, pThis->sizeOnDiskMax));
@ -79,7 +84,7 @@ index 23de366..0c2485c 100644
CHKiRet(qqueueSetiDeqSlowdown(pThis->pqDA, pThis->iDeqSlowdown));
CHKiRet(qqueueSetMaxFileSize(pThis->pqDA, pThis->iMaxFileSize));
CHKiRet(qqueueSetFilePrefix(pThis->pqDA, pThis->pszFilePrefix, pThis->lenFilePrefix));
@@ -1016,6 +1019,20 @@ qAddDisk(qqueue_t *const pThis, smsg_t* pMsg)
@@ -1019,6 +1022,20 @@ qAddDisk(qqueue_t *const pThis, smsg_t* pMsg)
ISOBJ_TYPE_assert(pMsg, msg);
number_t nWriteCount;
const int oldfile = strmGetCurrFileNum(pThis->tVars.disk.pWrite);
@ -100,7 +105,7 @@ index 23de366..0c2485c 100644
CHKiRet(strm.SetWCntr(pThis->tVars.disk.pWrite, &nWriteCount));
CHKiRet((objSerialize(pMsg))(pMsg, pThis->tVars.disk.pWrite));
@@ -1047,6 +1064,13 @@ qAddDisk(qqueue_t *const pThis, smsg_t* pMsg)
@@ -1050,6 +1067,13 @@ qAddDisk(qqueue_t *const pThis, smsg_t* pMsg)
}
finalize_it:
@ -114,8 +119,8 @@ index 23de366..0c2485c 100644
RETiRet;
}
@@ -1544,7 +1568,8 @@ qqueueSetDefaultsActionQueue(qqueue_t *pThis)
pThis->toWrkShutdown = actq_dflt_toWrkShutdown; /* timeout for worker thread shutdown */
@@ -1546,7 +1570,8 @@ qqueueSetDefaultsActionQueue(qqueue_t *pThis)
pThis->toWrkShutdown = loadConf->globals.actq_dflt_toWrkShutdown; /* timeout for worker thread shutdown */
pThis->iMinMsgsPerWrkr = -1; /* minimum messages per worker needed to start a new one */
pThis->bSaveOnShutdown = 1; /* save queue on shutdown (when DA enabled)? */
- pThis->sizeOnDiskMax = 0; /* unlimited */
@ -124,7 +129,7 @@ index 23de366..0c2485c 100644
pThis->iDeqSlowdown = 0;
pThis->iDeqtWinFromHr = 0;
pThis->iDeqtWinToHr = 25; /* disable time-windowed dequeuing by default */
@@ -3355,6 +3380,8 @@ qqueueApplyCnfParam(qqueue_t *pThis, struct nvlst *lst)
@@ -3401,6 +3426,8 @@ qqueueApplyCnfParam(qqueue_t *pThis, struct nvlst *lst)
pThis->toMinDeqBatchSize = pvals[i].val.d.n;
} else if(!strcmp(pblk.descr[i].name, "queue.maxdiskspace")) {
pThis->sizeOnDiskMax = pvals[i].val.d.n;
@ -133,7 +138,7 @@ index 23de366..0c2485c 100644
} else if(!strcmp(pblk.descr[i].name, "queue.highwatermark")) {
pThis->iHighWtrMrk = pvals[i].val.d.n;
} else if(!strcmp(pblk.descr[i].name, "queue.lowwatermark")) {
@@ -3455,6 +3482,7 @@ DEFpropSetMeth(qqueue, iDeqBatchSize, int)
@@ -3555,6 +3582,7 @@ DEFpropSetMeth(qqueue, iDeqBatchSize, int)
DEFpropSetMeth(qqueue, iMinDeqBatchSize, int)
DEFpropSetMeth(qqueue, sizeOnDiskMax, int64)
DEFpropSetMeth(qqueue, iSmpInterval, int)
@ -142,10 +147,10 @@ index 23de366..0c2485c 100644
/* This function can be used as a generic way to set properties. Only the subset
diff --git a/runtime/queue.h b/runtime/queue.h
index 5f91c58..f01c325 100644
index dd989bd..2264f08 100644
--- a/runtime/queue.h
+++ b/runtime/queue.h
@@ -143,6 +143,7 @@ struct queue_s {
@@ -144,6 +144,7 @@ struct queue_s {
int iNumberFiles; /* how many files make up the queue? */
int64 iMaxFileSize; /* max size for a single queue file */
int64 sizeOnDiskMax; /* maximum size on disk allowed */
@ -153,7 +158,7 @@ index 5f91c58..f01c325 100644
qDeqID deqIDAdd; /* next dequeue ID to use during add to queue store */
qDeqID deqIDDel; /* queue store delete position */
int bIsDA; /* is this queue disk assisted? */
@@ -233,6 +234,7 @@ PROTOTYPEpropSetMeth(qqueue, bSaveOnShutdown, int);
@@ -237,6 +238,7 @@ PROTOTYPEpropSetMeth(qqueue, bSaveOnShutdown, int);
PROTOTYPEpropSetMeth(qqueue, pAction, action_t*);
PROTOTYPEpropSetMeth(qqueue, iDeqSlowdown, int);
PROTOTYPEpropSetMeth(qqueue, sizeOnDiskMax, int64);
@ -162,5 +167,5 @@ index 5f91c58..f01c325 100644
#define qqueueGetID(pThis) ((unsigned long) pThis)
--
2.19.1
2.23.0

View File

@ -7,12 +7,14 @@ Signed-off-by: wangshouping <wangshouping@huawei.com>
V-2: add macro control for systemd/sd-journal.h
Signed-off-by: pengyi37 <pengyi37@huawei.com>
V-3: adapt pMsgQueue to runConf->pMsgQueue
Signed-off-by: pengyi37 <pengyi37@huawei.com>
---
tools/rsyslogd.c | 19 ++++++++++++++++++-
1 file changed, 18 insertions(+), 1 deletion(-)
tools/rsyslogd.c | 18 +++++++++++++++++-
1 file changed, 17 insertions(+), 1 deletion(-)
diff --git a/tools/rsyslogd.c b/tools/rsyslogd.c
index f1eea07..657f4de 100644
index 31b91a1..8be2032 100644
--- a/tools/rsyslogd.c
+++ b/tools/rsyslogd.c
@@ -36,6 +36,7 @@
@ -23,15 +25,15 @@ index f1eea07..657f4de 100644
#endif
#include "rsyslog.h"
@@ -180,6 +181,7 @@ void rsyslogdDoDie(int sig);
/* global data items */
static int bChildDied;
@@ -182,6 +183,7 @@ static pthread_mutex_t mutChildDied;
static int bChildDied = 0;
static pthread_mutex_t mutHadHUP;
static int bHadHUP;
+static int g_bRecordQueue;
static int doFork = 1; /* fork - run in daemon mode - read-only after startup */
int bFinished = 0; /* used by termination signal handler, read-only except there
* is either 0 or the number of the signal that requested the
@@ -1269,8 +1271,13 @@ rsyslogdDebugSwitch(void)
@@ -1294,8 +1296,13 @@ rsyslogdDebugSwitch(void)
dbgprintf("\n");
debugging_on = 0;
}
@ -45,7 +47,7 @@ index f1eea07..657f4de 100644
/* This is the main entry point into rsyslogd. Over time, we should try to
* modularize it a bit more...
@@ -1618,7 +1625,7 @@ initAll(int argc, char **argv)
@@ -1629,7 +1636,7 @@ initAll(int argc, char **argv)
hdlr_enable(SIGINT, rsyslogdDoDie);
hdlr_enable(SIGQUIT, rsyslogdDoDie);
} else {
@ -54,30 +56,22 @@ index f1eea07..657f4de 100644
hdlr_enable(SIGINT, SIG_IGN);
hdlr_enable(SIGQUIT, SIG_IGN);
}
@@ -1956,6 +1963,7 @@ mainloop(void)
sigaddset(&sigblockset, SIGTERM);
sigaddset(&sigblockset, SIGCHLD);
sigaddset(&sigblockset, SIGHUP);
+ sigaddset(&sigblockset, SIGUSR1);
do {
processImInternal();
@@ -1970,6 +1978,15 @@ mainloop(void)
doHUP();
bHadHUP = 0;
@@ -1997,6 +2004,15 @@ mainloop(void)
if(need_free_mutex) {
pthread_mutex_unlock(&mutHadHUP);
}
+ if (g_bRecordQueue) {
+ if (pMsgQueue != NULL) {
+ if(runConf->pMsgQueue != NULL) {
+ sd_journal_print(LOG_NOTICE, "main queue size information: current QueueSize=%d MaxQueueSize=%d\n",
+ pMsgQueue->iQueueSize, pMsgQueue->iMaxQueueSize);
+ runConf->pMsgQueue->iQueueSize, runConf->pMsgQueue->iMaxQueueSize);
+ } else {
+ sd_journal_print(LOG_NOTICE, "main queue size information: pMsgQueue is NULL!\n");
+ }
+ g_bRecordQueue = 0;
+ }
if(bFinished)
break; /* exit as quickly as possible */
processImInternal();
--
2.23.0

Binary file not shown.

BIN
rsyslog-8.2210.0.tar.gz Normal file

Binary file not shown.

Binary file not shown.

BIN
rsyslog-doc-8.2210.0.tar.gz Normal file

Binary file not shown.

View File

@ -6,8 +6,8 @@
%define systemd_lived 1
Name: rsyslog
Version: 8.2110.0
Release: 14
Version: 8.2210.0
Release: 1
Summary: The rocket-fast system for log processing
License: (GPLv3+ and ASL 2.0)
URL: http://www.rsyslog.com/
@ -30,29 +30,9 @@ Patch9003: rsyslog-8.37.0-initialize-variables-and-check-return-value.patch
Patch9004: print-main-queue-info-to-journal-when-queue-full.patch
Patch9005: print-main-queue-info-to-journal-when-receive-USR1-signal.patch
%endif
Patch9006: bugfix-CVE-2022-24903.patch
Patch6000: backport-testbench-skip-omfwd_fast_imuxsock.sh-if-liblogging-stdlog-is-not-available.patch
Patch6001: backport-Fixes-4395-by-correctly-checking-for-EPIPE.patch
Patch6002: backport-rsyslogd-adjust-the-order-of-doHUP-and-processImInte.patch
Patch6003: backport-gnutls-bugfix-Fix-error-handling-in-gtlsRecordRecv.patch
Patch6004: backport-Fix-non-null-terminated-string-used-with-strlen.patch
Patch6005: backport-tcpsrv-do-not-decrease-number-of-to-be-processed-fds.patch
Patch6006: backport-imptcp-bugfix-worker-thread-starvation-on-extreme-tr.patch
Patch6007: backport-Fix-memory-leak-when-globally-de-initialize-GnuTLS.patch
Patch6008: backport-Fix-memory-leak-when-free-action-worker-data-table.patch
Patch6009: backport-Fix-memory-leak-when-SetString.patch
Patch6010: backport-core-bugfix-correct-local-host-name-after-config-processing.patch
Patch6011: backport-core-bugfix-local-hostname-invalid-if-no-global-config-object-given.patch
Patch6012: backport-Simplified-and-fixed-IPv4-digit-detection.patch
Patch6013: backport-tcpsrv-cleanup-remove-commented-out-code.patch
Patch6014: backport-add-support-for-permittedPeers-setting-at-input.patch
Patch6015: backport-fix-memory-leak-in-afterRun-Code.patch
Patch6016: backport-Terminate-all-tcpsrv-threads-properly.patch
Patch6017: backport-Deallocate-outchannel-resources-in-rsconf-destructor.patch
Patch6018: backport-Fix-Segmentation-fault-in-close-journal.patch
Patch6019: backport-add-test-for-legacy-permittedPeer-statement.patch
Patch6020: backport-imtcp-bugfix-legacy-config-directives-did-no-longer-work.patch
Patch6000: backport-core-bugfix-local-hostname-invalid-if-no-global-config-object-given.patch
Patch6001: backport-imtcp-bugfix-legacy-config-directives-did-no-longer-work.patch
BuildRequires: gcc autoconf automake bison dos2unix flex pkgconfig python3-docutils libtool
BuildRequires: libgcrypt-devel libuuid-devel zlib-devel krb5-devel libnet-devel gnutls-devel
@ -527,6 +507,12 @@ done
%{_mandir}/man1/rscryutil.1.gz
%changelog
* Sat Feb 4 2023 pengyi <pengyi37@huawei.com> - 8.2210.0-1
- Type:NA
- ID:NA
- SUG:NA
- DESC: update to 8.2210 version
* Sat Dec 24 2022 pengyi <pengyi37@huawei.com> - 8.2110.0-14
- Type:NA
- ID:NA