diff --git a/usr.sbin/syslogd/syslogd.c b/usr.sbin/syslogd/syslogd.c --- a/usr.sbin/syslogd/syslogd.c +++ b/usr.sbin/syslogd/syslogd.c @@ -442,8 +442,7 @@ static int skip_message(const char *, const char *, int); static int evaluate_prop_filter(const struct prop_filter *filter, const char *value); -static int prop_filter_compile(struct prop_filter *pfilter, - char *filterstr); +static struct prop_filter *prop_filter_compile(char *); static void parsemsg(const char *, char *); static void printsys(char *); static int p_open(const char *, pid_t *); @@ -2789,17 +2788,25 @@ /* * Compile property-based filter. - * Returns 0 on success, -1 otherwise. */ -static int -prop_filter_compile(struct prop_filter *pfilter, char *filter) +static struct prop_filter * +prop_filter_compile(char *filter) { + struct prop_filter *pfilter; char *filter_endpos, *p; char **ap, *argv[2] = {NULL, NULL}; int re_flags = REG_NOSUB; int escaped; - bzero(pfilter, sizeof(struct prop_filter)); + pfilter = calloc(1, sizeof(*pfilter)); + if (pfilter == NULL) { + logerror("pfilter calloc"); + exit(1); + } + if (*filter == '*') { + pfilter->prop_type = FILT_PROP_NOOP; + return (pfilter); + } /* * Here's some filter examples mentioned in syslog.conf(5) @@ -2820,7 +2827,8 @@ if (argv[0] == NULL || argv[1] == NULL) { logerror("filter parse error"); - return (-1); + free(pfilter); + return (NULL); } /* fill in prop_type */ @@ -2834,7 +2842,8 @@ pfilter->prop_type = FILT_PROP_PROGNAME; else { logerror("unknown property"); - return (-1); + free(pfilter); + return (NULL); } /* full in cmp_flags (i.e. !contains, icase_regex, etc.) */ @@ -2861,7 +2870,8 @@ re_flags |= REG_EXTENDED; } else { logerror("unknown cmp function"); - return (-1); + free(pfilter); + return (NULL); } /* @@ -2873,7 +2883,8 @@ filter += strspn(filter, ", \t\n"); if (*filter != '"' || strlen(filter) < 3) { logerror("property value parse error"); - return (-1); + free(pfilter); + return (NULL); } filter++; @@ -2905,30 +2916,32 @@ /* We should not have anything but whitespace left after closing '"' */ if (*p != '\0' && strspn(p, " \t\n") != strlen(p)) { logerror("property value parse error"); - return (-1); + free(pfilter); + return (NULL); } if (pfilter->cmp_type == FILT_CMP_REGEX) { pfilter->pflt_re = calloc(1, sizeof(*pfilter->pflt_re)); if (pfilter->pflt_re == NULL) { logerror("RE calloc() error"); + free(pfilter); free(pfilter->pflt_re); - return (-1); + return (NULL); } if (pfilter->cmp_flags & FILT_FLAG_ICASE) re_flags |= REG_ICASE; if (regcomp(pfilter->pflt_re, filter, re_flags) != 0) { logerror("RE compilation error"); + free(pfilter); free(pfilter->pflt_re); - return (-1); + return (NULL); } } else { pfilter->pflt_strval = strdup(filter); pfilter->pflt_strlen = strlen(filter); } - return (0); - + return (pfilter); } /* @@ -2990,23 +3003,15 @@ } if (pfilter) { - f->f_prop_filter = calloc(1, sizeof(*(f->f_prop_filter))); - if (f->f_prop_filter == NULL) { - logerror("pfilter calloc"); + pfilter_dup = strdup(pfilter); + if (pfilter_dup == NULL) { + logerror("strdup"); exit(1); } - if (*pfilter == '*') - f->f_prop_filter->prop_type = FILT_PROP_NOOP; - else { - pfilter_dup = strdup(pfilter); - if (pfilter_dup == NULL) { - logerror("strdup"); - exit(1); - } - if (prop_filter_compile(f->f_prop_filter, pfilter_dup)) { - logerror("filter compile error"); - exit(1); - } + f->f_prop_filter = prop_filter_compile(pfilter_dup); + if (f->f_prop_filter == NULL) { + logerror("filter compile error"); + exit(1); } }