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-- |
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 |