Blob Blame History Raw
From bbd8c8c7176148702a737b8df62132cd1e078627 Mon Sep 17 00:00:00 2001
From: Rainer Gerhards <rgerhards@adiscon.com>
Date: Tue, 13 Jan 2015 09:54:41 +0100
Subject: [PATCH] bugfixes for maxMessageSize global parameter

closely related, thus done in a single commit:

- bugfix: invalid data size for iMaxLine global property
  It was defined as int, but inside the config system it was declared as
  size type, which uses int64_t. With legacy config statements, this could
  lead to misadressing, which usually meant the another config variable was
  overwritten (depending on memory layout).
  closes https://github.com/rsyslog/rsyslog/issues/205

- bugfix: negative values for maxMessageSize global parameter were permitted
---
 runtime/glbl.c | 43 ++++++++++++++++++++++++++++++++++++-------
 runtime/glbl.h |  7 ++++---
 2 files changed, 40 insertions(+), 10 deletions(-)

diff --git a/runtime/glbl.c b/runtime/glbl.c
index c57cedf..bfe0b0e 100644
--- a/runtime/glbl.c
+++ b/runtime/glbl.c
@@ -7,7 +7,7 @@
  *
  * Module begun 2008-04-16 by Rainer Gerhards
  *
- * Copyright 2008-2013 Rainer Gerhards and Adiscon GmbH.
+ * Copyright 2008-2015 Rainer Gerhards and Adiscon GmbH.
  *
  * This file is part of the rsyslog runtime library.
  *
@@ -116,6 +116,12 @@ static struct cnfparamvals *cnfparamvals = NULL;
  * each time a new config load begins (TODO: create interface?)
  */
 
+static int
+GetMaxLine(void)
+{
+	return(iMaxLine);
+}
+
 /* define a macro for the simple properties' set and get functions
  * (which are always the same). This is only suitable for pretty
  * simple cases which require neither checks nor memory allocation.
@@ -138,7 +144,6 @@ static dataType Get##nameFunc(void) \
 SIMP_PROP(ParseHOSTNAMEandTAG, bParseHOSTNAMEandTAG, int)
 SIMP_PROP(OptimizeUniProc, bOptimizeUniProc, int)
 SIMP_PROP(PreserveFQDN, bPreserveFQDN, int)
-SIMP_PROP(MaxLine, iMaxLine, int)
 SIMP_PROP(DefPFFamily, iDefPFFamily, int) /* note that in the future we may check the family argument */
 SIMP_PROP(DropMalPTRMsgs, bDropMalPTRMsgs, int)
 SIMP_PROP(Option_DisallowWarning, option_DisallowWarning, int)
@@ -282,6 +287,32 @@ finalize_it:
 }
 
 
