diff --git a/SOURCES/rsyslog-7.4.7-rhbz1249907-imjournal-default-tag.patch b/SOURCES/rsyslog-7.4.7-rhbz1249907-imjournal-default-tag.patch new file mode 100644 index 0000000..b91cbe7 --- /dev/null +++ b/SOURCES/rsyslog-7.4.7-rhbz1249907-imjournal-default-tag.patch @@ -0,0 +1,264 @@ +From 9c8beb13cb0d584fb4dc8561c42fa4ae73c841a7 Mon Sep 17 00:00:00 2001 +From: Tomas Heinrich +Date: Thu, 22 Oct 2015 11:56:27 +0200 +Subject: [PATCH] imjournal: enable setting a default message TAG + +Also escape zero bytes in fields' values. +--- + plugins/imjournal/imjournal.c | 129 +++++++++++++++++++++++++----------------- + 1 file changed, 77 insertions(+), 52 deletions(-) + +diff --git a/plugins/imjournal/imjournal.c b/plugins/imjournal/imjournal.c +index 7d42b84..0795e07 100755 +--- a/plugins/imjournal/imjournal.c ++++ b/plugins/imjournal/imjournal.c +@@ -70,6 +70,7 @@ static struct configSettings_s { + int bIgnorePrevious; + int iDfltSeverity; + int iDfltFacility; ++ char *dfltTag; + } cs; + + static rsRetVal facilityHdlr(uchar **pp, void *pVal); +@@ -82,7 +83,8 @@ static struct cnfparamdescr modpdescr[] = { + { "persiststateinterval", eCmdHdlrInt, 0 }, + { "ignorepreviousmessages", eCmdHdlrBinary, 0 }, + { "defaultseverity", eCmdHdlrSeverity, 0 }, +- { "defaultfacility", eCmdHdlrString, 0 } ++ { "defaultfacility", eCmdHdlrString, 0 }, ++ { "defaulttag", eCmdHdlrGetWord, 0 }, + }; + static struct cnfparamblk modpblk = + { CNFPARAMBLK_VERSION, +@@ -93,6 +95,7 @@ static struct cnfparamblk modpblk = + #define DFLT_persiststateinterval 10 + #define DFLT_SEVERITY LOG_PRI(LOG_NOTICE) + #define DFLT_FACILITY LOG_FAC(LOG_USER) ++#define DFLT_TAG "journal" + + static int bLegacyCnfModGlobalsPermitted = 1;/* are legacy module-global config parameters permitted? */ + +@@ -133,6 +136,31 @@ static rsRetVal facilityHdlr(uchar **pp, void *pVal) + } + + ++/* Currently just replaces '\0' with ' '. Not doing so would cause ++ * the value to be truncated. New space is allocated for the resulting ++ * string. ++ */ ++static rsRetVal ++sanitizeValue(const char *in, size_t len, char **out) ++{ ++ char *buf, *p; ++ DEFiRet; ++ ++ CHKmalloc(p = buf = malloc(len + 1)); ++ memcpy(buf, in, len); ++ buf[len] = '\0'; ++ ++ while ((p = memchr(p, '\0', len + buf - p)) != NULL) { ++ *p++ = ' '; ++ } ++ ++ *out = buf; ++ ++finalize_it: ++ RETiRet; ++} ++ ++ + /* enqueue the the journal message into the message queue. + * The provided msg string is not freed - thus must be done + * by the caller. +@@ -189,10 +217,9 @@ readjournal() { + int r; + + /* Information from messages */ +- char *message; +- char *sys_pid; +- char *sys_iden; +- char *sys_iden_help; ++ char *message = NULL; ++ char *sys_iden = NULL; ++ char *sys_iden_help = NULL; + + const void *get; + const void *pidget; +@@ -202,8 +229,6 @@ readjournal() { + + const void *equal_sign; + struct json_object *jval; +- char *data; +- char *name; + size_t l; + + long prefixlen = 0; +@@ -215,11 +240,7 @@ readjournal() { + if (sd_journal_get_data(j, "MESSAGE", &get, &length) < 0) { + message = strdup(""); + } else { +- message = strndup(get+8, length-8); +- if (message == NULL) { +- iRet = RS_RET_OUT_OF_MEMORY; +- goto ret; +- } ++ CHKiRet(sanitizeValue(((const char *)get) + 8, length - 8, &message)); + } + + /* Get message severity ("priority" in journald's terminology) */ +@@ -258,43 +279,46 @@ readjournal() { + + /* Get message identifier, client pid and add ':' */ + if (sd_journal_get_data(j, "SYSLOG_IDENTIFIER", &get, &length) >= 0) { +- sys_iden = strndup(get+18, length-18); +- } else { +- sys_iden = strdup("journal"); +- } +- if (sys_iden == NULL) { +- iRet = RS_RET_OUT_OF_MEMORY; +- goto free_message; ++ CHKiRet(sanitizeValue(((const char *)get) + 18, length - 18, &sys_iden)); + } + +- if (sd_journal_get_data(j, "SYSLOG_PID", &pidget, &pidlength) >= 0) { +- sys_pid = strndup(pidget+11, pidlength-11); +- if (sys_pid == NULL) { +- iRet = RS_RET_OUT_OF_MEMORY; +- free (sys_iden); +- goto free_message; +- } ++ if (sys_iden == NULL && !cs.dfltTag[0]) { ++ /* This is a special case: if no tag was obtained from ++ * the message and the user has set the default tag to ++ * an empty string, nothing is inserted. ++ */ ++ CHKmalloc(sys_iden_help = calloc(1, 1)); + } else { +- sys_pid = NULL; +- } ++ if (sys_iden == NULL) { ++ /* Use a predefined tag if it can't be obtained from the message */ ++ CHKmalloc(sys_iden = strdup(cs.dfltTag)); ++ } ++ if (sd_journal_get_data(j, "SYSLOG_PID", &pidget, &pidlength) >= 0) { ++ char *sys_pid; + +- if (sys_pid) { +- r = asprintf(&sys_iden_help, "%s[%s]:", sys_iden, sys_pid); +- } else { +- r = asprintf(&sys_iden_help, "%s:", sys_iden); +- } ++ CHKiRet_Hdlr(sanitizeValue(((const char *)pidget) + 11, pidlength - 11, &sys_pid)) { ++ free (sys_iden); ++ FINALIZE; ++ } ++ r = asprintf(&sys_iden_help, "%s[%s]:", sys_iden, sys_pid); ++ free (sys_pid); ++ } else { ++ r = asprintf(&sys_iden_help, "%s:", sys_iden); ++ } + +- free (sys_iden); +- free (sys_pid); ++ free (sys_iden); + +- if (-1 == r) { +- iRet = RS_RET_OUT_OF_MEMORY; +- goto finalize_it; ++ if (-1 == r) { ++ ABORT_FINALIZE(RS_RET_OUT_OF_MEMORY); ++ } + } + + json = json_object_new_object(); + + SD_JOURNAL_FOREACH_DATA(j, get, l) { ++ char *data; ++ char *name; ++ + /* locate equal sign, this is always present */ + equal_sign = memchr(get, '=', l); + +@@ -366,18 +390,13 @@ readjournal() { + break; + } + +- if (name == NULL) { +- iRet = RS_RET_OUT_OF_MEMORY; +- goto ret; +- } ++ CHKmalloc(name); + + prefixlen++; /* remove '=' */ + +- data = strndup(get + prefixlen, l - prefixlen); +- if (data == NULL) { +- iRet = RS_RET_OUT_OF_MEMORY; ++ CHKiRet_Hdlr(sanitizeValue(((const char *)get) + prefixlen, l - prefixlen, &data)) { + free (name); +- goto ret; ++ FINALIZE; + } + + /* and save them to json object */ +@@ -397,10 +416,10 @@ readjournal() { + enqMsg((uchar *)message, (uchar *) sys_iden_help, facility, severity, &tv, json); + + finalize_it: +- free(sys_iden_help); +-free_message: +- free(message); +-ret: ++ if (sys_iden_help != NULL) ++ free(sys_iden_help); ++ if (message != NULL) ++ free(message); + RETiRet; + } + +@@ -616,11 +635,14 @@ CODESTARTbeginCnfLoad + cs.ratelimitInterval = 600; + cs.iDfltSeverity = DFLT_SEVERITY; + cs.iDfltFacility = DFLT_FACILITY; ++ cs.dfltTag = NULL; + ENDbeginCnfLoad + + + BEGINendCnfLoad + CODESTARTendCnfLoad ++ if (cs.dfltTag == NULL) ++ cs.dfltTag = strdup(DFLT_TAG); + ENDendCnfLoad + + +@@ -636,6 +658,7 @@ ENDactivateCnf + + BEGINfreeCnf + CODESTARTfreeCnf ++ free(cs.dfltTag); + ENDfreeCnf + + /* open journal */ +@@ -715,6 +738,8 @@ CODESTARTsetModCnf + fac = p = es_str2cstr(pvals[i].val.d.estr, NULL); + facilityHdlr((uchar **) &p, (void *) &cs.iDfltFacility); + free(fac); ++ } 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); +@@ -772,8 +797,8 @@ CODEmodInit_QueryRegCFSLineHdlr + NULL, &cs.iDfltSeverity, STD_LOADABLE_MODULE_ID)); + CHKiRet(omsdRegCFSLineHdlr((uchar *)"imjournaldefaultfacility", 0, eCmdHdlrCustomHandler, + facilityHdlr, &cs.iDfltFacility, STD_LOADABLE_MODULE_ID)); +- +- ++ CHKiRet(omsdRegCFSLineHdlr((uchar *)"imjournaldefaulttag", 0, eCmdHdlrGetWord, ++ NULL, &cs.dfltTag, STD_LOADABLE_MODULE_ID)); + ENDmodInit + /* vim:set ai: + */ +-- +1.9.3 + diff --git a/SPECS/rsyslog.spec b/SPECS/rsyslog.spec index 464e203..12b749e 100644 --- a/SPECS/rsyslog.spec +++ b/SPECS/rsyslog.spec @@ -13,7 +13,7 @@ Summary: Enhanced system logging and kernel message trapping daemon Name: rsyslog Version: 7.4.7 -Release: 7%{?dist} +Release: 7%{?dist}.1 License: (GPLv3+ and ASL 2.0) Group: System Environment/Daemons URL: http://www.rsyslog.com/ @@ -38,6 +38,7 @@ Patch8: rsyslog-7.4.7-bz1052266-dont-link-libee.patch Patch9: rsyslog-7.4.7-bz1054171-omjournal-warning.patch Patch10: rsyslog-7.4.7-bz1038136-imjournal-message-loss.patch Patch11: rsyslog-7.4.7-bz1142373-cve-2014-3634.patch +Patch12: rsyslog-7.4.7-rhbz1249907-imjournal-default-tag.patch BuildRequires: bison BuildRequires: flex @@ -269,6 +270,7 @@ of source ports. %patch9 -p1 %patch10 -p1 %patch11 -p1 +%patch12 -p1 %build %ifarch sparc64 @@ -502,9 +504,13 @@ done %{_libdir}/rsyslog/omudpspoof.so %changelog +* Thu Oct 22 2015 Tomas Heinrich 7.4.7-7.el7_1.1 +- add a patch to enable setting a default TAG + resolves: rhbz#1249907 + * Tue Oct 07 2014 Tomas Heinrich 7.4.7-7 - fix CVE-2014-3634 - resolves: #1149152 + resolves: #1149153 * Wed Mar 26 2014 Tomas Heinrich 7.4.7-6 - disable the imklog plugin by default