patplex: Fixed segfault bug in pattern replacement.
[ashd.git] / src / patplex.c
index 23fcf4e..9939543 100644 (file)
@@ -189,6 +189,7 @@ static struct pattern *parsepattern(struct cfstate *s)
                flog(LOG_WARNING, "%s:%i: missing pattern for `%s' match", s->file, s->lno, s->argv[0]);
                continue;
            }
+           rxfl = 0;
            if(s->argc >= 3) {
                if(strchr(s->argv[2], 'i'))
                    rxfl |= REG_ICASE;
@@ -216,6 +217,7 @@ static struct pattern *parsepattern(struct cfstate *s)
                flog(LOG_WARNING, "%s:%i: missing header name or pattern for `header' match", s->file, s->lno);
                continue;
            }
+           rxfl = 0;
            if(s->argc >= 4) {
                if(strchr(s->argv[3], 'i'))
                    rxfl |= REG_ICASE;
@@ -381,12 +383,14 @@ static void qoffsets(char *buf, int *obuf, char *pstr, int unquote)
            o++;
        }
        buf[o] = 0;
+       obuf[o] = i;
     } else {
        for(i = 0; pstr[i]; i++) {
            buf[i] = pstr[i];
            obuf[i] = i;
        }
        buf[i] = 0;
+       obuf[i] = i;
     }
 }
 
@@ -470,6 +474,14 @@ static struct pattern *findmatch(struct config *cf, struct hthead *req, int tryd
     return(NULL);
 }
 
+static void childerror(struct hthead *req, int fd)
+{
+    if(errno == EAGAIN)
+       simpleerror(fd, 500, "Server Error", "The request handler is overloaded.");
+    else
+       simpleerror(fd, 500, "Server Error", "The request handler crashed.");
+}
+
 static void serve(struct hthead *req, int fd)
 {
     struct pattern *pat;
@@ -509,7 +521,7 @@ static void serve(struct hthead *req, int fd)
        headappheader(req, head->name, head->value);
     }
     if(childhandle(ch, req, fd, NULL, NULL))
-       simpleerror(fd, 500, "Server Error", "The request handler crashed.");
+       childerror(req, fd);
 }
 
 static void reloadconf(char *nm)