+/* This function is used both by legacy and RainerScript conf. It is a real setter. */
+static rsRetVal
+setMaxLine(const int64_t iNew)
+{
+	if(iNew < 128) {
+		errmsg.LogError(0, RS_RET_INVALID_VALUE, "maxMessageSize tried to set "
+				"to %lld, but cannot be less than 128 - set to 128 "
+				"instead", (long long) iNew);
+		iMaxLine = 128;
+	} else if(iNew > (int64_t) INT_MAX) {
+		errmsg.LogError(0, RS_RET_INVALID_VALUE, "maxMessageSize larger than "
+				"INT_MAX (%d) - reduced to INT_MAX", INT_MAX);
+		iMaxLine = INT_MAX;
+	} else {
+		iMaxLine = (int) iNew;
+	}
+}
+
+static rsRetVal
+legacySetMaxMessageSize(void __attribute__((unused)) *pVal, int64_t iNew)
+{
+	DEFiRet;
+	iRet = setMaxLine(iNew);
+	RETiRet;
+}
+
 static rsRetVal
 setDebugFile(void __attribute__((unused)) *pVal, uchar *pNewVal)
 {
@@ -534,10 +565,10 @@ CODESTARTobjQueryInterface(glbl)
 	pIf->GetLocalHostIP = GetLocalHostIP;
 	pIf->SetGlobalInputTermination = SetGlobalInputTermination;
 	pIf->GetGlobalInputTermState = GetGlobalInputTermState;
+	pIf->GetMaxLine = GetMaxLine;
 #define SIMP_PROP(name) \
 	pIf->Get##name = Get##name; \
 	pIf->Set##name = Set##name;
-	SIMP_PROP(MaxLine);
 	SIMP_PROP(OptimizeUniProc);
 	SIMP_PROP(ParseHOSTNAMEandTAG);
 	SIMP_PROP(PreserveFQDN);
@@ -561,7 +592,6 @@ CODESTARTobjQueryInterface(glbl)
 finalize_it:
 ENDobjQueryInterface(glbl)
 
-
 /* Reset config variables to default values.
  * rgerhards, 2008-04-17
  */
@@ -649,7 +679,7 @@ glblDoneLoadCnf(void)
 				"dropmsgswithmaliciousdnsptrrecords")) {
 			bDropMalPTRMsgs = (int) cnfparamvals[i].val.d.n;
 		} else if(!strcmp(paramblk.descr[i].name, "maxmessagesize")) {
-			iMaxLine = (int) cnfparamvals[i].val.d.n;
+			setMaxLine(cnfparamvals[i].val.d.n);
 		} else {
 			dbgprintf("glblDoneLoadCnf: program error, non-handled "
 			  "param '%s'\n", paramblk.descr[i].name);
@@ -681,8 +711,7 @@ BEGINAbstractObjClassInit(glbl, 1, OBJ_IS_CORE_MODULE) /* class, version */
 	CHKiRet(regCfSysLineHdlr((uchar *)"localhostipif", 0, eCmdHdlrGetWord, setLocalHostIPIF, NULL, NULL));
 	CHKiRet(regCfSysLineHdlr((uchar *)"optimizeforuniprocessor", 0, eCmdHdlrBinary, NULL, &bOptimizeUniProc, NULL));
 	CHKiRet(regCfSysLineHdlr((uchar *)"preservefqdn", 0, eCmdHdlrBinary, NULL, &bPreserveFQDN, NULL));
-	CHKiRet(regCfSysLineHdlr((uchar *)"maxmessagesize", 0, eCmdHdlrSize,
-		NULL, &iMaxLine, NULL));
+	CHKiRet(regCfSysLineHdlr((uchar *)"maxmessagesize", 0, eCmdHdlrSize, legacySetMaxMessageSize, NULL, NULL));
 	CHKiRet(regCfSysLineHdlr((uchar *)"resetconfigvariables", 1, eCmdHdlrCustomHandler, resetConfigVariables, NULL, NULL));
 
 	INIT_ATOMIC_HELPER_MUT(mutTerminateInputs);
diff --git a/runtime/glbl.h b/runtime/glbl.h
index 44171f2..b89e202 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-2012 Rainer Gerhards and Adiscon GmbH.
+ * Copyright 2008-2015 Rainer Gerhards and Adiscon GmbH.
  *
  * This file is part of the rsyslog runtime library.
  *
@@ -41,10 +41,10 @@ extern pid_t glbl_ourpid;
 /* interfaces */
 BEGINinterface(glbl) /* name must also be changed in ENDinterface macro! */
 	uchar* (*GetWorkDir)(void);
+	int (*GetMaxLine)(void);
 #define SIMP_PROP(name, dataType) \
 	dataType (*Get##name)(void); \
 	rsRetVal (*Set##name)(dataType);
-	SIMP_PROP(MaxLine, int)
 	SIMP_PROP(OptimizeUniProc, int)
 	SIMP_PROP(PreserveFQDN, int)
 	SIMP_PROP(DefPFFamily, int)
@@ -81,9 +81,10 @@ BEGINinterface(glbl) /* name must also be changed in ENDinterface macro! */
 	/* next change is v9! */
 	/* v8 - 2012-03-21 */
 	prop_t* (*GetLocalHostIP)(void);
+	/* v9 - 2015-01-12  SetMaxLine method removed */
 #undef	SIMP_PROP
 ENDinterface(glbl)
-#define glblCURR_IF_VERSION 7 /* increment whenever you change the interface structure! */
+#define glblCURR_IF_VERSION 9 /* increment whenever you change the interface structure! */
 /* version 2 had PreserveFQDN added - rgerhards, 2008-12-08 */
 
 /* the remaining prototypes */
-- 
2.5.5