components/rsyslog/patches/01-dynafile_segfault.patch
author John Beck <John.Beck@Oracle.COM>
Mon, 16 May 2016 17:10:31 -0700
changeset 6008 b325e8629cb1
parent 5141 f6119b010ffa
permissions -rw-r--r--
23294038 do not publish pango when BUILD_TYPE=evaluation
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5141
f6119b010ffa 22265649 rsyslogd segfaults reliably if a dynafile can't be created
Andrew Balfour <Andrew.Balfour@Oracle.COM>
parents:
diff changeset
     1
# This patch addresses a few issues in the dynafile actions for omfiles.
f6119b010ffa 22265649 rsyslogd segfaults reliably if a dynafile can't be created
Andrew Balfour <Andrew.Balfour@Oracle.COM>
parents:
diff changeset
     2
# Specifcally if the target file cannot be opened, rsyslogd will segfault.
f6119b010ffa 22265649 rsyslogd segfaults reliably if a dynafile can't be created
Andrew Balfour <Andrew.Balfour@Oracle.COM>
parents:
diff changeset
     3
# The patch is from an upstream pull:
f6119b010ffa 22265649 rsyslogd segfaults reliably if a dynafile can't be created
Andrew Balfour <Andrew.Balfour@Oracle.COM>
parents:
diff changeset
     4
# https://github.com/rsyslog/rsyslog/pull/450/commits
f6119b010ffa 22265649 rsyslogd segfaults reliably if a dynafile can't be created
Andrew Balfour <Andrew.Balfour@Oracle.COM>
parents:
diff changeset
     5
# and should be removed when rsyslog is moved to or past version 8.12.0
f6119b010ffa 22265649 rsyslogd segfaults reliably if a dynafile can't be created
Andrew Balfour <Andrew.Balfour@Oracle.COM>
parents:
diff changeset
     6
f6119b010ffa 22265649 rsyslogd segfaults reliably if a dynafile can't be created
Andrew Balfour <Andrew.Balfour@Oracle.COM>
parents:
diff changeset
     7
--- rsyslog/runtime/srutils.c.1	Wed Nov 25 10:48:03 2015
f6119b010ffa 22265649 rsyslogd segfaults reliably if a dynafile can't be created
Andrew Balfour <Andrew.Balfour@Oracle.COM>
parents:
diff changeset
     8
+++ rsyslog/runtime/srutils.c	Wed Nov 25 10:49:05 2015
f6119b010ffa 22265649 rsyslogd segfaults reliably if a dynafile can't be created
Andrew Balfour <Andrew.Balfour@Oracle.COM>
parents:
diff changeset
     9
@@ -198,7 +198,6 @@
f6119b010ffa 22265649 rsyslogd segfaults reliably if a dynafile can't be created
Andrew Balfour <Andrew.Balfour@Oracle.COM>
parents:
diff changeset
    10
         uchar *p;
f6119b010ffa 22265649 rsyslogd segfaults reliably if a dynafile can't be created
Andrew Balfour <Andrew.Balfour@Oracle.COM>
parents:
diff changeset
    11
         uchar *pszWork;
f6119b010ffa 22265649 rsyslogd segfaults reliably if a dynafile can't be created
Andrew Balfour <Andrew.Balfour@Oracle.COM>
parents:
diff changeset
    12
         size_t len;
f6119b010ffa 22265649 rsyslogd segfaults reliably if a dynafile can't be created
Andrew Balfour <Andrew.Balfour@Oracle.COM>
parents:
diff changeset
    13
-	int err;
f6119b010ffa 22265649 rsyslogd segfaults reliably if a dynafile can't be created
Andrew Balfour <Andrew.Balfour@Oracle.COM>
parents:
diff changeset
    14
 	int iTry = 0;
f6119b010ffa 22265649 rsyslogd segfaults reliably if a dynafile can't be created
Andrew Balfour <Andrew.Balfour@Oracle.COM>
parents:
diff changeset
    15
 	int bErr = 0;
f6119b010ffa 22265649 rsyslogd segfaults reliably if a dynafile can't be created
Andrew Balfour <Andrew.Balfour@Oracle.COM>
parents:
diff changeset
    16
f6119b010ffa 22265649 rsyslogd segfaults reliably if a dynafile can't be created
Andrew Balfour <Andrew.Balfour@Oracle.COM>
parents:
diff changeset
    17
@@ -215,7 +214,7 @@
f6119b010ffa 22265649 rsyslogd segfaults reliably if a dynafile can't be created
Andrew Balfour <Andrew.Balfour@Oracle.COM>
parents:
diff changeset
    18
                         *p = '\0';
f6119b010ffa 22265649 rsyslogd segfaults reliably if a dynafile can't be created
Andrew Balfour <Andrew.Balfour@Oracle.COM>
parents:
diff changeset
    19
 again:
