From 9c965a80d8e1de0f098bde30c17f01580292ae2e Mon Sep 17 00:00:00 2001 From: Fabian Keil Date: Thu, 10 Apr 2008 04:24:24 +0000 Subject: [PATCH] Stop duplicating the plain text representation of the path regex (and keeping the copy around). Once the regex is compiled it's no longer useful. --- urlmatch.c | 71 +++++++++++++++++++++++------------------------------- 1 file changed, 30 insertions(+), 41 deletions(-) diff --git a/urlmatch.c b/urlmatch.c index 257ee969..a5fbcf50 100644 --- a/urlmatch.c +++ b/urlmatch.c @@ -1,4 +1,4 @@ -const char urlmatch_rcs[] = "$Id: urlmatch.c,v 1.28 2008/04/08 16:07:39 fabiankeil Exp $"; +const char urlmatch_rcs[] = "$Id: urlmatch.c,v 1.29 2008/04/10 04:17:56 fabiankeil Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/urlmatch.c,v $ @@ -33,6 +33,12 @@ const char urlmatch_rcs[] = "$Id: urlmatch.c,v 1.28 2008/04/08 16:07:39 fabianke * * Revisions : * $Log: urlmatch.c,v $ + * Revision 1.29 2008/04/10 04:17:56 fabiankeil + * In url_match(), check the right member for NULL when determining + * whether there's a path regex to execute. Looking for a plain-text + * representation works as well, but it looks "interesting" and that + * member will be removed soonish anyway. + * * Revision 1.28 2008/04/08 16:07:39 fabiankeil * Make it harder to mistake url_match()'s * second parameter for an url_spec. @@ -994,57 +1000,40 @@ jb_err create_url_spec(struct url_spec * url, const char * buf) p = strchr(buf, '/'); if (NULL != p) { + /* + * Only compile the regex if it consists of more than + * a single slash, otherwise it wouldn't affect the result. + */ if (*(p+1) != '\0') { - url->path = strdup(p); - if (NULL == url->path) + /* XXX: mostly duplicated code, should be factored out. */ + url->preg = zalloc(sizeof(*url->preg)); + if (NULL == url->preg) { free_url_spec(url); return JB_ERR_MEMORY; } - } - else - { - /* - * The path pattern is a single slash and can - * be ignored as it won't affect the result. - */ - assert(NULL == url->path); - url->path = NULL; - } - *p = '\0'; - } - else - { - url->path = NULL; - } - if (url->path) - { - if (NULL == (url->preg = zalloc(sizeof(*url->preg)))) - { - free_url_spec(url); - return JB_ERR_MEMORY; - } - - snprintf(rebuf, sizeof(rebuf), "^(%s)", url->path); - errcode = regcomp(url->preg, rebuf, + snprintf(rebuf, sizeof(rebuf), "^(%s)", p); + errcode = regcomp(url->preg, rebuf, (REG_EXTENDED|REG_NOSUB|REG_ICASE)); - if (errcode) - { - errlen = regerror(errcode, url->preg, rebuf, sizeof(rebuf)); - - if (errlen > (sizeof(rebuf) - (size_t)1)) + if (errcode) { - errlen = sizeof(rebuf) - (size_t)1; - } - rebuf[errlen] = '\0'; - log_error(LOG_LEVEL_ERROR, "error compiling %s: %s", - url->spec, rebuf); - free_url_spec(url); + errlen = regerror(errcode, url->preg, rebuf, sizeof(rebuf)); + + if (errlen > (sizeof(rebuf) - (size_t)1)) + { + errlen = sizeof(rebuf) - (size_t)1; + } + rebuf[errlen] = '\0'; + log_error(LOG_LEVEL_ERROR, "error compiling %s: %s", + url->spec, rebuf); + free_url_spec(url); - return JB_ERR_PARSE; + return JB_ERR_PARSE; + } } + *p = '\0'; } p = strchr(buf, ':'); -- 2.39.2