summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Biebl <biebl@debian.org>2012-02-12 20:04:17 +0100
committerMichael Biebl <biebl@debian.org>2012-02-12 20:04:17 +0100
commita7caed21068d33c1b76a9383e723507a85611a66 (patch)
tree2518f4b1329907de5b81b8235ab571728543b06e
parent495b0e32423540eaf5a5d7405465e663c12d3f95 (diff)
downloadrsyslog-a7caed21068d33c1b76a9383e723507a85611a66.tar.gz
Don't rely on PATH_MAX being defined.
* debian/patches/02-path_max.patch - Don't rely on PATH_MAX being defined. Patch cherry-picked from upstream Git. (Closes: #651529)
-rw-r--r--debian/changelog3
-rw-r--r--debian/patches/02-path_max.patch178
-rw-r--r--debian/patches/series1
3 files changed, 182 insertions, 0 deletions
diff --git a/debian/changelog b/debian/changelog
index 25383dd..ee4086c 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -10,6 +10,9 @@ rsyslog (5.8.7-1) UNRELEASED; urgency=low
* Strip debian/tmp/ from .install files.
* Install tmpfiles.d snippet to create /dev/xconsole when running systemd.
(Closes: #634978)
+ * debian/patches/02-path_max.patch
+ - Don't rely on PATH_MAX being defined. Patch cherry-picked from upstream
+ Git. (Closes: #651529)
-- Michael Biebl <biebl@debian.org> Sun, 12 Feb 2012 11:22:26 +0100
diff --git a/debian/patches/02-path_max.patch b/debian/patches/02-path_max.patch
new file mode 100644
index 0000000..2ab2ab1
--- /dev/null
+++ b/debian/patches/02-path_max.patch
@@ -0,0 +1,178 @@
+From: Rainer Gerhards <rgerhards@adiscon.com>
+Date: Fri, 16 Dec 2011 11:14:48 +0000 (+0100)
+Subject: enhanced module loader to not rely on PATH_MAX
+X-Git-Tag: v5.9.6~29
+X-Git-Url: http://git.adiscon.com/?p=rsyslog.git;a=commitdiff_plain;h=01c7c9ffc6771f73df9ee0bc
+
+enhanced module loader to not rely on PATH_MAX
+---
+
+diff --git a/runtime/modules.c b/runtime/modules.c
+index 4541bdd..6a32b2e 100644
+--- a/runtime/modules.c
++++ b/runtime/modules.c
+@@ -767,7 +767,6 @@ Load(uchar *pModName)
+ DEFiRet;
+
+ size_t iPathLen, iModNameLen;
+- uchar szPath[PATH_MAX];
+ uchar *pModNameCmp;
+ int bHasExtension;
+ void *pModHdlr, *pModInit;
+@@ -775,13 +774,25 @@ Load(uchar *pModName)
+ uchar *pModDirCurr, *pModDirNext;
+ int iLoadCnt;
+ struct dlhandle_s *pHandle = NULL;
++# ifdef PATH_MAX
++ uchar pathBuf[PATH_MAX+1];
++# else
++ uchar pathBuf[4096];
++# endif
++ uchar *pPathBuf = pathBuf;
++ size_t lenPathBuf = sizeof(pathBuf);
+
+ assert(pModName != NULL);
+ dbgprintf("Requested to load module '%s'\n", pModName);
+
++ iModNameLen = strlen((char*)pModName);
++ /* overhead for a full path is potentially 1 byte for a slash,
++ * three bytes for ".so" and one byte for '\0'.
++ */
++# define PATHBUF_OVERHEAD 1 + iModNameLen + 3 + 1
++
+ pthread_mutex_lock(&mutLoadUnload);
+
+- iModNameLen = strlen((char *) pModName);
+ if(iModNameLen > 3 && !strcmp((char *) pModName + iModNameLen - 3, ".so")) {
+ iModNameLen -= 3;
+ bHasExtension = TRUE;
+@@ -802,13 +813,19 @@ Load(uchar *pModName)
+ pModDirNext = NULL;
+ pModHdlr = NULL;
+ iLoadCnt = 0;
+- do {
+- /* now build our load module name */
++ do { /* now build our load module name */
+ if(*pModName == '/' || *pModName == '.') {
+- *szPath = '\0'; /* we do not need to append the path - its already in the module name */
++ if(lenPathBuf < PATHBUF_OVERHEAD) {
++ if(pPathBuf != pathBuf) /* already malloc()ed memory? */
++ free(pPathBuf);
++ /* we always alloc enough memory for everything we potentiall need to add */
++ lenPathBuf = PATHBUF_OVERHEAD;
++ CHKmalloc(pPathBuf = malloc(sizeof(char)*lenPathBuf));
++ }
++ *pPathBuf = '\0'; /* we do not need to append the path - its already in the module name */
+ iPathLen = 0;
+ } else {
+- *szPath = '\0';
++ *pPathBuf = '\0';
+
+ iPathLen = strlen((char *)pModDirCurr);
+ pModDirNext = (uchar *)strchr((char *)pModDirCurr, ':');
+@@ -821,30 +838,27 @@ Load(uchar *pModName)
+ continue;
+ }
+ break;
+- } else if(iPathLen > sizeof(szPath) - 1) {
+- errmsg.LogError(0, NO_ERRCODE, "could not load module '%s', module path too long\n", pModName);
+- ABORT_FINALIZE(RS_RET_MODULE_LOAD_ERR_PATHLEN);
++ } else if(iPathLen > lenPathBuf - PATHBUF_OVERHEAD) {
++ if(pPathBuf != pathBuf) /* already malloc()ed memory? */
++ free(pPathBuf);
++ /* we always alloc enough memory for everything we potentiall need to add */
++ lenPathBuf = iPathLen + PATHBUF_OVERHEAD;
++ CHKmalloc(pPathBuf = malloc(sizeof(char)*lenPathBuf));
+ }
+
+- strncat((char *) szPath, (char *)pModDirCurr, iPathLen);
+- iPathLen = strlen((char*) szPath);
++ memcpy((char *) pPathBuf, (char *)pModDirCurr, iPathLen);
++ if((pPathBuf[iPathLen - 1] != '/')) {
++ /* we have space, made sure in previous check */
++ pPathBuf[iPathLen++] = '/';
++ }
++ pPathBuf[iPathLen] = '\0';
+
+ if(pModDirNext)
+ pModDirCurr = pModDirNext + 1;
+-
+- if((szPath[iPathLen - 1] != '/')) {
+- if((iPathLen <= sizeof(szPath) - 2)) {
+- szPath[iPathLen++] = '/';
+- szPath[iPathLen] = '\0';
+- } else {
+- errmsg.LogError(0, RS_RET_MODULE_LOAD_ERR_PATHLEN, "could not load module '%s', path too long\n", pModName);
+- ABORT_FINALIZE(RS_RET_MODULE_LOAD_ERR_PATHLEN);
+- }
+- }
+ }
+
+ /* ... add actual name ... */
+- strncat((char *) szPath, (char *) pModName, sizeof(szPath) - iPathLen - 1);
++ strncat((char *) pPathBuf, (char *) pModName, lenPathBuf - iPathLen - 1);
+
+ /* now see if we have an extension and, if not, append ".so" */
+ if(!bHasExtension) {
+@@ -853,17 +867,12 @@ Load(uchar *pModName)
+ * algo over time... -- rgerhards, 2008-03-05
+ */
+ /* ... so now add the extension */
+- strncat((char *) szPath, ".so", sizeof(szPath) - strlen((char*) szPath) - 1);
++ strncat((char *) pPathBuf, ".so", lenPathBuf - strlen((char*) pPathBuf) - 1);
+ iPathLen += 3;
+ }
+
+- if(iPathLen + strlen((char*) pModName) >= sizeof(szPath)) {
+- errmsg.LogError(0, RS_RET_MODULE_LOAD_ERR_PATHLEN, "could not load module '%s', path too long\n", pModName);
+- ABORT_FINALIZE(RS_RET_MODULE_LOAD_ERR_PATHLEN);
+- }
+-
+ /* complete load path constructed, so ... GO! */
+- dbgprintf("loading module '%s'\n", szPath);
++ dbgprintf("loading module '%s'\n", pPathBuf);
+
+ /* see if we have this one already */
+ for (pHandle = pHandles; pHandle; pHandle = pHandle->next) {
+@@ -875,7 +884,7 @@ Load(uchar *pModName)
+
+ /* not found, try to dynamically link it */
+ if (!pModHdlr) {
+- pModHdlr = dlopen((char *) szPath, RTLD_NOW);
++ pModHdlr = dlopen((char *) pPathBuf, RTLD_NOW);
+ }
+
+ iLoadCnt++;
+@@ -884,25 +893,28 @@ Load(uchar *pModName)
+
+ if(!pModHdlr) {
+ if(iLoadCnt) {
+- errmsg.LogError(0, RS_RET_MODULE_LOAD_ERR_DLOPEN, "could not load module '%s', dlopen: %s\n", szPath, dlerror());
++ errmsg.LogError(0, RS_RET_MODULE_LOAD_ERR_DLOPEN, "could not load module '%s', dlopen: %s\n",
++ pPathBuf, dlerror());
+ } else {
+- errmsg.LogError(0, NO_ERRCODE, "could not load module '%s', ModDir was '%s'\n", szPath,
++ errmsg.LogError(0, NO_ERRCODE, "could not load module '%s', ModDir was '%s'\n", pPathBuf,
+ ((pModDir == NULL) ? _PATH_MODDIR : (char *)pModDir));
+ }
+ ABORT_FINALIZE(RS_RET_MODULE_LOAD_ERR_DLOPEN);
+ }
+ if(!(pModInit = dlsym(pModHdlr, "modInit"))) {
+- errmsg.LogError(0, RS_RET_MODULE_LOAD_ERR_NO_INIT, "could not load module '%s', dlsym: %s\n", szPath, dlerror());
++ errmsg.LogError(0, RS_RET_MODULE_LOAD_ERR_NO_INIT, "could not load module '%s', dlsym: %s\n", pPathBuf, dlerror());
+ dlclose(pModHdlr);
+ ABORT_FINALIZE(RS_RET_MODULE_LOAD_ERR_NO_INIT);
+ }
+ if((iRet = doModInit(pModInit, (uchar*) pModName, pModHdlr)) != RS_RET_OK) {
+- errmsg.LogError(0, RS_RET_MODULE_LOAD_ERR_INIT_FAILED, "could not load module '%s', rsyslog error %d\n", szPath, iRet);
++ errmsg.LogError(0, RS_RET_MODULE_LOAD_ERR_INIT_FAILED, "could not load module '%s', rsyslog error %d\n", pPathBuf, iRet);
+ dlclose(pModHdlr);
+ ABORT_FINALIZE(RS_RET_MODULE_LOAD_ERR_INIT_FAILED);
+ }
+
+ finalize_it:
++ if(pPathBuf != pathBuf) /* used malloc()ed memory? */
++ free(pPathBuf);
+ pthread_mutex_unlock(&mutLoadUnload);
+ RETiRet;
+ }
diff --git a/debian/patches/series b/debian/patches/series
index 2113a56..c92adc9 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -1,2 +1,3 @@
# Debian patches for rsyslog
01-dont_create_db.patch
+02-path_max.patch