summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRainer Gerhards <rgerhards@adiscon.com>2009-04-02 16:51:53 +0200
committerRainer Gerhards <rgerhards@adiscon.com>2009-04-02 16:51:53 +0200
commit1d16216aa326296673cc8520a8df351c4d492dfe (patch)
tree5b91d1d5d13b69e128fa13809fb32a01ad99614b
parenta86e42028afeba1daca262b590bfd49d9c393b90 (diff)
downloadrsyslog-1d16216aa326296673cc8520a8df351c4d492dfe.tar.gz
rsyslog-1d16216aa326296673cc8520a8df351c4d492dfe.tar.xz
rsyslog-1d16216aa326296673cc8520a8df351c4d492dfe.zip
streamlined regex patch
- abided to code conventions - fixed a potential segfault when regex library can not be loaded
-rw-r--r--runtime/stringbuf.c61
-rw-r--r--runtime/stringbuf.h4
-rw-r--r--tools/syslogd.c6
-rw-r--r--tools/syslogd.h2
4 files changed, 43 insertions, 30 deletions
diff --git a/runtime/stringbuf.c b/runtime/stringbuf.c
index c0a19ae4..4a7cc4bd 100644
--- a/runtime/stringbuf.c
+++ b/runtime/stringbuf.c
@@ -725,33 +725,46 @@ finalize_it:
}
/* same as above, only not braindead */
-int rsCStrSzStrMatchRegexCache(cstr_t *pCS1, uchar *psz, void **rc)
+int rsCStrSzStrMatchRegexCache(cstr_t *pCS1, uchar *psz, void *rc)
{
- int ret;
-
- BEGINfunc
-
- if(objUse(regexp, LM_REGEXP_FILENAME) == RS_RET_OK) {
- regex_t **cache = rc;
- if (*cache == NULL) {
- *cache = calloc(sizeof(regex_t), 1);
- regexp.regcomp(*cache, (char*) rsCStrGetSzStr(pCS1), 0);
- }
- ret = regexp.regexec(*cache, (char*) psz, 0, NULL, 0);
- } else {
- ret = 1; /* simulate "not found" */
- }
-
- ENDfunc
- return ret;
+ int ret;
+ regex_t **cache = (regex_t**) rc;
+
+ BEGINfunc
+
+ assert(cache != NULL);
+
+ if(objUse(regexp, LM_REGEXP_FILENAME) == RS_RET_OK) {
+ if (*cache == NULL) {
+ *cache = calloc(sizeof(regex_t), 1);
+ regexp.regcomp(*cache, (char*) rsCStrGetSzStr(pCS1), 0);
+ }
+ ret = regexp.regexec(*cache, (char*) psz, 0, NULL, 0);
+ } else {
+ ret = 1; /* simulate "not found" */
+ }
+
+ ENDfunc
+ return ret;
}
-/* free a cached compiled regex */
-void rsRegexDestruct(void **rc) {
- regex_t **cache = rc;
- regexp.regfree(*cache);
- free(*cache);
- *cache = NULL;
+
+/* free a cached compiled regex
+ * Caller must provide a pointer to a buffer that was created by
+ * rsCStrSzStrMatchRegexCache()
+ */
+void rsCStrRegexDestruct(void *rc)
+{
+ regex_t **cache = rc;
+
+ assert(cache != NULL);
+ assert(*cache != NULL);
+
+ if(objUse(regexp, LM_REGEXP_FILENAME) == RS_RET_OK) {
+ regexp.regfree(*cache);
+ free(*cache);
+ *cache = NULL;
+ }
}
diff --git a/runtime/stringbuf.h b/runtime/stringbuf.h
index 4b0fb065..311d7f41 100644
--- a/runtime/stringbuf.h
+++ b/runtime/stringbuf.h
@@ -137,8 +137,8 @@ int rsCStrStartsWithSzStr(cstr_t *pCS1, uchar *psz, size_t iLenSz);
int rsCStrCaseInsensitveStartsWithSzStr(cstr_t *pCS1, uchar *psz, size_t iLenSz);
int rsCStrSzStrStartsWithCStr(cstr_t *pCS1, uchar *psz, size_t iLenSz);
rsRetVal rsCStrSzStrMatchRegex(cstr_t *pCS1, uchar *psz, int iType);
-int rsCStrSzStrMatchRegexCache(cstr_t *pCS1, uchar *psz, void **cache);
-void rsRegexDestruct(void **rc);
+int rsCStrSzStrMatchRegexCache(cstr_t *pCS1, uchar *psz, void *cache);
+void rsCStrRegexDestruct(void *rc);
rsRetVal rsCStrConvertToNumber(cstr_t *pStr, number_t *pNumber);
rsRetVal rsCStrConvertToBool(cstr_t *pStr, number_t *pBool);
rsRetVal rsCStrAppendCStr(cstr_t *pThis, cstr_t *pstrAppend);
diff --git a/tools/syslogd.c b/tools/syslogd.c
index c7f36b45..d5429855 100644
--- a/tools/syslogd.c
+++ b/tools/syslogd.c
@@ -429,11 +429,11 @@ selectorDestruct(void *pVal)
rsCStrDestruct(&pThis->f_filterData.prop.pCSPropName);
if(pThis->f_filterData.prop.pCSCompValue != NULL)
rsCStrDestruct(&pThis->f_filterData.prop.pCSCompValue);
+ if(pThis->f_filterData.prop.regex_cache != NULL)
+ rsCStrRegexDestruct(&pThis->f_filterData.prop.regex_cache);
} else if(pThis->f_filter_type == FILTER_EXPR) {
if(pThis->f_filterData.f_expr != NULL)
expr.Destruct(&pThis->f_filterData.f_expr);
- if(pThis->regex_cache != NULL)
- rsRegexDestruct(&pThis->regex_cache);
}
llDestroy(&pThis->llActList);
@@ -1080,7 +1080,7 @@ static rsRetVal shouldProcessThisMessage(selector_t *f, msg_t *pMsg, int *bProce
//TODO REGEX: this needs to be merged with new functionality below
//rgerhards, 2009-04-02
if(rsCStrSzStrMatchRegexCache(f->f_filterData.prop.pCSCompValue,
- (unsigned char*) pszPropVal, &f->regex_cache) == 0)
+ (unsigned char*) pszPropVal, &f->f_filterData.prop.regex_cache) == 0)
bRet = 1;
break;
case FIOP_EREREGEX:
diff --git a/tools/syslogd.h b/tools/syslogd.h
index ecaaec34..8b9bd131 100644
--- a/tools/syslogd.h
+++ b/tools/syslogd.h
@@ -73,6 +73,7 @@ struct filed {
FIOP_REGEX = 4, /* matches a (BRE) regular expression? */
FIOP_EREREGEX = 5 /* matches a ERE regular expression? */
} operation;
+ regex_t *regex_cache; /* cache for compiled REs, if such are used */
cstr_t *pCSCompValue; /* value to "compare" against */
char isNegated; /* actually a boolean ;) */
} prop;
@@ -80,7 +81,6 @@ struct filed {
} f_filterData;
linkedList_t llActList; /* list of configured actions */
-regex_t *regex_cache;
};