Skip to content

Commit

Permalink
[package] uhttpd: retry parsing the CGI header until the buffer space…
Browse files Browse the repository at this point in the history
… is exhausted

git-svn-id: svn://svn.openwrt.org/openwrt/trunk@32662 3c298f89-4303-0410-b956-a3cf2f4a3e73
  • Loading branch information
jow committed Jul 11, 2012
1 parent 52d62d0 commit 696a47b
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 11 deletions.
2 changes: 1 addition & 1 deletion package/uhttpd/Makefile
Expand Up @@ -8,7 +8,7 @@
include $(TOPDIR)/rules.mk

PKG_NAME:=uhttpd
PKG_RELEASE:=38
PKG_RELEASE:=39

PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
PKG_CONFIG_DEPENDS := \
Expand Down
25 changes: 17 additions & 8 deletions package/uhttpd/src/uhttpd-cgi.c
Expand Up @@ -133,7 +133,7 @@ static void uh_cgi_shutdown(struct uh_cgi_state *state)

static bool uh_cgi_socket_cb(struct client *cl)
{
int i, len, hdroff;
int i, len, blen, hdroff;
char buf[UH_LIMIT_MSGHEAD];

struct uh_cgi_state *state = (struct uh_cgi_state *)cl->priv;
Expand Down Expand Up @@ -184,15 +184,20 @@ static bool uh_cgi_socket_cb(struct client *cl)
}

/* try to read data from child */
while ((len = uh_raw_recv(cl->rpipe.fd, buf, sizeof(buf), -1)) > 0)
while ((len = uh_raw_recv(cl->rpipe.fd, buf, state->header_sent
? sizeof(buf) : state->httpbuf.len, -1)) > 0)
{
/* we have not pushed out headers yet, parse input */
if (!state->header_sent)
{
/* try to parse header ... */
memcpy(state->httpbuf, buf, len);
memcpy(state->httpbuf.ptr, buf, len);
state->httpbuf.len -= len;
state->httpbuf.ptr += len;

if (uh_cgi_header_parse(res, state->httpbuf, len, &hdroff))
blen = state->httpbuf.ptr - state->httpbuf.buf;

if (uh_cgi_header_parse(res, state->httpbuf.buf, blen, &hdroff))
{
/* write status */
ensure_out(uh_http_sendf(cl, NULL,
Expand Down Expand Up @@ -229,18 +234,19 @@ static bool uh_cgi_socket_cb(struct client *cl)
state->header_sent = true;

/* push out remaining head buffer */
if (hdroff < len)
if (hdroff < blen)
{
D("CGI: Child(%d) relaying %d rest bytes\n",
cl->proc.pid, len - hdroff);
cl->proc.pid, blen - hdroff);

ensure_out(uh_http_send(cl, req,
&buf[hdroff], len - hdroff));
state->httpbuf.buf + hdroff,
blen - hdroff));
}
}

/* ... failed and head buffer exceeded */
else
else if (!state->httpbuf.len)
{
/* I would do this ...
*
Expand Down Expand Up @@ -536,6 +542,9 @@ bool uh_cgi_request(struct client *cl, struct path_info *pi,

D("CGI: Child(%d) created: rfd(%d) wfd(%d)\n", child, rfd[0], wfd[1]);

state->httpbuf.ptr = state->httpbuf.buf;
state->httpbuf.len = sizeof(state->httpbuf.buf);

state->content_length = cl->httpbuf.len;

/* find content length */
Expand Down
6 changes: 5 additions & 1 deletion package/uhttpd/src/uhttpd-cgi.h
Expand Up @@ -28,7 +28,11 @@


struct uh_cgi_state {
char httpbuf[UH_LIMIT_MSGHEAD];
struct {
char buf[UH_LIMIT_MSGHEAD];
char *ptr;
int len;
} httpbuf;
int content_length;
bool header_sent;
};
Expand Down
1 change: 0 additions & 1 deletion package/uhttpd/src/uhttpd-lua.h
Expand Up @@ -33,7 +33,6 @@


struct uh_lua_state {
char httpbuf[UH_LIMIT_MSGHEAD];
int content_length;
bool data_sent;
};
Expand Down

0 comments on commit 696a47b

Please sign in to comment.