commit 4b664dbc32d22053ab6cd3f681c81d587af473eb
Author: CentOS Sources
Date: Tue May 16 06:07:52 2023 +0000
import rsyslog-8.2102.0-13.el8
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..8a200b6
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,3 @@
+SOURCES/qpid-proton-0.34.0.tar.gz
+SOURCES/rsyslog-8.2102.0.tar.gz
+SOURCES/rsyslog-doc-8.2102.0.tar.gz
diff --git a/.rsyslog.metadata b/.rsyslog.metadata
new file mode 100644
index 0000000..e0fc0e7
--- /dev/null
+++ b/.rsyslog.metadata
@@ -0,0 +1,3 @@
+390e5cb87a6331cf0ce451d7f6552e2c0d97f706 SOURCES/qpid-proton-0.34.0.tar.gz
+fdda78ed808e7a0dca03ead9227a0a5d913a050f SOURCES/rsyslog-8.2102.0.tar.gz
+9c2188d435cb5f79c1c35749003bd2a61e7f2d07 SOURCES/rsyslog-doc-8.2102.0.tar.gz
diff --git a/SOURCES/rsyslog-8.1911.0-rhbz1659898-imjournal-default-tag.patch b/SOURCES/rsyslog-8.1911.0-rhbz1659898-imjournal-default-tag.patch
new file mode 100644
index 0000000..e9a188d
--- /dev/null
+++ b/SOURCES/rsyslog-8.1911.0-rhbz1659898-imjournal-default-tag.patch
@@ -0,0 +1,93 @@
+diff -up ./plugins/imjournal/imjournal.c.default-tag ./plugins/imjournal/imjournal.c
+--- ./plugins/imjournal/imjournal.c.default-tag 2018-05-17 08:50:11.416418022 -0400
++++ ./plugins/imjournal/imjournal.c 2018-05-17 08:53:02.884418022 -0400
+@@ -78,6 +78,7 @@ static struct configSettings_s {
+ int bWorkAroundJournalBug; /* deprecated, left for backwards compatibility only */
+ int bFsync;
+ int bRemote;
++ char *dfltTag;
+ } cs;
+
+ static rsRetVal facilityHdlr(uchar **pp, void *pVal);
+@@ -93,7 +94,8 @@ static struct cnfparamdescr modpdescr[]
+ { "usepid", eCmdHdlrString, 0 },
+ { "workaroundjournalbug", eCmdHdlrBinary, 0 },
+ { "fsync", eCmdHdlrBinary, 0 },
+- { "remote", eCmdHdlrBinary, 0 }
++ { "remote", eCmdHdlrBinary, 0 },
++ { "defaulttag", eCmdHdlrGetWord, 0 }
+ };
+ static struct cnfparamblk modpblk =
+ { CNFPARAMBLK_VERSION,
+@@ -104,6 +106,7 @@ static struct cnfparamblk modpblk =
+ #define DFLT_persiststateinterval 10
+ #define DFLT_SEVERITY pri2sev(LOG_NOTICE)
+ #define DFLT_FACILITY pri2fac(LOG_USER)
++#define DFLT_TAG "journal"
+
+ static int bLegacyCnfModGlobalsPermitted = 1;/* are legacy module-global config parameters permitted? */
+
+@@ -268,7 +271,7 @@ readjournal(void)
+
+ /* Information from messages */
+ char *message = NULL;
+- char *sys_iden;
++ char *sys_iden = NULL;
+ char *sys_iden_help = NULL;
+
+ const void *get;
+@@ -331,7 +334,7 @@ readjournal(void)
+ if (journalGetData("SYSLOG_IDENTIFIER", &get, &length) >= 0) {
+ CHKiRet(sanitizeValue(((const char *)get) + 18, length - 18, &sys_iden));
+ } else {
+- CHKmalloc(sys_iden = strdup("journal"));
++ CHKmalloc(sys_iden = strdup(cs.dfltTag));
+ }
+
+ /* trying to get PID, default is "SYSLOG_PID" property */
+@@ -654,6 +657,11 @@ CODESTARTrunInput
+ "\"usepidfromsystem\" is depricated, use \"usepid\" instead");
+ }
+
++ if (cs.dfltTag == NULL) {
++ cs.dfltTag = strdup(DFLT_TAG);
++ }
++
++
+ if (cs.usePid && (strcmp(cs.usePid, "system") == 0)) {
+ pidFieldName = "_PID";
+ bPidFallBack = 0;
+@@ -732,6 +740,7 @@ CODESTARTbeginCnfLoad
+ cs.bWorkAroundJournalBug = 1;
+ cs.bFsync = 0;
+ cs.bRemote = 0;
++ cs.dfltTag = NULL;
+ ENDbeginCnfLoad
+
+
+@@ -754,6 +763,7 @@ BEGINfreeCnf
+ CODESTARTfreeCnf
+ free(cs.stateFile);
+ free(cs.usePid);
++ free(cs.dfltTag);
+ free(journalContext.cursor);
+ statsobj.Destruct(&(statsCounter.stats));
+ ENDfreeCnf
+@@ -832,6 +842,8 @@ CODESTARTsetModCnf
+ cs.bFsync = (int) pvals[i].val.d.n;
+ } else if (!strcmp(modpblk.descr[i].name, "remote")) {
+ cs.bRemote = (int) pvals[i].val.d.n;
++ } else if (!strcmp(modpblk.descr[i].name, "defaulttag")) {
++ cs.dfltTag = (char *)es_str2cstr(pvals[i].val.d.estr, NULL);
+ } else {
+ dbgprintf("imjournal: program error, non-handled "
+ "param '%s' in beginCnfLoad\n", modpblk.descr[i].name);
+@@ -799,6 +820,8 @@ CODEmodInit_QueryRegCFSLineHdlr
+ facilityHdlr, &cs.iDfltFacility, STD_LOADABLE_MODULE_ID));
+ CHKiRet(omsdRegCFSLineHdlr((uchar *)"imjournalusepidfromsystem", 0, eCmdHdlrBinary,
+ NULL, &cs.bUseJnlPID, STD_LOADABLE_MODULE_ID));
++ CHKiRet(omsdRegCFSLineHdlr((uchar *)"imjournaldefaulttag", 0, eCmdHdlrGetWord,
++ NULL, &cs.dfltTag, STD_LOADABLE_MODULE_ID));
+ ENDmodInit
+ /* vim:set ai:
+ */
diff --git a/SOURCES/rsyslog-8.2102.0-imtcp-param-refactor.patch b/SOURCES/rsyslog-8.2102.0-imtcp-param-refactor.patch
new file mode 100644
index 0000000..224533e
--- /dev/null
+++ b/SOURCES/rsyslog-8.2102.0-imtcp-param-refactor.patch
@@ -0,0 +1,908 @@
+diff --git a/plugins/imdiag/imdiag.c b/plugins/imdiag/imdiag.c
+index 3e27ee4d36..d57dd5661c 100644
+--- a/plugins/imdiag/imdiag.c
++++ b/plugins/imdiag/imdiag.c
+@@ -566,28 +566,33 @@ setInjectDelayMode(void __attribute__((unused)) *pVal, uchar *const pszMode)
+ }
+
+
+-static rsRetVal addTCPListener(void __attribute__((unused)) *pVal, uchar *pNewVal)
++static rsRetVal
++addTCPListener(void __attribute__((unused)) *pVal, uchar *pNewVal)
+ {
++ tcpLstnParams_t *cnf_params = NULL;
+ DEFiRet;
+
+- if(pOurTcpsrv == NULL) {
+- CHKiRet(tcpsrv.Construct(&pOurTcpsrv));
+- CHKiRet(tcpsrv.SetSessMax(pOurTcpsrv, iTCPSessMax));
+- CHKiRet(tcpsrv.SetCBIsPermittedHost(pOurTcpsrv, isPermittedHost));
+- CHKiRet(tcpsrv.SetCBRcvData(pOurTcpsrv, doRcvData));
+- CHKiRet(tcpsrv.SetCBOpenLstnSocks(pOurTcpsrv, doOpenLstnSocks));
+- CHKiRet(tcpsrv.SetCBOnRegularClose(pOurTcpsrv, onRegularClose));
+- CHKiRet(tcpsrv.SetCBOnErrClose(pOurTcpsrv, onErrClose));
+- CHKiRet(tcpsrv.SetDrvrMode(pOurTcpsrv, iStrmDrvrMode));
+- CHKiRet(tcpsrv.SetOnMsgReceive(pOurTcpsrv, OnMsgReceived));
+- CHKiRet(tcpsrv.SetLstnPortFileName(pOurTcpsrv, pszLstnPortFileName));
+- /* now set optional params, but only if they were actually configured */
+- if(pszStrmDrvrAuthMode != NULL) {
+- CHKiRet(tcpsrv.SetDrvrAuthMode(pOurTcpsrv, pszStrmDrvrAuthMode));
+- }
+- if(pPermPeersRoot != NULL) {
+- CHKiRet(tcpsrv.SetDrvrPermPeers(pOurTcpsrv, pPermPeersRoot));
+- }
++ if(pOurTcpsrv != NULL) {
++ LogError(0, NO_ERRCODE, "imdiag: only a single listener is supported, "
++ "trying to add a second");
++ ABORT_FINALIZE(RS_RET_ERR);
++ }
++ CHKmalloc(cnf_params = (tcpLstnParams_t*) calloc(1, sizeof(tcpLstnParams_t)));
++ CHKiRet(tcpsrv.Construct(&pOurTcpsrv));
++ CHKiRet(tcpsrv.SetSessMax(pOurTcpsrv, iTCPSessMax));
++ CHKiRet(tcpsrv.SetCBIsPermittedHost(pOurTcpsrv, isPermittedHost));
++ CHKiRet(tcpsrv.SetCBRcvData(pOurTcpsrv, doRcvData));
++ CHKiRet(tcpsrv.SetCBOpenLstnSocks(pOurTcpsrv, doOpenLstnSocks));
++ CHKiRet(tcpsrv.SetCBOnRegularClose(pOurTcpsrv, onRegularClose));
++ CHKiRet(tcpsrv.SetCBOnErrClose(pOurTcpsrv, onErrClose));
++ CHKiRet(tcpsrv.SetDrvrMode(pOurTcpsrv, iStrmDrvrMode));
++ CHKiRet(tcpsrv.SetOnMsgReceive(pOurTcpsrv, OnMsgReceived));
++ /* now set optional params, but only if they were actually configured */
++ if(pszStrmDrvrAuthMode != NULL) {
++ CHKiRet(tcpsrv.SetDrvrAuthMode(pOurTcpsrv, pszStrmDrvrAuthMode));
++ }
++ if(pPermPeersRoot != NULL) {
++ CHKiRet(tcpsrv.SetDrvrPermPeers(pOurTcpsrv, pPermPeersRoot));
+ }
+
+ /* initialized, now add socket */
+@@ -595,7 +600,11 @@ static rsRetVal addTCPListener(void __attribute__((unused)) *pVal, uchar *pNewVa
+ UCHAR_CONSTANT("imdiag") : pszInputName));
+ CHKiRet(tcpsrv.SetOrigin(pOurTcpsrv, (uchar*)"imdiag"));
+ /* we support octect-counted frame (constant 1 below) */
+- tcpsrv.configureTCPListen(pOurTcpsrv, pNewVal, 1, NULL, pszLstnPortFileName);
++ cnf_params->pszPort = pNewVal;
++ cnf_params->bSuppOctetFram = 1;
++ CHKmalloc(cnf_params->pszLstnPortFileName = (const uchar*) strdup((const char*)pszLstnPortFileName));
++ tcpsrv.configureTCPListen(pOurTcpsrv, cnf_params);
++ cnf_params = NULL;
+
+ finalize_it:
+ if(iRet != RS_RET_OK) {
+@@ -603,7 +612,7 @@ static rsRetVal addTCPListener(void __attribute__((unused)) *pVal, uchar *pNewVa
+ if(pOurTcpsrv != NULL)
+ tcpsrv.Destruct(&pOurTcpsrv);
+ }
+- free(pNewVal);
++ free(cnf_params);
+ RETiRet;
+ }
+
+@@ -760,6 +769,7 @@ CODESTARTmodExit
+
+ /* free some globals to keep valgrind happy */
+ free(pszInputName);
++fprintf(stderr, "FINAL FREE %p\n", pszLstnPortFileName);
+ free(pszLstnPortFileName);
+ free(pszStrmDrvrAuthMode);
+
+diff --git a/plugins/imgssapi/imgssapi.c b/plugins/imgssapi/imgssapi.c
+index e0cab01664..4041e88b14 100644
+--- a/plugins/imgssapi/imgssapi.c
++++ b/plugins/imgssapi/imgssapi.c
+@@ -334,34 +334,38 @@ static rsRetVal
+ actGSSListener(uchar *port)
+ {
+ DEFiRet;
++ tcpLstnParams_t *cnf_params = NULL;
+ gsssrv_t *pGSrv = NULL;
+
+- if(pOurTcpsrv == NULL) {
+- /* first create/init the gsssrv "object" */
+- if((pGSrv = calloc(1, sizeof(gsssrv_t))) == NULL)
+- ABORT_FINALIZE(RS_RET_OUT_OF_MEMORY);
+-
+- pGSrv->allowedMethods = ALLOWEDMETHOD_GSS;
+- if(bPermitPlainTcp)
+- pGSrv->allowedMethods |= ALLOWEDMETHOD_TCP;
+- /* gsssrv initialized */
+-
+- CHKiRet(tcpsrv.Construct(&pOurTcpsrv));
+- CHKiRet(tcpsrv.SetUsrP(pOurTcpsrv, pGSrv));
+- CHKiRet(tcpsrv.SetCBOnSessConstructFinalize(pOurTcpsrv, OnSessConstructFinalize));
+- CHKiRet(tcpsrv.SetCBOnSessDestruct(pOurTcpsrv, OnSessDestruct));
+- CHKiRet(tcpsrv.SetCBIsPermittedHost(pOurTcpsrv, isPermittedHost));
+- CHKiRet(tcpsrv.SetCBRcvData(pOurTcpsrv, doRcvData));
+- CHKiRet(tcpsrv.SetCBOpenLstnSocks(pOurTcpsrv, doOpenLstnSocks));
+- CHKiRet(tcpsrv.SetCBOnSessAccept(pOurTcpsrv, onSessAccept));
+- CHKiRet(tcpsrv.SetCBOnRegularClose(pOurTcpsrv, onRegularClose));
+- CHKiRet(tcpsrv.SetCBOnErrClose(pOurTcpsrv, onErrClose));
+- CHKiRet(tcpsrv.SetInputName(pOurTcpsrv, UCHAR_CONSTANT("imgssapi")));
+- CHKiRet(tcpsrv.SetKeepAlive(pOurTcpsrv, bKeepAlive));
+- CHKiRet(tcpsrv.SetOrigin(pOurTcpsrv, UCHAR_CONSTANT("imgssapi")));
+- tcpsrv.configureTCPListen(pOurTcpsrv, port, 1, NULL, NULL);
+- CHKiRet(tcpsrv.ConstructFinalize(pOurTcpsrv));
+- }
++ assert(pOurTcpsrv == NULL);
++ CHKmalloc(cnf_params = (tcpLstnParams_t*) calloc(1, sizeof(tcpLstnParams_t)));
++ /* first create/init the gsssrv "object" */
++ if((pGSrv = calloc(1, sizeof(gsssrv_t))) == NULL)
++ ABORT_FINALIZE(RS_RET_OUT_OF_MEMORY);
++
++ pGSrv->allowedMethods = ALLOWEDMETHOD_GSS;
++ if(bPermitPlainTcp)
++ pGSrv->allowedMethods |= ALLOWEDMETHOD_TCP;
++ /* gsssrv initialized */
++
++ CHKiRet(tcpsrv.Construct(&pOurTcpsrv));
++ CHKiRet(tcpsrv.SetUsrP(pOurTcpsrv, pGSrv));
++ CHKiRet(tcpsrv.SetCBOnSessConstructFinalize(pOurTcpsrv, OnSessConstructFinalize));
++ CHKiRet(tcpsrv.SetCBOnSessDestruct(pOurTcpsrv, OnSessDestruct));
++ CHKiRet(tcpsrv.SetCBIsPermittedHost(pOurTcpsrv, isPermittedHost));
++ CHKiRet(tcpsrv.SetCBRcvData(pOurTcpsrv, doRcvData));
++ CHKiRet(tcpsrv.SetCBOpenLstnSocks(pOurTcpsrv, doOpenLstnSocks));
++ CHKiRet(tcpsrv.SetCBOnSessAccept(pOurTcpsrv, onSessAccept));
++ CHKiRet(tcpsrv.SetCBOnRegularClose(pOurTcpsrv, onRegularClose));
++ CHKiRet(tcpsrv.SetCBOnErrClose(pOurTcpsrv, onErrClose));
++ CHKiRet(tcpsrv.SetInputName(pOurTcpsrv, UCHAR_CONSTANT("imgssapi")));
++ CHKiRet(tcpsrv.SetKeepAlive(pOurTcpsrv, bKeepAlive));
++ CHKiRet(tcpsrv.SetOrigin(pOurTcpsrv, UCHAR_CONSTANT("imgssapi")));
++ cnf_params->pszPort = port;
++ cnf_params->bSuppOctetFram = 1;
++ tcpsrv.configureTCPListen(pOurTcpsrv, cnf_params);
++ CHKiRet(tcpsrv.ConstructFinalize(pOurTcpsrv));
++ cnf_params = NULL;
+
+ finalize_it:
+ if(iRet != RS_RET_OK) {
+@@ -370,6 +374,7 @@ actGSSListener(uchar *port)
+ tcpsrv.Destruct(&pOurTcpsrv);
+ free(pGSrv);
+ }
++ free(cnf_params);
+ RETiRet;
+ }
+
+diff --git a/plugins/imtcp/imtcp.c b/plugins/imtcp/imtcp.c
+index cf74d4c616..c336e6c24d 100644
+--- a/plugins/imtcp/imtcp.c
++++ b/plugins/imtcp/imtcp.c
+@@ -4,7 +4,7 @@
+ * File begun on 2007-12-21 by RGerhards (extracted from syslogd.c,
+ * which at the time of the rsyslog fork was BSD-licensed)
+ *
+- * Copyright 2007-2017 Adiscon GmbH.
++ * Copyright 2007-2020 Adiscon GmbH.
+ *
+ * This file is part of rsyslog.
+ *
+@@ -112,9 +112,7 @@ static struct configSettings_s {
+ } cs;
+
+ struct instanceConf_s {
+- uchar *pszBindPort; /* port to bind to */
+- uchar *pszLstnPortFileName; /* file dynamic port is written to */
+- uchar *pszBindAddr; /* IP to bind socket to */
++ tcpLstnParams_t *cnf_params; /**< listener config parameters */
+ uchar *pszBindRuleset; /* name of ruleset to bind to */
+ ruleset_t *pBindRuleset; /* ruleset to bind listener to (use system default if unspecified) */
+ uchar *pszInputName; /* value for inputname property, NULL is OK and handled by core engine */
+@@ -122,7 +120,6 @@ struct instanceConf_s {
+ sbool bSPFramingFix;
+ unsigned int ratelimitInterval;
+ unsigned int ratelimitBurst;
+- int bSuppOctetFram;
+ struct instanceConf_s *next;
+ };
+
+@@ -288,19 +285,20 @@ setPermittedPeer(void __attribute__((unused)) *pVal, uchar *pszID)
+ static rsRetVal
+ createInstance(instanceConf_t **pinst)
+ {
+- instanceConf_t *inst;
++ instanceConf_t *inst = NULL;
++
+ DEFiRet;
+ CHKmalloc(inst = malloc(sizeof(instanceConf_t)));
++ CHKmalloc(inst->cnf_params = (tcpLstnParams_t*) calloc(1, sizeof(tcpLstnParams_t)));
+ inst->next = NULL;
+ inst->pszBindRuleset = NULL;
+ inst->pszInputName = NULL;
+- inst->pszBindAddr = NULL;
+ inst->dfltTZ = NULL;
+- inst->bSuppOctetFram = -1; /* unset */
++ inst->cnf_params->bSuppOctetFram = -1; /* unset */
+ inst->bSPFramingFix = 0;
+ inst->ratelimitInterval = 0;
+ inst->ratelimitBurst = 10000;
+- inst->pszLstnPortFileName = NULL;
++ inst->cnf_params->pszLstnPortFileName = NULL;
+
+ /* node created, let's add to config */
+ if(loadModConf->tail == NULL) {
+@@ -312,6 +310,9 @@ createInstance(instanceConf_t **pinst)
+
+ *pinst = inst;
+ finalize_it:
++ if(iRet != RS_RET_OK) {
++ free(inst);
++ }
+ RETiRet;
+ }
+
+@@ -328,7 +329,7 @@ static rsRetVal addInstance(void __attribute__((unused)) *pVal, uchar *pNewVal)
+
+ CHKiRet(createInstance(&inst));
+
+- CHKmalloc(inst->pszBindPort = ustrdup((pNewVal == NULL || *pNewVal == '\0')
++ CHKmalloc(inst->cnf_params->pszPort = ustrdup((pNewVal == NULL || *pNewVal == '\0')
+ ? (uchar*) "10514" : pNewVal));
+ if((cs.pszBindRuleset == NULL) || (cs.pszBindRuleset[0] == '\0')) {
+ inst->pszBindRuleset = NULL;
+@@ -336,14 +337,14 @@ static rsRetVal addInstance(void __attribute__((unused)) *pVal, uchar *pNewVal)
+ CHKmalloc(inst->pszBindRuleset = ustrdup(cs.pszBindRuleset));
+ }
+ if((cs.lstnIP == NULL) || (cs.lstnIP[0] == '\0')) {
+- inst->pszBindAddr = NULL;
++ inst->cnf_params->pszAddr = NULL;
+ } else {
+- CHKmalloc(inst->pszBindAddr = ustrdup(cs.lstnIP));
++ CHKmalloc(inst->cnf_params->pszAddr = ustrdup(cs.lstnIP));
+ }
+ if((cs.lstnPortFile == NULL) || (cs.lstnPortFile[0] == '\0')) {
+- inst->pszBindAddr = NULL;
++ inst->cnf_params->pszAddr = NULL;
+ } else {
+- CHKmalloc(inst->pszLstnPortFileName = ustrdup(cs.lstnPortFile));
++ CHKmalloc(inst->cnf_params->pszLstnPortFileName = ustrdup(cs.lstnPortFile));
+ }
+
+ if((cs.pszInputName == NULL) || (cs.pszInputName[0] == '\0')) {
+@@ -351,7 +352,7 @@ static rsRetVal addInstance(void __attribute__((unused)) *pVal, uchar *pNewVal)
+ } else {
+ CHKmalloc(inst->pszInputName = ustrdup(cs.pszInputName));
+ }
+- inst->bSuppOctetFram = cs.bSuppOctetFram;
++ inst->cnf_params->bSuppOctetFram = cs.bSuppOctetFram;
+
+ finalize_it:
+ free(pNewVal);
+@@ -407,7 +408,7 @@ addListner(modConfData_t *modConf, instanceConf_t *inst)
+ }
+
+ /* initialized, now add socket and listener params */
+- DBGPRINTF("imtcp: trying to add port *:%s\n", inst->pszBindPort);
++ DBGPRINTF("imtcp: trying to add port *:%s\n", inst->cnf_params->pszPort);
+ CHKiRet(tcpsrv.SetRuleset(pOurTcpsrv, inst->pBindRuleset));
+ CHKiRet(tcpsrv.SetInputName(pOurTcpsrv, inst->pszInputName == NULL ?
+ UCHAR_CONSTANT("imtcp") : inst->pszInputName));
+@@ -416,12 +417,12 @@ addListner(modConfData_t *modConf, instanceConf_t *inst)
+ CHKiRet(tcpsrv.SetbSPFramingFix(pOurTcpsrv, inst->bSPFramingFix));
+ CHKiRet(tcpsrv.SetLinuxLikeRatelimiters(pOurTcpsrv, inst->ratelimitInterval, inst->ratelimitBurst));
+
+- if((ustrcmp(inst->pszBindPort, UCHAR_CONSTANT("0")) == 0 && inst->pszLstnPortFileName == NULL)
+- || ustrcmp(inst->pszBindPort, UCHAR_CONSTANT("0")) < 0) {
+- CHKmalloc(inst->pszBindPort = (uchar*)strdup("514"));
++ if((ustrcmp(inst->cnf_params->pszPort, UCHAR_CONSTANT("0")) == 0
++ && inst->cnf_params->pszLstnPortFileName == NULL)
++ || ustrcmp(inst->cnf_params->pszPort, UCHAR_CONSTANT("0")) < 0) {
++ CHKmalloc(inst->cnf_params->pszPort = (uchar*)strdup("514"));
+ }
+- tcpsrv.configureTCPListen(pOurTcpsrv, inst->pszBindPort, inst->bSuppOctetFram,
+- inst->pszBindAddr, inst->pszLstnPortFileName);
++ tcpsrv.configureTCPListen(pOurTcpsrv, inst->cnf_params);
+
+ finalize_it:
+ if(iRet != RS_RET_OK) {
+@@ -456,9 +457,9 @@ CODESTARTnewInpInst
+ if(!pvals[i].bUsed)
+ continue;
+ if(!strcmp(inppblk.descr[i].name, "port")) {
+- inst->pszBindPort = (uchar*)es_str2cstr(pvals[i].val.d.estr, NULL);
++ inst->cnf_params->pszPort = (uchar*)es_str2cstr(pvals[i].val.d.estr, NULL);
+ } else if(!strcmp(inppblk.descr[i].name, "address")) {
+- inst->pszBindAddr = (uchar*)es_str2cstr(pvals[i].val.d.estr, NULL);
++ inst->cnf_params->pszAddr = (uchar*)es_str2cstr(pvals[i].val.d.estr, NULL);
+ } else if(!strcmp(inppblk.descr[i].name, "name")) {
+ inst->pszInputName = (uchar*)es_str2cstr(pvals[i].val.d.estr, NULL);
+ } else if(!strcmp(inppblk.descr[i].name, "defaulttz")) {
+@@ -468,13 +469,13 @@ CODESTARTnewInpInst
+ } else if(!strcmp(inppblk.descr[i].name, "ruleset")) {
+ inst->pszBindRuleset = (uchar*)es_str2cstr(pvals[i].val.d.estr, NULL);
+ } else if(!strcmp(inppblk.descr[i].name, "supportoctetcountedframing")) {
+- inst->bSuppOctetFram = (int) pvals[i].val.d.n;
++ inst->cnf_params->bSuppOctetFram = (int) pvals[i].val.d.n;
+ } else if(!strcmp(inppblk.descr[i].name, "ratelimit.burst")) {
+ inst->ratelimitBurst = (unsigned int) pvals[i].val.d.n;
+ } else if(!strcmp(inppblk.descr[i].name, "ratelimit.interval")) {
+ inst->ratelimitInterval = (unsigned int) pvals[i].val.d.n;
+ } else if(!strcmp(inppblk.descr[i].name, "listenportfilename")) {
+- inst->pszLstnPortFileName = (uchar*)es_str2cstr(pvals[i].val.d.estr, NULL);
++ inst->cnf_params->pszLstnPortFileName = (uchar*)es_str2cstr(pvals[i].val.d.estr, NULL);
+ } else {
+ dbgprintf("imtcp: program error, non-handled "
+ "param '%s'\n", inppblk.descr[i].name);
+@@ -656,7 +657,7 @@ std_checkRuleset_genErrMsg(__attribute__((unused)) modConfData_t *modConf, insta
+ {
+ LogError(0, NO_ERRCODE, "imtcp: ruleset '%s' for port %s not found - "
+ "using default ruleset instead", inst->pszBindRuleset,
+- inst->pszBindPort);
++ inst->cnf_params->pszPort);
+ }
+
+ BEGINcheckCnf
+@@ -664,8 +665,8 @@ BEGINcheckCnf
+ CODESTARTcheckCnf
+ for(inst = pModConf->root ; inst != NULL ; inst = inst->next) {
+ std_checkRuleset(pModConf, inst);
+- if(inst->bSuppOctetFram == FRAMING_UNSET)
+- inst->bSuppOctetFram = pModConf->bSuppOctetFram;
++ if(inst->cnf_params->bSuppOctetFram == FRAMING_UNSET)
++ inst->cnf_params->bSuppOctetFram = pModConf->bSuppOctetFram;
+ }
+ if(pModConf->root == NULL) {
+ LogError(0, RS_RET_NO_LISTNERS , "imtcp: module loaded, but "
+@@ -713,12 +714,9 @@ CODESTARTfreeCnf
+ free(pModConf->permittedPeers);
+ }
+ for(inst = pModConf->root ; inst != NULL ; ) {
+- free(inst->pszBindPort);
+- free(inst->pszLstnPortFileName);
+- free(inst->pszBindAddr);
+- free(inst->pszBindRuleset);
+- free(inst->pszInputName);
+- free(inst->dfltTZ);
++ free((void*)inst->pszBindRuleset);
++ free((void*)inst->pszInputName);
++ free((void*)inst->dfltTZ);
+ del = inst;
+ inst = inst->next;
+ free(del);
+diff --git a/runtime/netstrm.c b/runtime/netstrm.c
+index 8a394a02eb..2c1db46378 100644
+--- a/runtime/netstrm.c
++++ b/runtime/netstrm.c
+@@ -12,12 +12,18 @@
+ * to carry out its work (including, and most importantly, transport
+ * drivers).
+ *
++ * Note on processing:
++ * - Initiating a listener may be driver-specific, but in regard to TLS/non-TLS
++ * it actually is not. This is because TLS is negotiated after a connection
++ * has been established. So it is the "acceptConnReq" driver entry where TLS
++ * params need to be applied.
++ *
+ * Work on this module begun 2008-04-17 by Rainer Gerhards. This code
+ * borrows from librelp's tcp.c/.h code. librelp is dual licensed and
+ * Rainer Gerhards and Adiscon GmbH have agreed to permit using the code
+ * under the terms of the GNU Lesser General Public License.
+ *
+- * Copyright 2007-2009 Rainer Gerhards and Adiscon GmbH.
++ * Copyright 2007-2020 Rainer Gerhards and Adiscon GmbH.
+ *
+ * This file is part of the rsyslog runtime library.
+ *
+@@ -134,18 +140,17 @@ AcceptConnReq(netstrm_t *pThis, netstrm_t **ppNew)
+ * pLstnPort must point to a port name or number. NULL is NOT permitted.
+ * rgerhards, 2008-04-22
+ */
+-static rsRetVal
++static rsRetVal ATTR_NONNULL(1,3,5)
+ LstnInit(netstrms_t *pNS, void *pUsr, rsRetVal(*fAddLstn)(void*,netstrm_t*),
+- uchar *pLstnPort, uchar *pLstnIP, int iSessMax,
+- uchar *pszLstnPortFileName)
++ const int iSessMax, const tcpLstnParams_t *const cnf_params)
+ {
+ DEFiRet;
+
+ ISOBJ_TYPE_assert(pNS, netstrms);
+ assert(fAddLstn != NULL);
+- assert(pLstnPort != NULL);
++ assert(cnf_params->pszPort != NULL);
+
+- CHKiRet(pNS->Drvr.LstnInit(pNS, pUsr, fAddLstn, pLstnPort, pLstnIP, iSessMax, pszLstnPortFileName));
++ CHKiRet(pNS->Drvr.LstnInit(pNS, pUsr, fAddLstn, iSessMax, cnf_params));
+
+ finalize_it:
+ RETiRet;
+diff --git a/runtime/netstrm.h b/runtime/netstrm.h
+index 2e28d7e2e6..4ca35805e7 100644
+--- a/runtime/netstrm.h
++++ b/runtime/netstrm.h
+@@ -1,6 +1,6 @@
+ /* Definitions for the stream-based netstrmworking class.
+ *
+- * Copyright 2007, 2008 Rainer Gerhards and Adiscon GmbH.
++ * Copyright 2007-2020 Rainer Gerhards and Adiscon GmbH.
+ *
+ * This file is part of the rsyslog runtime library.
+ *
+@@ -24,6 +24,7 @@
+ #ifndef INCLUDED_NETSTRM_H
+ #define INCLUDED_NETSTRM_H
+
++#include "tcpsrv.h"
+ #include "netstrms.h"
+
+ /* the netstrm object */
+@@ -31,6 +32,7 @@ struct netstrm_s {
+ BEGINobjInstance; /* Data to implement generic object - MUST be the first data element! */
+ nsd_t *pDrvrData; /**< the driver's data elements (at most other places, this is called pNsd) */
+ nsd_if_t Drvr; /**< our stream driver */
++ uchar *pszDrvrAuthMode; /**< auth mode of the stream driver to use */
+ void *pUsr; /**< pointer to user-provided data structure */
+ netstrms_t *pNS; /**< pointer to our netstream subsystem object */
+ };
+@@ -76,8 +78,8 @@ BEGINinterface(netstrm) /* name must also be changed in ENDinterface macro! */
+ rsRetVal (*SetKeepAliveIntvl)(netstrm_t *pThis, int keepAliveIntvl);
+ rsRetVal (*SetGnutlsPriorityString)(netstrm_t *pThis, uchar *priorityString);
+ /* v11 -- Parameter pszLstnFileName added to LstnInit*/
+- rsRetVal (*LstnInit)(netstrms_t *pNS, void *pUsr, rsRetVal(*)(void*,netstrm_t*),
+- uchar *pLstnPort, uchar *pLstnIP, int iSessMax, uchar *pszLstnPortFileName);
++ rsRetVal (ATTR_NONNULL(1,3,5) *LstnInit)(netstrms_t *pNS, void *pUsr, rsRetVal(*)(void*,netstrm_t*),
++ const int iSessMax, const tcpLstnParams_t *const cnf_params);
+ /* v12 -- two new binary flags added to gtls driver enabling stricter operation */
+ rsRetVal (*SetDrvrCheckExtendedKeyUsage)(netstrm_t *pThis, int ChkExtendedKeyUsage);
+ rsRetVal (*SetDrvrPrioritizeSAN)(netstrm_t *pThis, int prioritizeSan);
+diff --git a/runtime/nsd.h b/runtime/nsd.h
+index e862348fd6..eecffed05e 100644
+--- a/runtime/nsd.h
++++ b/runtime/nsd.h
+@@ -84,8 +84,8 @@ BEGINinterface(nsd) /* name must also be changed in ENDinterface macro! */
+ rsRetVal (*SetKeepAliveTime)(nsd_t *pThis, int keepAliveTime);
+ rsRetVal (*SetGnutlsPriorityString)(nsd_t *pThis, uchar *gnutlsPriorityString);
+ /* v12 -- parameter pszLstnPortFileName added to LstnInit()*/
+- rsRetVal (*LstnInit)(netstrms_t *pNS, void *pUsr, rsRetVal(*fAddLstn)(void*,netstrm_t*),
+- uchar *pLstnPort, uchar *pLstnIP, int iSessMax, uchar *pszLstnPortFileName);
++ rsRetVal (ATTR_NONNULL(1,3,5) *LstnInit)(netstrms_t *pNS, void *pUsr, rsRetVal(*)(void*,netstrm_t*),
++ const int iSessMax, const tcpLstnParams_t *const cnf_params);
+ /* v13 -- two new binary flags added to gtls driver enabling stricter operation */
+ rsRetVal (*SetCheckExtendedKeyUsage)(nsd_t *pThis, int ChkExtendedKeyUsage);
+ rsRetVal (*SetPrioritizeSAN)(nsd_t *pThis, int prioritizeSan);
+diff --git a/runtime/nsd_gtls.c b/runtime/nsd_gtls.c
+index da90c2e096..55f6713d62 100644
+--- a/runtime/nsd_gtls.c
++++ b/runtime/nsd_gtls.c
+@@ -1692,14 +1692,13 @@ Abort(nsd_t *pNsd)
+ * a session, but not during listener setup.
+ * gerhards, 2008-04-25
+ */
+-static rsRetVal
++static rsRetVal ATTR_NONNULL(1,3,5)
+ LstnInit(netstrms_t *pNS, void *pUsr, rsRetVal(*fAddLstn)(void*,netstrm_t*),
+- uchar *pLstnPort, uchar *pLstnIP, int iSessMax,
+- uchar *pszLstnPortFileName)
++ const int iSessMax, const tcpLstnParams_t *const cnf_params)
+ {
+ DEFiRet;
+ CHKiRet(gtlsGlblInitLstn());
+- iRet = nsd_ptcp.LstnInit(pNS, pUsr, fAddLstn, pLstnPort, pLstnIP, iSessMax, pszLstnPortFileName);
++ iRet = nsd_ptcp.LstnInit(pNS, pUsr, fAddLstn, iSessMax, cnf_params);
+ finalize_it:
+ RETiRet;
+ }
+@@ -1785,6 +1784,7 @@ AcceptConnReq(nsd_t *pNsd, nsd_t **ppNew)
+ FINALIZE;
+ }
+ /* copy Properties to pnew first */
++dbgprintf("RGER: pThis %p pNew %p, authMode %d\n", pThis, pNew, pThis->authMode);
+ pNew->authMode = pThis->authMode;
+ pNew->permitExpiredCerts = pThis->permitExpiredCerts;
+ pNew->pPermPeers = pThis->pPermPeers;
+diff --git a/runtime/nsd_ossl.c b/runtime/nsd_ossl.c
+index 431ea738b8..79347916e4 100644
+--- a/runtime/nsd_ossl.c
++++ b/runtime/nsd_ossl.c
+@@ -1308,16 +1308,15 @@ Abort(nsd_t *pNsd)
+ */
+ static rsRetVal
+ LstnInit(netstrms_t *pNS, void *pUsr, rsRetVal(*fAddLstn)(void*,netstrm_t*),
+- uchar *pLstnPort, uchar *pLstnIP, int iSessMax, uchar *pszLstnPortFileName)
++ const int iSessMax, const tcpLstnParams_t *const cnf_params)
+ {
+ DEFiRet;
+
+ dbgprintf("LstnInit for openssl: entering LstnInit (%p) for %s:%s SessMax=%d\n",
+- fAddLstn, pLstnIP, pLstnPort, iSessMax);
++ fAddLstn, cnf_params->pszAddr, cnf_params->pszPort, iSessMax);
+
+ /* Init TCP Listener using base ptcp class */
+- iRet = nsd_ptcp.LstnInit(pNS, pUsr, fAddLstn, pLstnPort, pLstnIP,
+- iSessMax, pszLstnPortFileName);
++ iRet = nsd_ptcp.LstnInit(pNS, pUsr, fAddLstn, iSessMax, cnf_params);
+ RETiRet;
+ }
+
+diff --git a/runtime/nsd_ptcp.c b/runtime/nsd_ptcp.c
+index c35138fb7a..2f9e77ba03 100644
+--- a/runtime/nsd_ptcp.c
++++ b/runtime/nsd_ptcp.c
+@@ -474,10 +474,9 @@ AcceptConnReq(nsd_t *pNsd, nsd_t **ppNew)
+ * number of sessions permitted.
+ * rgerhards, 2008-04-22
+ */
+-static rsRetVal
++static rsRetVal ATTR_NONNULL(1,3,5)
+ LstnInit(netstrms_t *pNS, void *pUsr, rsRetVal(*fAddLstn)(void*,netstrm_t*),
+- uchar *pLstnPort, uchar *pLstnIP, int iSessMax,
+- uchar *pszLstnPortFileName)
++ const int iSessMax, const tcpLstnParams_t *const cnf_params)
+ {
+ DEFiRet;
+ netstrm_t *pNewStrm = NULL;
+@@ -497,20 +496,20 @@ LstnInit(netstrms_t *pNS, void *pUsr, rsRetVal(*fAddLstn)(void*,netstrm_t*),
+
+ ISOBJ_TYPE_assert(pNS, netstrms);
+ assert(fAddLstn != NULL);
+- assert(pLstnPort != NULL);
++ assert(cnf_params->pszPort != NULL);
+ assert(iSessMax >= 0);
+
+- dbgprintf("creating tcp listen socket on port %s\n", pLstnPort);
++ dbgprintf("creating tcp listen socket on port %s\n", cnf_params->pszPort);
+
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_flags = AI_PASSIVE;
+ hints.ai_family = glbl.GetDefPFFamily();
+ hints.ai_socktype = SOCK_STREAM;
+
+- error = getaddrinfo((char*)pLstnIP, (char*) pLstnPort, &hints, &res);
++ error = getaddrinfo((const char*)cnf_params->pszAddr, (const char*) cnf_params->pszPort, &hints, &res);
+ if(error) {
+ LogError(0, RS_RET_INVALID_PORT, "error querying port '%s': %s",
+- pLstnPort, gai_strerror(error));
++ cnf_params->pszAddr, gai_strerror(error));
+ ABORT_FINALIZE(RS_RET_INVALID_PORT);
+ }
+
+@@ -622,9 +621,9 @@ LstnInit(netstrms_t *pNS, void *pUsr, rsRetVal(*fAddLstn)(void*,netstrm_t*),
+ r->ai_addrlen = socklen_r;
+ savecast.sa = (struct sockaddr*)r->ai_addr;
+ port_override = (isIPv6) ? savecast.ipv6->sin6_port : savecast.ipv4->sin_port;
+- if(pszLstnPortFileName != NULL) {
++ if(cnf_params->pszLstnPortFileName != NULL) {
+ FILE *fp;
+- if((fp = fopen((const char*)pszLstnPortFileName, "w+")) == NULL) {
++ if((fp = fopen((const char*)cnf_params->pszLstnPortFileName, "w+")) == NULL) {
+ LogError(errno, RS_RET_IO_ERROR, "nsd_ptcp: ListenPortFileName: "
+ "error while trying to open file");
+ ABORT_FINALIZE(RS_RET_IO_ERROR);
+diff --git a/runtime/nsd_ptcp.h b/runtime/nsd_ptcp.h
+index 137b7c3ce7..1c91718c19 100644
+--- a/runtime/nsd_ptcp.h
++++ b/runtime/nsd_ptcp.h
+@@ -1,6 +1,6 @@
+ /* An implementation of the nsd interface for plain tcp sockets.
+ *
+- * Copyright 2007-2012 Adiscon GmbH.
++ * Copyright 2007-2020 Adiscon GmbH.
+ *
+ * This file is part of the rsyslog runtime library.
+ *
+@@ -23,6 +23,7 @@
+ #define INCLUDED_NSD_PTCP_H
+
+ #include
++#include "tcpsrv.h"
+
+ #include "nsd.h"
+ typedef nsd_if_t nsd_ptcp_if_t; /* we just *implement* this interface */
+diff --git a/runtime/tcps_sess.c b/runtime/tcps_sess.c
+index 58528c81ec..845e944582 100644
+--- a/runtime/tcps_sess.c
++++ b/runtime/tcps_sess.c
+@@ -194,8 +194,8 @@ SetLstnInfo(tcps_sess_t *pThis, tcpLstnPortList_t *pLstnInfo)
+ assert(pLstnInfo != NULL);
+ pThis->pLstnInfo = pLstnInfo;
+ /* set cached elements */
+- pThis->bSuppOctetFram = pLstnInfo->bSuppOctetFram;
+- pThis->bSPFramingFix = pLstnInfo->bSPFramingFix;
++ pThis->bSuppOctetFram = pLstnInfo->cnf_params->bSuppOctetFram;
++ pThis->bSPFramingFix = pLstnInfo->cnf_params->bSPFramingFix;
+ RETiRet;
+ }
+
+@@ -235,6 +235,7 @@ defaultDoSubmitMessage(tcps_sess_t *pThis, struct syslogTime *stTime, time_t ttG
+ DEFiRet;
+
+ ISOBJ_TYPE_assert(pThis, tcps_sess);
++ const tcpLstnParams_t *const cnf_params = pThis->pLstnInfo->cnf_params;
+
+ if(pThis->iMsg == 0) {
+ DBGPRINTF("discarding zero-sized message\n");
+@@ -249,15 +250,15 @@ defaultDoSubmitMessage(tcps_sess_t *pThis, struct syslogTime *stTime, time_t ttG
+ /* we now create our own message object and submit it to the queue */
+ CHKiRet(msgConstructWithTime(&pMsg, stTime, ttGenTime));
+ MsgSetRawMsg(pMsg, (char*)pThis->pMsg, pThis->iMsg);
+- MsgSetInputName(pMsg, pThis->pLstnInfo->pInputName);
+- if(pThis->pLstnInfo->dfltTZ[0] != '\0')
+- MsgSetDfltTZ(pMsg, (char*) pThis->pLstnInfo->dfltTZ);
++ MsgSetInputName(pMsg, cnf_params->pInputName);
++ if(cnf_params->dfltTZ[0] != '\0')
++ MsgSetDfltTZ(pMsg, (char*) cnf_params->dfltTZ);
+ MsgSetFlowControlType(pMsg, pThis->pSrv->bUseFlowControl
+ ? eFLOWCTL_LIGHT_DELAY : eFLOWCTL_NO_DELAY);
+ pMsg->msgFlags = NEEDS_PARSING | PARSE_HOSTNAME;
+ MsgSetRcvFrom(pMsg, pThis->fromHost);
+ CHKiRet(MsgSetRcvFromIP(pMsg, pThis->fromHostIP));
+- MsgSetRuleset(pMsg, pThis->pLstnInfo->pRuleset);
++ MsgSetRuleset(pMsg, cnf_params->pRuleset);
+
+ STATSCOUNTER_INC(pThis->pLstnInfo->ctrSubmit, pThis->pLstnInfo->mutCtrSubmit);
+ ratelimitAddMsg(pThis->pLstnInfo->ratelimiter, pMultiSub, pMsg);
+diff --git a/runtime/tcpsrv.c b/runtime/tcpsrv.c
+index 76a50357c3..ab9573e5b8 100644
+--- a/runtime/tcpsrv.c
++++ b/runtime/tcpsrv.c
+@@ -123,9 +123,7 @@ static int wrkrRunning;
+ * rgerhards, 2009-05-21
+ */
+ static rsRetVal ATTR_NONNULL(1, 2)
+-addNewLstnPort(tcpsrv_t *const pThis, const uchar *const pszPort,
+- const int bSuppOctetFram, const uchar *const pszAddr,
+- const uchar *const pszLstnPortFileName)
++addNewLstnPort(tcpsrv_t *const pThis, tcpLstnParams_t *const cnf_params)
+ {
+ tcpLstnPortList_t *pEntry;
+ uchar statname[64];
+@@ -135,25 +133,17 @@ addNewLstnPort(tcpsrv_t *const pThis, const uchar *const pszPort,
+
+ /* create entry */
+ CHKmalloc(pEntry = (tcpLstnPortList_t*)calloc(1, sizeof(tcpLstnPortList_t)));
+- CHKmalloc(pEntry->pszPort = ustrdup(pszPort));
++ pEntry->cnf_params = cnf_params;
+
+- pEntry->pszAddr = NULL;
+- /* only if a bind adress is defined copy it in struct */
+- if (pszAddr != NULL) {
+- CHKmalloc(pEntry->pszAddr = ustrdup(pszAddr));
+- }
+-
+- strcpy((char*)pEntry->dfltTZ, (char*)pThis->dfltTZ);
+- pEntry->bSPFramingFix = pThis->bSPFramingFix;
++ strcpy((char*)pEntry->cnf_params->dfltTZ, (char*)pThis->dfltTZ);
++ pEntry->cnf_params->bSPFramingFix = pThis->bSPFramingFix;
++ pEntry->cnf_params->pRuleset = pThis->pRuleset;
+ pEntry->pSrv = pThis;
+- pEntry->pRuleset = pThis->pRuleset;
+- pEntry->bSuppOctetFram = bSuppOctetFram;
+- pEntry->pszLstnPortFileName = pszLstnPortFileName;
+
+ /* we need to create a property */
+- CHKiRet(prop.Construct(&pEntry->pInputName));
+- CHKiRet(prop.SetString(pEntry->pInputName, pThis->pszInputName, ustrlen(pThis->pszInputName)));
+- CHKiRet(prop.ConstructFinalize(pEntry->pInputName));
++ CHKiRet(prop.Construct(&pEntry->cnf_params->pInputName));
++ CHKiRet(prop.SetString(pEntry->cnf_params->pInputName, pThis->pszInputName, ustrlen(pThis->pszInputName)));
++ CHKiRet(prop.ConstructFinalize(pEntry->cnf_params->pInputName));
+
+ /* support statistics gathering */
+ CHKiRet(ratelimitNew(&pEntry->ratelimiter, "tcperver", NULL));
+@@ -161,7 +151,7 @@ addNewLstnPort(tcpsrv_t *const pThis, const uchar *const pszPort,
+ ratelimitSetThreadSafe(pEntry->ratelimiter);
+
+ CHKiRet(statsobj.Construct(&(pEntry->stats)));
+- snprintf((char*)statname, sizeof(statname), "%s(%s)", pThis->pszInputName, pszPort);
++ snprintf((char*)statname, sizeof(statname), "%s(%s)", pThis->pszInputName, cnf_params->pszPort);
+ statname[sizeof(statname)-1] = '\0'; /* just to be on the save side... */
+ CHKiRet(statsobj.SetName(pEntry->stats, statname));
+ CHKiRet(statsobj.SetOrigin(pEntry->stats, pThis->pszOrigin));
+@@ -177,10 +167,8 @@ addNewLstnPort(tcpsrv_t *const pThis, const uchar *const pszPort,
+ finalize_it:
+ if(iRet != RS_RET_OK) {
+ if(pEntry != NULL) {
+- free(pEntry->pszAddr);
+- free(pEntry->pszPort);
+- if(pEntry->pInputName != NULL) {
+- prop.Destruct(&pEntry->pInputName);
++ if(pEntry->cnf_params->pInputName != NULL) {
++ prop.Destruct(&pEntry->cnf_params->pInputName);
+ }
+ if(pEntry->ratelimiter != NULL) {
+ ratelimitDestruct(pEntry->ratelimiter);
+@@ -201,29 +189,25 @@ addNewLstnPort(tcpsrv_t *const pThis, const uchar *const pszPort,
+ * rgerhards, 2008-03-20
+ */
+ static rsRetVal ATTR_NONNULL(1,2)
+-configureTCPListen(tcpsrv_t *const pThis,
+- const uchar *const pszPort,
+- const int bSuppOctetFram,
+- const uchar *const pszAddr,
+- const uchar *const pszLstnPortFileName)
++configureTCPListen(tcpsrv_t *const pThis, tcpLstnParams_t *const cnf_params)
+ {
++ assert(cnf_params->pszPort != NULL);
+ int i;
+- const uchar *pPort = pszPort;
+ DEFiRet;
+
+- assert(pszPort != NULL);
+ ISOBJ_TYPE_assert(pThis, tcpsrv);
+
+ /* extract port */
++ const uchar *pPort = cnf_params->pszPort;
+ i = 0;
+ while(isdigit((int) *pPort)) {
+ i = i * 10 + *pPort++ - '0';
+ }
+
+ if(i >= 0 && i <= 65535) {
+- CHKiRet(addNewLstnPort(pThis, pszPort, bSuppOctetFram, pszAddr, pszLstnPortFileName));
++ CHKiRet(addNewLstnPort(pThis, cnf_params));
+ } else {
+- LogError(0, NO_ERRCODE, "Invalid TCP listen port %s - ignored.\n", pszPort);
++ LogError(0, NO_ERRCODE, "Invalid TCP listen port %s - ignored.\n", cnf_params->pszPort);
+ }
+
+ finalize_it:
+@@ -331,8 +315,11 @@ deinit_tcp_listener(tcpsrv_t *const pThis)
+ /* free list of tcp listen ports */
+ pEntry = pThis->pLstnPorts;
+ while(pEntry != NULL) {
+- free(pEntry->pszPort);
+- prop.Destruct(&pEntry->pInputName);
++ prop.Destruct(&pEntry->cnf_params->pInputName);
++ free((void*)pEntry->cnf_params->pszPort);
++ free((void*)pEntry->cnf_params->pszAddr);
++ free((void*)pEntry->cnf_params->pszLstnPortFileName);
++ free((void*)pEntry->cnf_params);
+ ratelimitDestruct(pEntry->ratelimiter);
+ statsobj.Destruct(&(pEntry->stats));
+ pDel = pEntry;
+@@ -373,22 +360,21 @@ addTcpLstn(void *pUsr, netstrm_t *pLstn)
+
+
+ /* Initialize TCP listener socket for a single port
++ * Note: at this point, TLS vs. non-TLS does not matter; TLS params are
++ * set on connect!
+ * rgerhards, 2009-05-21
+ */
+ static rsRetVal
+ initTCPListener(tcpsrv_t *pThis, tcpLstnPortList_t *pPortEntry)
+ {
+ DEFiRet;
+- uchar *TCPLstnPort;
+
+ ISOBJ_TYPE_assert(pThis, tcpsrv);
+ assert(pPortEntry != NULL);
+
+- TCPLstnPort = pPortEntry->pszPort;
+-
+ // pPortEntry->pszAddr = NULL ==> bind to all interfaces
+- CHKiRet(netstrm.LstnInit(pThis->pNS, (void*)pPortEntry, addTcpLstn, TCPLstnPort,
+- pPortEntry->pszAddr, pThis->iSessMax, (uchar*)pPortEntry->pszLstnPortFileName));
++ CHKiRet(netstrm.LstnInit(pThis->pNS, (void*)pPortEntry, addTcpLstn,
++ pThis->iSessMax, pPortEntry->cnf_params));
+
+ finalize_it:
+ RETiRet;
+@@ -408,11 +394,12 @@ create_tcp_socket(tcpsrv_t *pThis)
+ /* init all configured ports */
+ pEntry = pThis->pLstnPorts;
+ while(pEntry != NULL) {
++dbgprintf("RGER: configuring listener %p\n", pEntry);
+ localRet = initTCPListener(pThis, pEntry);
+ if(localRet != RS_RET_OK) {
+ LogError(0, localRet, "Could not create tcp listener, ignoring port "
+- "%s bind-address %s.", pEntry->pszPort,
+- (pEntry->pszAddr == NULL) ? "(null)" : (const char*)pEntry->pszAddr);
++ "%s bind-address %s.", pEntry->cnf_params->pszPort,
++ (pEntry->cnf_params->pszAddr == NULL) ? "(null)" : (const char*)pEntry->cnf_params->pszAddr);
+ }
+ pEntry = pEntry->pNext;
+ }
+@@ -1236,15 +1223,6 @@ SetGnutlsPriorityString(tcpsrv_t *pThis, uchar *iVal)
+ RETiRet;
+ }
+
+-static rsRetVal
+-SetLstnPortFileName(tcpsrv_t *pThis, uchar *iVal)
+-{
+- DEFiRet;
+- DBGPRINTF("tcpsrv: LstnPortFileName set to %s\n",
+- (iVal == NULL) ? "(null)" : (const char*) iVal);
+- pThis->pszLstnPortFileName = iVal;
+- RETiRet;
+-}
+
+ static rsRetVal
+ SetOnMsgReceive(tcpsrv_t *pThis, rsRetVal (*OnMsgReceive)(tcps_sess_t*, uchar*, int))
+@@ -1309,6 +1287,7 @@ SetDfltTZ(tcpsrv_t *const pThis, uchar *const tz)
+ {
+ DEFiRet;
+ ISOBJ_TYPE_assert(pThis, tcpsrv);
++dbgprintf("dfltTZ prev: %s\n", pThis->dfltTZ);
+ strncpy((char*)pThis->dfltTZ, (char*)tz, sizeof(pThis->dfltTZ));
+ pThis->dfltTZ[sizeof(pThis->dfltTZ)-1] = '\0';
+ RETiRet;
+@@ -1557,7 +1536,6 @@ CODESTARTobjQueryInterface(tcpsrv)
+ pIf->SetKeepAliveProbes = SetKeepAliveProbes;
+ pIf->SetKeepAliveTime = SetKeepAliveTime;
+ pIf->SetGnutlsPriorityString = SetGnutlsPriorityString;
+- pIf->SetLstnPortFileName = SetLstnPortFileName;
+ pIf->SetUsrP = SetUsrP;
+ pIf->SetInputName = SetInputName;
+ pIf->SetOrigin = SetOrigin;
+diff --git a/runtime/tcpsrv.h b/runtime/tcpsrv.h
+index db5a1d110a..bae7e3b8b9 100644
+--- a/runtime/tcpsrv.h
++++ b/runtime/tcpsrv.h
+@@ -1,6 +1,6 @@
+ /* Definitions for tcpsrv class.
+ *
+- * Copyright 2008-2015 Adiscon GmbH.
++ * Copyright 2008-2020 Adiscon GmbH.
+ *
+ * This file is part of rsyslog.
+ *
+@@ -23,6 +23,7 @@
+
+ #include "obj.h"
+ #include "prop.h"
++#include "net.h"
+ #include "tcps_sess.h"
+ #include "statsobj.h"
+
+@@ -34,19 +35,24 @@ typedef enum ETCPsyslogFramingAnomaly {
+ } eTCPsyslogFramingAnomaly;
+
+
++/* config parameters for TCP listeners */
++struct tcpLstnParams_s {
++ const uchar *pszPort; /**< the ports the listener shall listen on */
++ const uchar *pszAddr; /**< the addrs the listener shall listen on */
++ sbool bSuppOctetFram; /**< do we support octect-counted framing? (if no->legay only!)*/
++ sbool bSPFramingFix; /**< support work-around for broken Cisco ASA framing? */
++ const uchar *pszLstnPortFileName; /**< File in which the dynamic port is written */
++ prop_t *pInputName;
++ ruleset_t *pRuleset; /**< associated ruleset */
++ uchar dfltTZ[8]; /**< default TZ if none in timestamp; '\0' =No Default */
++};
++
+ /* list of tcp listen ports */
+ struct tcpLstnPortList_s {
+- uchar *pszPort; /**< the ports the listener shall listen on */
+- uchar *pszAddr; /**< the addrs the listener shall listen on */
+- prop_t *pInputName;
++ tcpLstnParams_t *cnf_params; /**< listener config parameters */
+ tcpsrv_t *pSrv; /**< pointer to higher-level server instance */
+- ruleset_t *pRuleset; /**< associated ruleset */
+ statsobj_t *stats; /**< associated stats object */
+- sbool bSuppOctetFram; /**< do we support octect-counted framing? (if no->legay only!)*/
+ ratelimit_t *ratelimiter;
+- uchar dfltTZ[8]; /**< default TZ if none in timestamp; '\0' =No Default */
+- sbool bSPFramingFix; /**< support work-around for broken Cisco ASA framing? */
+- const uchar *pszLstnPortFileName; /**< File in which the dynamic port is written */
+ STATSCOUNTER_DEF(ctrSubmit, mutCtrSubmit)
+ tcpLstnPortList_t *pNext; /**< next port or NULL */
+ };
+@@ -130,8 +136,7 @@ BEGINinterface(tcpsrv) /* name must also be changed in ENDinterface macro! */
+ rsRetVal (*Construct)(tcpsrv_t **ppThis);
+ rsRetVal (*ConstructFinalize)(tcpsrv_t __attribute__((unused)) *pThis);
+ rsRetVal (*Destruct)(tcpsrv_t **ppThis);
+- rsRetVal (*ATTR_NONNULL(1,2) configureTCPListen)(tcpsrv_t*,
+- const uchar *pszPort, int bSuppOctetFram, const uchar *pszAddr, const uchar *);
++ rsRetVal (*ATTR_NONNULL(1,2) configureTCPListen)(tcpsrv_t*, tcpLstnParams_t *const cnf_params);
+ rsRetVal (*create_tcp_socket)(tcpsrv_t *pThis);
+ rsRetVal (*Run)(tcpsrv_t *pThis);
+ /* set methods */
+@@ -188,8 +193,6 @@ BEGINinterface(tcpsrv) /* name must also be changed in ENDinterface macro! */
+ rsRetVal (*SetGnutlsPriorityString)(tcpsrv_t*, uchar*);
+ /* added v21 -- Preserve case in fromhost, 2018-08-16 */
+ rsRetVal (*SetPreserveCase)(tcpsrv_t *pThis, int bPreserveCase);
+- /* added v22 -- File for dynamic Port, 2018-08-29 */
+- rsRetVal (*SetLstnPortFileName)(tcpsrv_t*, uchar*);
+ /* added v23 -- Options for stricter driver behavior, 2019-08-16 */
+ rsRetVal (*SetDrvrCheckExtendedKeyUsage)(tcpsrv_t *pThis, int ChkExtendedKeyUsage);
+ rsRetVal (*SetDrvrPrioritizeSAN)(tcpsrv_t *pThis, int prioritizeSan);
+diff --git a/runtime/typedefs.h b/runtime/typedefs.h
+index 06f5c25a8c..000b4da4fe 100644
+--- a/runtime/typedefs.h
++++ b/runtime/typedefs.h
+@@ -123,6 +123,7 @@ typedef int rs_size_t; /* we do never need more than 2Gig strings, signed permit
+ typedef rsRetVal (*prsf_t)(struct vmstk_s*, int); /* pointer to a RainerScript function */
+ typedef uint64 qDeqID; /* queue Dequeue order ID. 32 bits is considered dangerously few */
+
++typedef struct tcpLstnParams_s tcpLstnParams_t;
+ typedef struct tcpLstnPortList_s tcpLstnPortList_t; // TODO: rename?
+ typedef struct strmLstnPortList_s strmLstnPortList_t; // TODO: rename?
+ typedef struct actWrkrIParams actWrkrIParams_t;
diff --git a/SOURCES/rsyslog-8.2102.0-nsd_ossl-better-logs.patch b/SOURCES/rsyslog-8.2102.0-nsd_ossl-better-logs.patch
new file mode 100644
index 0000000..b45f19a
--- /dev/null
+++ b/SOURCES/rsyslog-8.2102.0-nsd_ossl-better-logs.patch
@@ -0,0 +1,124 @@
+diff --git a/runtime/nsd_ossl.c b/runtime/nsd_ossl.c
+index e55b014b2c..431ea738b8 100644
+--- a/runtime/nsd_ossl.c
++++ b/runtime/nsd_ossl.c
+@@ -210,7 +210,8 @@ void osslLastSSLErrorMsg(int ret, SSL *ssl, int severity, const char* pszCallSou
+
+ /* Loop through ERR_get_error */
+ while ((un_error = ERR_get_error()) > 0){
+- LogMsg(0, RS_RET_NO_ERRCODE, severity, "OpenSSL Error Stack: %s", ERR_error_string(un_error, NULL) );
++ LogMsg(0, RS_RET_NO_ERRCODE, severity,
++ "nsd_ossl:OpenSSL Error Stack: %s", ERR_error_string(un_error, NULL) );
+ }
+ }
+
+@@ -721,9 +722,10 @@ osslChkPeerFingerprint(nsd_ossl_t *pThis, X509 *pCert)
+ if(pThis->bReportAuthErr == 1) {
+ errno = 0;
+ LogError(0, RS_RET_INVALID_FINGERPRINT,
+- "nsd_ossl:error:"
+- " peer fingerprint '%s' unknown - we are "
+- "not permitted to talk to it", cstrGetSzStrNoNULL(pstrFingerprint));
++ "nsd_ossl:error: peer fingerprint '%s' unknown - we are "
++ "not permitted to talk to it", cstrGetSzStrNoNULL(pstrFingerprint));
++ LogMsg(0, RS_RET_NO_ERRCODE, LOG_INFO,
++ "nsd_ossl:TLS session terminated with remote syslog server.");
+ pThis->bReportAuthErr = 0;
+ }
+ ABORT_FINALIZE(RS_RET_INVALID_FINGERPRINT);
+@@ -834,8 +836,10 @@ osslChkPeerName(nsd_ossl_t *pThis, X509 *pCert)
+ cstrFinalize(pStr);
+ errno = 0;
+ LogError(0, RS_RET_INVALID_FINGERPRINT, "nsd_ossl:error: peer name not authorized - "
+- "not permitted to talk to it. Names: %s",
+- cstrGetSzStrNoNULL(pStr));
++ "not permitted to talk to it. Names: %s",
++ cstrGetSzStrNoNULL(pStr));
++ LogMsg(0, RS_RET_NO_ERRCODE, LOG_INFO,
++ "nsd_ossl:TLS session terminated with remote syslog server.");
+ pThis->bReportAuthErr = 0;
+ }
+ ABORT_FINALIZE(RS_RET_INVALID_FINGERPRINT);
+@@ -871,8 +875,10 @@ osslChkPeerID(nsd_ossl_t *pThis)
+ if(pThis->bReportAuthErr == 1) {
+ errno = 0;
+ LogError(0, RS_RET_TLS_NO_CERT, "nsd_ossl:error: peer did not provide a certificate, "
+- "not permitted to talk to it");
++ "not permitted to talk to it");
+ pThis->bReportAuthErr = 0;
++ LogMsg(0, RS_RET_NO_ERRCODE, LOG_INFO,
++ "nsd_ossl:TLS session terminated with remote syslog server.");
+ }
+ ABORT_FINALIZE(RS_RET_TLS_NO_CERT);
+ }
+@@ -905,15 +911,19 @@ osslChkPeerCertValidity(nsd_ossl_t *pThis)
+ if (iVerErr == X509_V_ERR_CERT_HAS_EXPIRED) {
+ if (pThis->permitExpiredCerts == OSSL_EXPIRED_DENY) {
+ LogError(0, RS_RET_CERT_EXPIRED,
+- "nsd_ossl:CertValidity check"
+-"- not permitted to talk to peer: certificate expired: %s",
++ "nsd_ossl:CertValidity check - not permitted to talk to peer: "
++ "certificate expired: %s",
+ X509_verify_cert_error_string(iVerErr));
++ LogMsg(0, RS_RET_NO_ERRCODE, LOG_INFO,
++ "nsd_ossl:TLS session terminated with remote syslog server.");
+ ABORT_FINALIZE(RS_RET_CERT_EXPIRED);
+ } else if (pThis->permitExpiredCerts == OSSL_EXPIRED_WARN) {
+ LogMsg(0, RS_RET_NO_ERRCODE, LOG_WARNING,
+- "nsd_ossl:CertValidity check"
+-"- warning talking to peer: certificate expired: %s",
++ "nsd_ossl:CertValidity check - warning talking to peer: "
++ "certificate expired: %s",
+ X509_verify_cert_error_string(iVerErr));
++ LogMsg(0, RS_RET_NO_ERRCODE, LOG_INFO,
++ "nsd_ossl:TLS session terminated with remote syslog server.");
+ } else {
+ dbgprintf("osslChkPeerCertValidity: talking to peer: certificate expired: %s\n",
+ X509_verify_cert_error_string(iVerErr));
+@@ -921,6 +931,8 @@ osslChkPeerCertValidity(nsd_ossl_t *pThis)
+ } else {
+ LogError(0, RS_RET_CERT_INVALID, "nsd_ossl:not permitted to talk to peer: "
+ "certificate validation failed: %s", X509_verify_cert_error_string(iVerErr));
++ LogMsg(0, RS_RET_NO_ERRCODE, LOG_INFO,
++ "nsd_ossl:TLS session terminated with remote syslog server.");
+ ABORT_FINALIZE(RS_RET_CERT_INVALID);
+ }
+ } else {
+@@ -1384,7 +1396,7 @@ osslPostHandshakeCheck(nsd_ossl_t *pNsd)
+ #if OPENSSL_VERSION_NUMBER >= 0x10002000L
+ if(SSL_get_shared_curve(pNsd->ssl, -1) == 0) {
+ LogError(0, RS_RET_NO_ERRCODE, "nsd_ossl:"
+-"No shared curve between syslog client and server.");
++ "No shared curve between syslog client and server.");
+ }
+ #endif
+ sslCipher = (const SSL_CIPHER*) SSL_get_current_cipher(pNsd->ssl);
+@@ -1446,8 +1458,6 @@ osslHandshakeCheck(nsd_ossl_t *pNsd)
+ resErr == SSL_ERROR_WANT_WRITE) {
+ pNsd->rtryCall = osslRtry_handshake;
+ pNsd->rtryOsslErr = resErr; /* Store SSL ErrorCode into*/
+- LogError(0, RS_RET_NO_ERRCODE, "nsd_ossl:"
+-"TLS handshake failed between syslog client and server.");
+ dbgprintf("osslHandshakeCheck: OpenSSL Client handshake does not complete "
+ "immediately - setting to retry (this is OK and normal)\n");
+ FINALIZE;
+@@ -1458,6 +1468,8 @@ osslHandshakeCheck(nsd_ossl_t *pNsd)
+ ABORT_FINALIZE(RS_RET_NO_ERRCODE /*RS_RET_RETRY*/);
+ } else {
+ osslLastSSLErrorMsg(res, pNsd->ssl, LOG_ERR, "osslHandshakeCheck Client");
++ LogMsg(0, RS_RET_NO_ERRCODE, LOG_INFO,
++ "nsd_ossl:TLS session terminated with remote syslog server.");
+ ABORT_FINALIZE(RS_RET_NO_ERRCODE);
+ }
+ }
+@@ -1738,8 +1750,8 @@ Connect(nsd_t *pNsd, int family, uchar *port, uchar *host, char *device)
+ conn = BIO_new_socket(pPtcp->sock, BIO_CLOSE /*BIO_NOCLOSE*/);
+ dbgprintf("Connect: Init conn BIO[%p] done\n", (void *)conn);
+
+- LogMsg(0, RS_RET_NO_ERRCODE, LOG_INFO, "nsd_ossl:"
+-"TLS Connection initiated with remote syslog server.");
++ LogMsg(0, RS_RET_NO_ERRCODE, LOG_INFO, "nsd_ossl: "
++ "TLS Connection initiated with remote syslog server.");
+ /*if we reach this point we are in tls mode */
+ DBGPRINTF("Connect: TLS Mode\n");
+ if(!(pThis->ssl = SSL_new(ctx))) {
diff --git a/SOURCES/rsyslog-8.2102.0-nsd_ossl-memory-leak.patch b/SOURCES/rsyslog-8.2102.0-nsd_ossl-memory-leak.patch
new file mode 100644
index 0000000..7b75773
--- /dev/null
+++ b/SOURCES/rsyslog-8.2102.0-nsd_ossl-memory-leak.patch
@@ -0,0 +1,25 @@
+diff --git a/runtime/nsd_ossl.c b/runtime/nsd_ossl.c
+index 79347916e4..69ec57af09 100644
+--- a/runtime/nsd_ossl.c
++++ b/runtime/nsd_ossl.c
+@@ -1821,11 +1821,8 @@ BIO_set_nbio( conn, 1 );
+ }
+
+
+-/* Empty wrapper for GNUTLS helper function
+- * TODO: implement a similar capability
+- */
+ static rsRetVal
+-SetGnutlsPriorityString(__attribute__((unused)) nsd_t *pNsd, __attribute__((unused)) uchar *gnutlsPriorityString)
++SetGnutlsPriorityString(nsd_t *const pNsd, uchar *const gnutlsPriorityString)
+ {
+ DEFiRet;
+ nsd_ossl_t* pThis = (nsd_ossl_t*) pNsd;
+@@ -1905,6 +1902,7 @@ SetGnutlsPriorityString(__attribute__((unused)) nsd_t *pNsd, __attribute__((unus
+ pThis->gnutlsPriorityString);
+ osslLastSSLErrorMsg(0, NULL, LOG_ERR, "SetGnutlsPriorityString");
+ }
++ SSL_CONF_CTX_free(cctx);
+ }
+ #else
+ dbgprintf("gnutlsPriorityString: set to '%s'\n", gnutlsPriorityString);
diff --git a/SOURCES/rsyslog-8.2102.0-rhbz1832368-prioritize-SAN.patch b/SOURCES/rsyslog-8.2102.0-rhbz1832368-prioritize-SAN.patch
new file mode 100644
index 0000000..07eef68
--- /dev/null
+++ b/SOURCES/rsyslog-8.2102.0-rhbz1832368-prioritize-SAN.patch
@@ -0,0 +1,11 @@
+diff -up rsyslog-8.2102.0/runtime/nsd_gtls.c.orig rsyslog-8.2102.0/runtime/nsd_gtls.c
+--- rsyslog-8.2102.0/runtime/nsd_gtls.c.orig 2021-11-22 09:33:25.501668376 +0100
++++ rsyslog-8.2102.0/runtime/nsd_gtls.c 2021-11-22 09:34:18.423642573 +0100
+@@ -1791,6 +1791,7 @@ AcceptConnReq(nsd_t *pNsd, nsd_t **ppNew
+ pNew->gnutlsPriorityString = pThis->gnutlsPriorityString;
+ pNew->DrvrVerifyDepth = pThis->DrvrVerifyDepth;
+ pNew->dataTypeCheck = pThis->dataTypeCheck;
++ pNew->bSANpriority = pThis->bSANpriority;
+
+ /* if we reach this point, we are in TLS mode */
+ iRet = gtlsInitSession(pNew);
diff --git a/SOURCES/rsyslog-8.2102.0-rhbz1866877-unexpected-length.patch b/SOURCES/rsyslog-8.2102.0-rhbz1866877-unexpected-length.patch
new file mode 100644
index 0000000..1b9fd47
--- /dev/null
+++ b/SOURCES/rsyslog-8.2102.0-rhbz1866877-unexpected-length.patch
@@ -0,0 +1,14 @@
+diff -up rsyslog-8.2102.0/plugins/imjournal/imjournal.c.orig rsyslog-8.2102.0/plugins/imjournal/imjournal.c
+--- rsyslog-8.2102.0/plugins/imjournal/imjournal.c.orig 2021-06-28 09:05:23.283262154 +0200
++++ rsyslog-8.2102.0/plugins/imjournal/imjournal.c 2021-06-28 09:10:05.858381106 +0200
+@@ -424,8 +424,8 @@ readjournal(void)
+ severity = cs.iDfltSeverity;
+ }
+ } else {
+- LogError(0, RS_RET_ERR, "The value of the 'PRIORITY' field has an "
+- "unexpected length: %zu\n", length);
++ DBGPRINTF("The value of the 'PRIORITY' field has an "
++ "unexpected length: %zu value: '%s'\n", length, (const char*)get);
+ }
+ }
+
diff --git a/SOURCES/rsyslog-8.2102.0-rhbz1886400-reduce-default-timeout.patch b/SOURCES/rsyslog-8.2102.0-rhbz1886400-reduce-default-timeout.patch
new file mode 100644
index 0000000..a847084
--- /dev/null
+++ b/SOURCES/rsyslog-8.2102.0-rhbz1886400-reduce-default-timeout.patch
@@ -0,0 +1,21 @@
+diff -up rsyslog-8.2102.0/plugins/omrelp/omrelp.c.orig rsyslog-8.2102.0/plugins/omrelp/omrelp.c
+--- rsyslog-8.2102.0/plugins/omrelp/omrelp.c.orig 2021-06-15 12:46:14.758589030 +0200
++++ rsyslog-8.2102.0/plugins/omrelp/omrelp.c 2021-06-15 12:47:08.130516632 +0200
+@@ -303,7 +303,7 @@ ENDfreeCnf
+ BEGINcreateInstance
+ CODESTARTcreateInstance
+ pData->sizeWindow = 0;
+- pData->timeout = 90;
++ pData->timeout = 5;
+ pData->connTimeout = 10;
+ pData->rebindInterval = 0;
+ pData->bEnableTLS = DFLT_ENABLE_TLS;
+@@ -365,7 +365,7 @@ setInstParamDefaults(instanceData *pData
+ pData->target = NULL;
+ pData->port = NULL;
+ pData->tplName = NULL;
+- pData->timeout = 90;
++ pData->timeout = 5;
+ pData->connTimeout = 10;
+ pData->sizeWindow = 0;
+ pData->rebindInterval = 0;
diff --git a/SOURCES/rsyslog-8.2102.0-rhbz1909639-statefiles-doc.patch b/SOURCES/rsyslog-8.2102.0-rhbz1909639-statefiles-doc.patch
new file mode 100644
index 0000000..b717972
--- /dev/null
+++ b/SOURCES/rsyslog-8.2102.0-rhbz1909639-statefiles-doc.patch
@@ -0,0 +1,47 @@
+diff -up rsyslog-8.2102.0/doc/configuration/modules/imfile.html.state-file-leaking-doc rsyslog-8.2102.0/doc/configuration/modules/imfile.html
+--- rsyslog-8.2102.0/doc/configuration/modules/imfile.html.state-file-leaking-doc 2021-02-15 12:53:31.000000000 +0100
++++ rsyslog-8.2102.0/doc/configuration/modules/imfile.html 2022-03-29 10:35:07.187827004 +0200
+@@ -294,6 +294,28 @@ rsyslog needs write permissions to work
+ also might require SELinux definitions (or similar for other enhanced security
+ systems).
+
++
++
deleteStateOnFileMove
++
++
++type |
++default |
++mandatory |
++obsolete legacy directive |
++
++
++
++binary |
++off |
++no |
++none |
++
++
++
++
This parameter controls if state files are deleted if their associated main file is rotated via move. Usually, this is a good idea, because otherwise state files are not deleted when log rotation occurs.
++
++
However, there is one situation where not deleting associated state file after log rotation makes sense: this is the case if a monitored file is later moved back to the same location as it was before.
++
+
+