mirror of
https://github.com/rsyslog/rsyslog.git
synced 2025-12-18 07:30:42 +01:00
several bugfixes for the property replacer
- bugfix: property replacer returned invalid parameters under some (unusual) conditions. In extreme cases, this could lead to garbled logs and/or a system failure. - bugfix: invalid length returned (often) when using regular expressions inside the property replacer - bugfix: submatch regex in property replacer did not honor "return 0 on no match" config case
This commit is contained in:
parent
c34e7d2114
commit
e1584b71f3
@ -2,6 +2,13 @@
|
||||
Version 4.5.8 [v4-beta] (rgerhards), 2010-01-??
|
||||
- enhanced doc for using PostgreSQL
|
||||
Thanks to Marc Schiffbauer for the new/updated doc
|
||||
- bugfix: property replacer returned invalid parameters under some (unusual)
|
||||
conditions. In extreme cases, this could lead to garbled logs and/or
|
||||
a system failure.
|
||||
- bugfix: invalid length returned (often) when using regular expressions
|
||||
inside the property replacer
|
||||
- bugfix: submatch regex in property replacer did not honor "return 0 on
|
||||
no match" config case
|
||||
- bugfix: imuxsock incorrectly stated inputname "imudp"
|
||||
Thanks to Ryan Lynch for reporting this.
|
||||
- (slightly) enhanced support for FreeBSD by setting _PATH_MODDIR to
|
||||
|
||||
102
runtime/msg.c
102
runtime/msg.c
@ -2139,6 +2139,10 @@ static uchar *getNOW(eNOWType eNow)
|
||||
* be used in selector line processing.
|
||||
* rgerhards 2005-09-15
|
||||
*/
|
||||
/* a quick helper to save some writing: */
|
||||
#define RET_OUT_OF_MEMORY { *pbMustBeFreed = 0;\
|
||||
*pPropLen = sizeof("**OUT OF MEMORY**") - 1; \
|
||||
return(UCHAR_CONSTANT("**OUT OF MEMORY**"));}
|
||||
uchar *MsgGetProp(msg_t *pMsg, struct templateEntry *pTpe,
|
||||
propid_t propID, size_t *pPropLen,
|
||||
unsigned short *pbMustBeFreed)
|
||||
@ -2200,8 +2204,7 @@ uchar *MsgGetProp(msg_t *pMsg, struct templateEntry *pTpe,
|
||||
case PROP_PRI_TEXT:
|
||||
pBuf = malloc(20 * sizeof(uchar));
|
||||
if(pBuf == NULL) {
|
||||
*pbMustBeFreed = 0;
|
||||
return UCHAR_CONSTANT("**OUT OF MEMORY**");
|
||||
RET_OUT_OF_MEMORY;
|
||||
} else {
|
||||
*pbMustBeFreed = 1;
|
||||
pRes = (uchar*)textpri((char*)pBuf, 20, getPRIi(pMsg));
|
||||
@ -2245,49 +2248,49 @@ uchar *MsgGetProp(msg_t *pMsg, struct templateEntry *pTpe,
|
||||
break;
|
||||
case PROP_SYS_NOW:
|
||||
if((pRes = getNOW(NOW_NOW)) == NULL) {
|
||||
return UCHAR_CONSTANT("**OUT OF MEMORY**");
|
||||
RET_OUT_OF_MEMORY;
|
||||
} else
|
||||
*pbMustBeFreed = 1; /* all of these functions allocate dyn. memory */
|
||||
break;
|
||||
case PROP_SYS_YEAR:
|
||||
if((pRes = getNOW(NOW_YEAR)) == NULL) {
|
||||
return UCHAR_CONSTANT("**OUT OF MEMORY**");
|
||||
RET_OUT_OF_MEMORY;
|
||||
} else
|
||||
*pbMustBeFreed = 1; /* all of these functions allocate dyn. memory */
|
||||
break;
|
||||
case PROP_SYS_MONTH:
|
||||
if((pRes = getNOW(NOW_MONTH)) == NULL) {
|
||||
return UCHAR_CONSTANT("**OUT OF MEMORY**");
|
||||
RET_OUT_OF_MEMORY;
|
||||
} else
|
||||
*pbMustBeFreed = 1; /* all of these functions allocate dyn. memory */
|
||||
break;
|
||||
case PROP_SYS_DAY:
|
||||
if((pRes = getNOW(NOW_DAY)) == NULL) {
|
||||
return UCHAR_CONSTANT("**OUT OF MEMORY**");
|
||||
RET_OUT_OF_MEMORY;
|
||||
} else
|
||||
*pbMustBeFreed = 1; /* all of these functions allocate dyn. memory */
|
||||
break;
|
||||
case PROP_SYS_HOUR:
|
||||
if((pRes = getNOW(NOW_HOUR)) == NULL) {
|
||||
return UCHAR_CONSTANT("**OUT OF MEMORY**");
|
||||
RET_OUT_OF_MEMORY;
|
||||
} else
|
||||
*pbMustBeFreed = 1; /* all of these functions allocate dyn. memory */
|
||||
break;
|
||||
case PROP_SYS_HHOUR:
|
||||
if((pRes = getNOW(NOW_HHOUR)) == NULL) {
|
||||
return UCHAR_CONSTANT("**OUT OF MEMORY**");
|
||||
RET_OUT_OF_MEMORY;
|
||||
} else
|
||||
*pbMustBeFreed = 1; /* all of these functions allocate dyn. memory */
|
||||
break;
|
||||
case PROP_SYS_QHOUR:
|
||||
if((pRes = getNOW(NOW_QHOUR)) == NULL) {
|
||||
return UCHAR_CONSTANT("**OUT OF MEMORY**");
|
||||
RET_OUT_OF_MEMORY;
|
||||
} else
|
||||
*pbMustBeFreed = 1; /* all of these functions allocate dyn. memory */
|
||||
break;
|
||||
case PROP_SYS_MINUTE:
|
||||
if((pRes = getNOW(NOW_MINUTE)) == NULL) {
|
||||
return UCHAR_CONSTANT("**OUT OF MEMORY**");
|
||||
RET_OUT_OF_MEMORY;
|
||||
} else
|
||||
*pbMustBeFreed = 1; /* all of these functions allocate dyn. memory */
|
||||
break;
|
||||
@ -2299,6 +2302,8 @@ uchar *MsgGetProp(msg_t *pMsg, struct templateEntry *pTpe,
|
||||
* error message unreadable. rgerhards, 2007-07-10
|
||||
*/
|
||||
dbgprintf("invalid property id: '%d'\n", propID);
|
||||
*pbMustBeFreed = 0;
|
||||
*pPropLen = sizeof("**INVALID PROPERTY NAME**") - 1;
|
||||
return UCHAR_CONSTANT("**INVALID PROPERTY NAME**");
|
||||
}
|
||||
|
||||
@ -2357,8 +2362,7 @@ uchar *MsgGetProp(msg_t *pMsg, struct templateEntry *pTpe,
|
||||
if(pBuf == NULL) {
|
||||
if(*pbMustBeFreed == 1)
|
||||
free(pRes);
|
||||
*pbMustBeFreed = 0;
|
||||
return UCHAR_CONSTANT("**OUT OF MEMORY**");
|
||||
RET_OUT_OF_MEMORY;
|
||||
}
|
||||
/* now copy */
|
||||
memcpy(pBuf, pFld, iLen);
|
||||
@ -2375,6 +2379,7 @@ uchar *MsgGetProp(msg_t *pMsg, struct templateEntry *pTpe,
|
||||
if(*pbMustBeFreed == 1)
|
||||
free(pRes);
|
||||
*pbMustBeFreed = 0;
|
||||
*pPropLen = sizeof("**FIELD NOT FOUND**") - 1;
|
||||
return UCHAR_CONSTANT("**FIELD NOT FOUND**");
|
||||
}
|
||||
} else if(pTpe->data.field.iFromPos != 0 || pTpe->data.field.iToPos != 0) {
|
||||
@ -2403,8 +2408,7 @@ uchar *MsgGetProp(msg_t *pMsg, struct templateEntry *pTpe,
|
||||
if(pBuf == NULL) {
|
||||
if(*pbMustBeFreed == 1)
|
||||
free(pRes);
|
||||
*pbMustBeFreed = 0;
|
||||
return UCHAR_CONSTANT("**OUT OF MEMORY**");
|
||||
RET_OUT_OF_MEMORY;
|
||||
}
|
||||
pSb = pRes;
|
||||
if(iFrom) {
|
||||
@ -2434,9 +2438,15 @@ uchar *MsgGetProp(msg_t *pMsg, struct templateEntry *pTpe,
|
||||
} else {
|
||||
/* Check for regular expressions */
|
||||
if (pTpe->data.field.has_regex != 0) {
|
||||
if (pTpe->data.field.has_regex == 2)
|
||||
if (pTpe->data.field.has_regex == 2) {
|
||||
/* Could not compile regex before! */
|
||||
if (*pbMustBeFreed == 1) {
|
||||
free(pRes);
|
||||
*pbMustBeFreed = 0;
|
||||
}
|
||||
*pPropLen = sizeof("**NO MATCH** **BAD REGULAR EXPRESSION**") - 1;
|
||||
return UCHAR_CONSTANT("**NO MATCH** **BAD REGULAR EXPRESSION**");
|
||||
}
|
||||
|
||||
dbgprintf("string to match for regex is: %s\n", pRes);
|
||||
|
||||
@ -2476,12 +2486,16 @@ uchar *MsgGetProp(msg_t *pMsg, struct templateEntry *pTpe,
|
||||
free(pRes);
|
||||
*pbMustBeFreed = 0;
|
||||
}
|
||||
if(pTpe->data.field.nomatchAction == TPL_REGEX_NOMATCH_USE_DFLTSTR)
|
||||
return UCHAR_CONSTANT("**NO MATCH**");
|
||||
else if(pTpe->data.field.nomatchAction == TPL_REGEX_NOMATCH_USE_ZERO)
|
||||
return UCHAR_CONSTANT("0");
|
||||
else
|
||||
return UCHAR_CONSTANT("");
|
||||
if(pTpe->data.field.nomatchAction == TPL_REGEX_NOMATCH_USE_DFLTSTR) {
|
||||
bufLen = sizeof("**NO MATCH**") - 1;
|
||||
pRes = UCHAR_CONSTANT("**NO MATCH**");
|
||||
} else if(pTpe->data.field.nomatchAction == TPL_REGEX_NOMATCH_USE_ZERO) {
|
||||
bufLen = 1;
|
||||
pRes = UCHAR_CONSTANT("0");
|
||||
} else {
|
||||
bufLen = 0;
|
||||
pRes = UCHAR_CONSTANT("");
|
||||
}
|
||||
}
|
||||
} else {
|
||||
/* Match- but did it match the one we wanted? */
|
||||
@ -2492,10 +2506,16 @@ uchar *MsgGetProp(msg_t *pMsg, struct templateEntry *pTpe,
|
||||
free(pRes);
|
||||
*pbMustBeFreed = 0;
|
||||
}
|
||||
if(pTpe->data.field.nomatchAction == TPL_REGEX_NOMATCH_USE_DFLTSTR)
|
||||
return UCHAR_CONSTANT("**NO MATCH**");
|
||||
else
|
||||
return UCHAR_CONSTANT("");
|
||||
if(pTpe->data.field.nomatchAction == TPL_REGEX_NOMATCH_USE_DFLTSTR) {
|
||||
bufLen = sizeof("**NO MATCH**") - 1;
|
||||
pRes = UCHAR_CONSTANT("**NO MATCH**");
|
||||
} else if(pTpe->data.field.nomatchAction == TPL_REGEX_NOMATCH_USE_ZERO) {
|
||||
bufLen = 1;
|
||||
pRes = UCHAR_CONSTANT("0");
|
||||
} else {
|
||||
bufLen = 0;
|
||||
pRes = UCHAR_CONSTANT("");
|
||||
}
|
||||
}
|
||||
}
|
||||
/* OK, we have a usable match - we now need to malloc pB */
|
||||
@ -2509,13 +2529,12 @@ uchar *MsgGetProp(msg_t *pMsg, struct templateEntry *pTpe,
|
||||
if (pB == NULL) {
|
||||
if (*pbMustBeFreed == 1)
|
||||
free(pRes);
|
||||
*pbMustBeFreed = 0;
|
||||
return UCHAR_CONSTANT("**OUT OF MEMORY**");
|
||||
RET_OUT_OF_MEMORY;
|
||||
}
|
||||
|
||||
/* Lets copy the matched substring to the buffer */
|
||||
memcpy(pB, pRes + iOffs + pmatch[pTpe->data.field.iSubMatchToUse].rm_so, iLenBuf);
|
||||
bufLen = iLenBuf - 1;
|
||||
bufLen = iLenBuf;
|
||||
pB[iLenBuf] = '\0';/* terminate string, did not happen before */
|
||||
|
||||
if (*pbMustBeFreed == 1)
|
||||
@ -2533,6 +2552,7 @@ uchar *MsgGetProp(msg_t *pMsg, struct templateEntry *pTpe,
|
||||
free(pRes);
|
||||
*pbMustBeFreed = 0;
|
||||
}
|
||||
*pPropLen = sizeof("***REGEXP NOT AVAILABLE***") - 1;
|
||||
return UCHAR_CONSTANT("***REGEXP NOT AVAILABLE***");
|
||||
}
|
||||
}
|
||||
@ -2565,8 +2585,7 @@ uchar *MsgGetProp(msg_t *pMsg, struct templateEntry *pTpe,
|
||||
if(pB == NULL) {
|
||||
if(*pbMustBeFreed == 1)
|
||||
free(pRes);
|
||||
*pbMustBeFreed = 0;
|
||||
return UCHAR_CONSTANT("**OUT OF MEMORY**");
|
||||
RET_OUT_OF_MEMORY;
|
||||
}
|
||||
pSrc = pRes;
|
||||
while(*pSrc) {
|
||||
@ -2612,8 +2631,7 @@ uchar *MsgGetProp(msg_t *pMsg, struct templateEntry *pTpe,
|
||||
if(pDst == NULL) {
|
||||
if(*pbMustBeFreed == 1)
|
||||
free(pRes);
|
||||
*pbMustBeFreed = 0;
|
||||
return UCHAR_CONSTANT("**OUT OF MEMORY**");
|
||||
RET_OUT_OF_MEMORY;
|
||||
}
|
||||
for(pSrc = pRes; *pSrc; pSrc++) {
|
||||
if(!iscntrl((int) *pSrc))
|
||||
@ -2648,8 +2666,7 @@ uchar *MsgGetProp(msg_t *pMsg, struct templateEntry *pTpe,
|
||||
if(pDst == NULL) {
|
||||
if(*pbMustBeFreed == 1)
|
||||
free(pRes);
|
||||
*pbMustBeFreed = 0;
|
||||
return UCHAR_CONSTANT("**OUT OF MEMORY**");
|
||||
RET_OUT_OF_MEMORY;
|
||||
}
|
||||
for(pSrc = pRes; *pSrc; pSrc++) {
|
||||
if(iscntrl((int) *pSrc))
|
||||
@ -2688,8 +2705,7 @@ uchar *MsgGetProp(msg_t *pMsg, struct templateEntry *pTpe,
|
||||
if(pB == NULL) {
|
||||
if(*pbMustBeFreed == 1)
|
||||
free(pRes);
|
||||
*pbMustBeFreed = 0;
|
||||
return UCHAR_CONSTANT("**OUT OF MEMORY**");
|
||||
RET_OUT_OF_MEMORY;
|
||||
}
|
||||
while(*pRes) {
|
||||
if(iscntrl((int) *pRes)) {
|
||||
@ -2734,8 +2750,7 @@ uchar *MsgGetProp(msg_t *pMsg, struct templateEntry *pTpe,
|
||||
if(pDst == NULL) {
|
||||
if(*pbMustBeFreed == 1)
|
||||
free(pRes);
|
||||
*pbMustBeFreed = 0;
|
||||
return UCHAR_CONSTANT("**OUT OF MEMORY**");
|
||||
RET_OUT_OF_MEMORY;
|
||||
}
|
||||
for(pSrc = pRes; *pSrc; pSrc++) {
|
||||
if(*pSrc != '/')
|
||||
@ -2770,8 +2785,7 @@ uchar *MsgGetProp(msg_t *pMsg, struct templateEntry *pTpe,
|
||||
if(pDst == NULL) {
|
||||
if(*pbMustBeFreed == 1)
|
||||
free(pRes);
|
||||
*pbMustBeFreed = 0;
|
||||
return UCHAR_CONSTANT("**OUT OF MEMORY**");
|
||||
RET_OUT_OF_MEMORY;
|
||||
}
|
||||
for(pSrc = pRes; *pSrc; pSrc++) {
|
||||
if(*pSrc == '/')
|
||||
@ -2825,8 +2839,7 @@ uchar *MsgGetProp(msg_t *pMsg, struct templateEntry *pTpe,
|
||||
/* ok, original copy, need a private one */
|
||||
pB = malloc((iLn + 1) * sizeof(uchar));
|
||||
if(pB == NULL) {
|
||||
*pbMustBeFreed = 0;
|
||||
return UCHAR_CONSTANT("**OUT OF MEMORY**");
|
||||
RET_OUT_OF_MEMORY;
|
||||
}
|
||||
memcpy(pB, pRes, iLn - 1);
|
||||
pRes = pB;
|
||||
@ -2845,6 +2858,7 @@ uchar *MsgGetProp(msg_t *pMsg, struct templateEntry *pTpe,
|
||||
if(pTpe->data.field.options.bCSV) {
|
||||
/* we need to obtain a private copy, as we need to at least add the double quotes */
|
||||
int iBufLen;
|
||||
int i;
|
||||
uchar *pBStart;
|
||||
uchar *pDst;
|
||||
uchar *pSrc;
|
||||
@ -2856,10 +2870,10 @@ uchar *MsgGetProp(msg_t *pMsg, struct templateEntry *pTpe,
|
||||
if(pDst == NULL) {
|
||||
if(*pbMustBeFreed == 1)
|
||||
free(pRes);
|
||||
*pbMustBeFreed = 0;
|
||||
return UCHAR_CONSTANT("**OUT OF MEMORY**");
|
||||
RET_OUT_OF_MEMORY;
|
||||
}
|
||||
pSrc = pRes;
|
||||
i = 0;
|
||||
*pDst++ = '"'; /* starting quote */
|
||||
while(*pSrc) {
|
||||
if(*pSrc == '"')
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user