Imposed some limits on request parts.
[ashd.git] / lib / req.c
index 2f975c9..da8e3f0 100644 (file)
--- a/lib/req.c
+++ b/lib/req.c
@@ -23,6 +23,7 @@
 #include <errno.h>
 #include <ctype.h>
 #include <stdio.h>
+#include <fcntl.h>
 
 #ifdef HAVE_CONFIG_H
 #include <config.h>
@@ -95,23 +96,26 @@ static void trim(struct charbuf *buf)
 {
     char *p;
     
-    if(buf->d > 0) {
-       for(p = buf->b; (p - buf->b < buf->d) && isspace(*p); p++);
-       memmove(buf->b, p, buf->d -= (p - buf->b));
+    for(p = buf->b; (p - buf->b < buf->d) && isspace(*p); p++);
+    memmove(buf->b, p, buf->d -= (p - buf->b));
+    if(buf->d > 0)
        for(p = buf->b + buf->d - 1; (p > buf->b) && isspace(*p); p--, buf->d--);
-    }
 }
 
 int parseheaders(struct hthead *head, FILE *in)
 {
     int c, state;
     struct charbuf name, val;
+    size_t tsz;
     
     bufinit(name);
     bufinit(val);
     state = 0;
+    tsz = 0;
     while(1) {
        c = fgetc(in);
+       if(++tsz >= 65536)
+           goto fail;
     again:
        if(state == 0) {
            if(c == '\r') {
@@ -192,6 +196,21 @@ void headappheader(struct hthead *head, const char *name, const char *val)
     head->headers[i][1] = sstrdup(val);
 }
 
+void headrmheader(struct hthead *head, const char *name)
+{
+    int i;
+    
+    for(i = 0; i < head->noheaders; i++) {
+       if(!strcasecmp(head->headers[i][0], name)) {
+           free(head->headers[i][0]);
+           free(head->headers[i][1]);
+           free(head->headers[i]);
+           memmove(head->headers + i, head->headers + i + 1, sizeof(head->headers) * (--head->noheaders - i));
+           return;
+       }
+    }
+}
+
 int writeresp(FILE *out, struct hthead *resp)
 {
     int i;
@@ -240,6 +259,7 @@ int recvreq(int sock, struct hthead **reqp)
     if((fd = recvfd(sock, &buf.b, &buf.d)) < 0) {
        return(-1);
     }
+    fcntl(fd, F_SETFD, FD_CLOEXEC);
     buf.s = buf.d;
     p = buf.b;
     l = buf.d;