f6119b010ffa 22265649 rsyslogd segfaults reliably if a dynafile can't be created
Andrew Balfour <Andrew.Balfour@Oracle.COM>
parents:
diff changeset
    20
                         if(access((char*)pszWork, F_OK)) {
f6119b010ffa 22265649 rsyslogd segfaults reliably if a dynafile can't be created
Andrew Balfour <Andrew.Balfour@Oracle.COM>
parents:
diff changeset
    21
-                                if((err = mkdir((char*)pszWork, mode)) == 0) {
f6119b010ffa 22265649 rsyslogd segfaults reliably if a dynafile can't be created
Andrew Balfour <Andrew.Balfour@Oracle.COM>
parents:
diff changeset
    22
+                                if(mkdir((char*)pszWork, mode) == 0) {
f6119b010ffa 22265649 rsyslogd segfaults reliably if a dynafile can't be created
Andrew Balfour <Andrew.Balfour@Oracle.COM>
parents:
diff changeset
    23
 					if(uid != (uid_t) -1 || gid != (gid_t) -1) {
f6119b010ffa 22265649 rsyslogd segfaults reliably if a dynafile can't be created
Andrew Balfour <Andrew.Balfour@Oracle.COM>
parents:
diff changeset
    24
 						/* we need to set owner/group */
f6119b010ffa 22265649 rsyslogd segfaults reliably if a dynafile can't be created
Andrew Balfour <Andrew.Balfour@Oracle.COM>
parents:
diff changeset
    25
 						if(chown((char*)pszWork, uid, gid) != 0)
f6119b010ffa 22265649 rsyslogd segfaults reliably if a dynafile can't be created
Andrew Balfour <Andrew.Balfour@Oracle.COM>
parents:
diff changeset
    26
@@ -226,7 +225,7 @@
f6119b010ffa 22265649 rsyslogd segfaults reliably if a dynafile can't be created
Andrew Balfour <Andrew.Balfour@Oracle.COM>
parents:
diff changeset
    27
 							 */
f6119b010ffa 22265649 rsyslogd segfaults reliably if a dynafile can't be created
Andrew Balfour <Andrew.Balfour@Oracle.COM>
parents:
diff changeset
    28
 					}
f6119b010ffa 22265649 rsyslogd segfaults reliably if a dynafile can't be created
Andrew Balfour <Andrew.Balfour@Oracle.COM>
parents:
diff changeset
    29
 				} else {
f6119b010ffa 22265649 rsyslogd segfaults reliably if a dynafile can't be created
Andrew Balfour <Andrew.Balfour@Oracle.COM>
parents:
diff changeset
    30
-					if(err == EEXIST && iTry == 0) {
f6119b010ffa 22265649 rsyslogd segfaults reliably if a dynafile can't be created
Andrew Balfour <Andrew.Balfour@Oracle.COM>
parents:
diff changeset
    31
+					if(errno == EEXIST && iTry == 0) {
f6119b010ffa 22265649 rsyslogd segfaults reliably if a dynafile can't be created
Andrew Balfour <Andrew.Balfour@Oracle.COM>
parents:
diff changeset
    32
 						iTry = 1;
f6119b010ffa 22265649 rsyslogd segfaults reliably if a dynafile can't be created
Andrew Balfour <Andrew.Balfour@Oracle.COM>
parents:
diff changeset
    33
 						goto again;
f6119b010ffa 22265649 rsyslogd segfaults reliably if a dynafile can't be created
Andrew Balfour <Andrew.Balfour@Oracle.COM>
parents:
diff changeset
    34
 						}
f6119b010ffa 22265649 rsyslogd segfaults reliably if a dynafile can't be created
Andrew Balfour <Andrew.Balfour@Oracle.COM>
parents:
diff changeset
    35
--- rsyslog/tools/omfile.c.1	Wed Nov 25 10:39:15 2015
f6119b010ffa 22265649 rsyslogd segfaults reliably if a dynafile can't be created
Andrew Balfour <Andrew.Balfour@Oracle.COM>
parents:
diff changeset
    36
+++ rsyslog/tools/omfile.c	Wed Nov 25 10:47:18 2015
f6119b010ffa 22265649 rsyslogd segfaults reliably if a dynafile can't be created
Andrew Balfour <Andrew.Balfour@Oracle.COM>
parents:
diff changeset
    37
@@ -723,12 +723,6 @@
f6119b010ffa 22265649 rsyslogd segfaults reliably if a dynafile can't be created
Andrew Balfour <Andrew.Balfour@Oracle.COM>
parents:
diff changeset
    38
 	/* we have not found an entry */
f6119b010ffa 22265649 rsyslogd segfaults reliably if a dynafile can't be created
Andrew Balfour <Andrew.Balfour@Oracle.COM>
parents:
diff changeset
    39
 	STATSCOUNTER_INC(pData->ctrMiss, pData->mutCtrMiss);
f6119b010ffa 22265649 rsyslogd segfaults reliably if a dynafile can't be created
Andrew Balfour <Andrew.Balfour@Oracle.COM>
parents:
diff changeset
    40
f6119b010ffa 22265649 rsyslogd segfaults reliably if a dynafile can't be created
Andrew Balfour <Andrew.Balfour@Oracle.COM>
parents:
diff changeset
    41
-	/* invalidate iCurrElt as we may error-exit out of this function when the currrent
f6119b010ffa 22265649 rsyslogd segfaults reliably if a dynafile can't be created
Andrew Balfour <Andrew.Balfour@Oracle.COM>
parents:
diff changeset
    42
-	 * iCurrElt has been freed or otherwise become unusable. This is a precaution, and
f6119b010ffa 22265649 rsyslogd segfaults reliably if a dynafile can't be created
Andrew Balfour <Andrew.Balfour@Oracle.COM>
parents:
diff changeset
    43
-	 * performance-wise it may be better to do that in each of the exits. However, that
f6119b010ffa 22265649 rsyslogd segfaults reliably if a dynafile can't be created
Andrew Balfour <Andrew.Balfour@Oracle.COM>
parents:
diff changeset
    44
-	 * is error-prone, so I prefer to do it here. -- rgerhards, 2010-03-02
f6119b010ffa 22265649 rsyslogd segfaults reliably if a dynafile can't be created
Andrew Balfour <Andrew.Balfour@Oracle.COM>
parents:
diff changeset
    45
-	 */
f6119b010ffa 22265649 rsyslogd segfaults reliably if a dynafile can't be created
Andrew Balfour <Andrew.Balfour@Oracle.COM>
parents:
diff changeset
    46
-	pData->iCurrElt = -1;
f6119b010ffa 22265649 rsyslogd segfaults reliably if a dynafile can't be created
Andrew Balfour <Andrew.Balfour@Oracle.COM>
parents:
diff changeset
    47
 	/* similarly, we need to set the current pStrm to NULL, because otherwise, if prepareFile() fails,
f6119b010ffa 22265649 rsyslogd segfaults reliably if a dynafile can't be created
Andrew Balfour <Andrew.Balfour@Oracle.COM>
parents:
diff changeset
    48
 	 * we may end up using an old stream. This bug depends on how exactly prepareFile fails,
f6119b010ffa 22265649 rsyslogd segfaults reliably if a dynafile can't be created
Andrew Balfour <Andrew.Balfour@Oracle.COM>
parents:
diff changeset
    49
 	 * but it could be triggered in the common case of a failed open() system call.
f6119b010ffa 22265649 rsyslogd segfaults reliably if a dynafile can't be created
Andrew Balfour <Andrew.Balfour@Oracle.COM>
parents:
diff changeset
    50
@@ -779,7 +773,8 @@
f6119b010ffa 22265649 rsyslogd segfaults reliably if a dynafile can't be created
Andrew Balfour <Andrew.Balfour@Oracle.COM>
parents:
diff changeset
    51
 	DBGPRINTF("Added new entry %d for file cache, file '%s'.\n", iFirstFree, newFileName);
f6119b010ffa 22265649 rsyslogd segfaults reliably if a dynafile can't be created
Andrew Balfour <Andrew.Balfour@Oracle.COM>
parents:
diff changeset
    52
f6119b010ffa 22265649 rsyslogd segfaults reliably if a dynafile can't be created
Andrew Balfour <Andrew.Balfour@Oracle.COM>
parents:
diff changeset
    53
 finalize_it:
f6119b010ffa 22265649 rsyslogd segfaults reliably if a dynafile can't be created
Andrew Balfour <Andrew.Balfour@Oracle.COM>
parents:
diff changeset
    54
-	pCache[pData->iCurrElt]->nInactive = 0;
f6119b010ffa 22265649 rsyslogd segfaults reliably if a dynafile can't be created
Andrew Balfour <Andrew.Balfour@Oracle.COM>
parents:
diff changeset
    55
+	if(iRet == RS_RET_OK)
f6119b010ffa 22265649 rsyslogd segfaults reliably if a dynafile can't be created
Andrew Balfour <Andrew.Balfour@Oracle.COM>
parents:
diff changeset
    56
+		pCache[pData->iCurrElt]->nInactive = 0;
f6119b010ffa 22265649 rsyslogd segfaults reliably if a dynafile can't be created
Andrew Balfour <Andrew.Balfour@Oracle.COM>
parents:
diff changeset
    57
 	RETiRet;
f6119b010ffa 22265649 rsyslogd segfaults reliably if a dynafile can't be created
Andrew Balfour <Andrew.Balfour@Oracle.COM>
parents:
diff changeset
    58
 }
f6119b010ffa 22265649 rsyslogd segfaults reliably if a dynafile can't be created
Andrew Balfour <Andrew.Balfour@Oracle.COM>
parents:
diff changeset
    59