Changeset 32662


Ignore:
Timestamp:
2012-07-11T11:59:05+02:00 (6 years ago)
Author:
jow
Message:

[package] uhttpd: retry parsing the CGI header until the buffer space is exhausted

Location:
trunk/package/uhttpd
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/package/uhttpd/Makefile

    r32651 r32662  
    99 
    1010PKG_NAME:=uhttpd 
    11 PKG_RELEASE:=38 
     11PKG_RELEASE:=39 
    1212 
    1313PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) 
  • trunk/package/uhttpd/src/uhttpd-cgi.c

    r32651 r32662  
    134134static bool uh_cgi_socket_cb(struct client *cl) 
    135135{ 
    136         int i, len, hdroff; 
     136        int i, len, blen, hdroff; 
    137137        char buf[UH_LIMIT_MSGHEAD]; 
    138138 
     
    185185 
    186186        /* try to read data from child */ 
    187         while ((len = uh_raw_recv(cl->rpipe.fd, buf, sizeof(buf), -1)) > 0) 
     187        while ((len = uh_raw_recv(cl->rpipe.fd, buf, state->header_sent 
     188                                  ? sizeof(buf) : state->httpbuf.len, -1)) > 0) 
    188189        { 
    189190                /* we have not pushed out headers yet, parse input */ 
     
    191192                { 
    192193                        /* try to parse header ... */ 
    193                         memcpy(state->httpbuf, buf, len); 
    194  
    195                         if (uh_cgi_header_parse(res, state->httpbuf, len, &hdroff)) 
     194                        memcpy(state->httpbuf.ptr, buf, len); 
     195                        state->httpbuf.len -= len; 
     196                        state->httpbuf.ptr += len; 
     197 
     198                        blen = state->httpbuf.ptr - state->httpbuf.buf; 
     199 
     200                        if (uh_cgi_header_parse(res, state->httpbuf.buf, blen, &hdroff)) 
    196201                        { 
    197202                                /* write status */ 
     
    230235 
    231236                                /* push out remaining head buffer */ 
    232                                 if (hdroff < len) 
     237                                if (hdroff < blen) 
    233238                                { 
    234239                                        D("CGI: Child(%d) relaying %d rest bytes\n", 
    235                                           cl->proc.pid, len - hdroff); 
     240                                          cl->proc.pid, blen - hdroff); 
    236241 
    237242                                        ensure_out(uh_http_send(cl, req, 
    238                                                                                         &buf[hdroff], len - hdroff)); 
     243                                                                state->httpbuf.buf + hdroff, 
     244                                                                blen - hdroff)); 
    239245                                } 
    240246                        } 
    241247 
    242248                        /* ... failed and head buffer exceeded */ 
    243                         else 
     249                        else if (!state->httpbuf.len) 
    244250                        { 
    245251                                /* I would do this ... 
     
    537543                D("CGI: Child(%d) created: rfd(%d) wfd(%d)\n", child, rfd[0], wfd[1]); 
    538544 
     545                state->httpbuf.ptr = state->httpbuf.buf; 
     546                state->httpbuf.len = sizeof(state->httpbuf.buf); 
     547 
    539548                state->content_length = cl->httpbuf.len; 
    540549 
  • trunk/package/uhttpd/src/uhttpd-cgi.h

    r32651 r32662  
    2929 
    3030struct uh_cgi_state { 
    31         char httpbuf[UH_LIMIT_MSGHEAD]; 
     31        struct { 
     32                char buf[UH_LIMIT_MSGHEAD]; 
     33                char *ptr; 
     34                int len; 
     35        } httpbuf; 
    3236        int content_length; 
    3337        bool header_sent; 
  • trunk/package/uhttpd/src/uhttpd-lua.h

    r32651 r32662  
    3434 
    3535struct uh_lua_state { 
    36         char httpbuf[UH_LIMIT_MSGHEAD]; 
    3736        int content_length; 
    3837        bool data_sent; 
Note: See TracChangeset for help on using the changeset viewer.