X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=common-src%2Fmatch.c;h=d8c83bcc7657ec16014ade4c0f35587bc4e20826;hb=2627875b7d18858bc1f9f7652811e4d8c15a23eb;hp=dba15c802c28add576135af2f4a85476a2ccfd57;hpb=d3b2175e084f88c8736ad7073eacbf4670147aec;p=debian%2Famanda diff --git a/common-src/match.c b/common-src/match.c index dba15c8..d8c83bc 100644 --- a/common-src/match.c +++ b/common-src/match.c @@ -83,14 +83,42 @@ match( if((result = regcomp(®c, regex, REG_EXTENDED|REG_NOSUB|REG_NEWLINE)) != 0) { regerror(result, ®c, errmsg, SIZEOF(errmsg)); - error("regex \"%s\": %s", regex, errmsg); + error(_("regex \"%s\": %s"), regex, errmsg); /*NOTREACHED*/ } if((result = regexec(®c, str, 0, 0, 0)) != 0 && result != REG_NOMATCH) { regerror(result, ®c, errmsg, SIZEOF(errmsg)); - error("regex \"%s\": %s", regex, errmsg); + error(_("regex \"%s\": %s"), regex, errmsg); + /*NOTREACHED*/ + } + + regfree(®c); + + return result == 0; +} + +int +match_no_newline( + const char * regex, + const char * str) +{ + regex_t regc; + int result; + char errmsg[STR_SIZE]; + + if((result = regcomp(®c, regex, + REG_EXTENDED|REG_NOSUB)) != 0) { + regerror(result, ®c, errmsg, SIZEOF(errmsg)); + error(_("regex \"%s\": %s"), regex, errmsg); + /*NOTREACHED*/ + } + + if((result = regexec(®c, str, 0, 0, 0)) != 0 + && result != REG_NOMATCH) { + regerror(result, ®c, errmsg, SIZEOF(errmsg)); + error(_("regex \"%s\": %s"), regex, errmsg); /*NOTREACHED*/ } @@ -136,14 +164,14 @@ match_glob( if((result = regcomp(®c, regex, REG_EXTENDED|REG_NOSUB|REG_NEWLINE)) != 0) { regerror(result, ®c, errmsg, SIZEOF(errmsg)); - error("glob \"%s\" -> regex \"%s\": %s", glob, regex, errmsg); + error(_("glob \"%s\" -> regex \"%s\": %s"), glob, regex, errmsg); /*NOTREACHED*/ } if((result = regexec(®c, str, 0, 0, 0)) != 0 && result != REG_NOMATCH) { regerror(result, ®c, errmsg, SIZEOF(errmsg)); - error("glob \"%s\" -> regex \"%s\": %s", glob, regex, errmsg); + error(_("glob \"%s\" -> regex \"%s\": %s"), glob, regex, errmsg); /*NOTREACHED*/ } @@ -244,14 +272,14 @@ match_tar( if((result = regcomp(®c, regex, REG_EXTENDED|REG_NOSUB|REG_NEWLINE)) != 0) { regerror(result, ®c, errmsg, SIZEOF(errmsg)); - error("glob \"%s\" -> regex \"%s\": %s", glob, regex, errmsg); + error(_("glob \"%s\" -> regex \"%s\": %s"), glob, regex, errmsg); /*NOTREACHED*/ } if((result = regexec(®c, str, 0, 0, 0)) != 0 && result != REG_NOMATCH) { regerror(result, ®c, errmsg, SIZEOF(errmsg)); - error("glob \"%s\" -> regex \"%s\": %s", glob, regex, errmsg); + error(_("glob \"%s\" -> regex \"%s\": %s"), glob, regex, errmsg); /*NOTREACHED*/ } @@ -530,6 +558,17 @@ match_disk( return match_word(glob, disk, '/'); } +static int +alldigits( + const char *str) +{ + while (*str) { + if (!isdigit((int)*(str++))) + return 0; + } + return 1; +} + int match_datestamp( const char * dateexp, @@ -543,45 +582,56 @@ match_datestamp( int match_exact; if(strlen(dateexp) >= 100 || strlen(dateexp) < 1) { - error("Illegal datestamp expression %s",dateexp); - /*NOTREACHED*/ + goto illegal; } + /* strip and ignore an initial "^" */ if(dateexp[0] == '^') { - strncpy(mydateexp, dateexp+1, strlen(dateexp)-1); - mydateexp[strlen(dateexp)-1] = '\0'; + strncpy(mydateexp, dateexp+1, sizeof(mydateexp)-1); + mydateexp[sizeof(mydateexp)-1] = '\0'; } else { - strncpy(mydateexp, dateexp, strlen(dateexp)); - mydateexp[strlen(dateexp)] = '\0'; + strncpy(mydateexp, dateexp, sizeof(mydateexp)-1); + mydateexp[sizeof(mydateexp)-1] = '\0'; } - if(mydateexp[strlen(mydateexp)] == '$') { + if(mydateexp[strlen(mydateexp)-1] == '$') { match_exact = 1; - mydateexp[strlen(mydateexp)] = '\0'; + mydateexp[strlen(mydateexp)-1] = '\0'; /* strip the trailing $ */ } else match_exact = 0; + /* a single dash represents a date range */ if((dash = strchr(mydateexp,'-'))) { - if(match_exact == 1) { - error("Illegal datestamp expression %s",dateexp); - /*NOTREACHED*/ + if(match_exact == 1 || strchr(dash+1, '-')) { + goto illegal; } - len = (size_t)(dash - mydateexp); - len_suffix = strlen(dash) - 1; - len_prefix = len - len_suffix; + + /* format: XXXYYYY-ZZZZ, indicating dates XXXYYYY to XXXZZZZ */ + + len = (size_t)(dash - mydateexp); /* length of XXXYYYY */ + len_suffix = strlen(dash) - 1; /* length of ZZZZ */ + if (len_suffix > len) goto illegal; + len_prefix = len - len_suffix; /* length of XXX */ dash++; + strncpy(firstdate, mydateexp, len); firstdate[len] = '\0'; strncpy(lastdate, mydateexp, len_prefix); strncpy(&(lastdate[len_prefix]), dash, len_suffix); lastdate[len] = '\0'; + if (!alldigits(firstdate) || !alldigits(lastdate)) + goto illegal; + if (strncmp(firstdate, lastdate, strlen(firstdate)) > 0) + goto illegal; return ((strncmp(datestamp, firstdate, strlen(firstdate)) >= 0) && (strncmp(datestamp, lastdate , strlen(lastdate)) <= 0)); } else { + if (!alldigits(mydateexp)) + goto illegal; if(match_exact == 1) { return (strcmp(datestamp, mydateexp) == 0); } @@ -589,6 +639,9 @@ match_datestamp( return (strncmp(datestamp, mydateexp, strlen(mydateexp)) == 0); } } +illegal: + error(_("Illegal datestamp expression %s"),dateexp); + /*NOTREACHED*/ } @@ -605,7 +658,7 @@ match_level( int match_exact; if(strlen(levelexp) >= 100 || strlen(levelexp) < 1) { - error("Illegal level expression %s",levelexp); + error(_("Illegal level expression %s"),levelexp); /*NOTREACHED*/ } @@ -627,7 +680,7 @@ match_level( if((dash = strchr(mylevelexp,'-'))) { if(match_exact == 1) { - error("Illegal level expression %s",levelexp); + error(_("Illegal level expression %s"),levelexp); /*NOTREACHED*/ } len = (size_t)(dash - mylevelexp);