diff options
author | Adam Chlipala <adam@chlipala.net> | 2012-05-13 17:41:21 -0400 |
---|---|---|
committer | Adam Chlipala <adam@chlipala.net> | 2012-05-13 17:41:21 -0400 |
commit | c748824e2f051bcb05eb4ece541a96d1b55714e6 (patch) | |
tree | 34ade0e433feeb518428e8bdac7ace2ffd44ce28 | |
parent | fed7038ac8d5e3dddbae85a217abab96f406e02d (diff) |
Lance Hepler's fix to configure.ac; small refactor of fastcgi.c to avoid undefined behavior
-rwxr-xr-x | configure | 1 | ||||
-rw-r--r-- | configure.ac | 3 | ||||
-rw-r--r-- | src/c/fastcgi.c | 36 |
3 files changed, 17 insertions, 23 deletions
@@ -3445,7 +3445,6 @@ $as_echo "$ac_cv_safe_to_define___extensions__" >&6; } # automake 1.12 requires this, but automake 1.11 doesn't recognize it - # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` diff --git a/configure.ac b/configure.ac index 1718b30b..5fde575f 100644 --- a/configure.ac +++ b/configure.ac @@ -3,8 +3,7 @@ WORKING_VERSION=1 AC_USE_SYSTEM_EXTENSIONS # automake 1.12 requires this, but automake 1.11 doesn't recognize it -m4_pattern_allow([AM_PROG_AR]) -AM_PROG_AR +m4_ifdef([AM_PROG_AR], [AM_PROG_AR]) AM_INIT_AUTOMAKE([-Wall -Werror foreign no-define]) AC_PROG_CC() diff --git a/src/c/fastcgi.c b/src/c/fastcgi.c index 34042262..5677af83 100644 --- a/src/c/fastcgi.c +++ b/src/c/fastcgi.c @@ -40,7 +40,7 @@ typedef struct { } FCGI_Output; typedef struct { - char buf[sizeof(FCGI_Record) + 255]; + FCGI_Record r; int available, used, sock; } FCGI_Input; @@ -76,32 +76,28 @@ static int fastcgi_send(FCGI_Output *o, return uw_really_send(o->sock, &o->r, sizeof(o->r) - 65535 + contentLength); } -#define LATEST(i) ((FCGI_Record *)(i->buf + i->used)) - static FCGI_Record *fastcgi_recv(FCGI_Input *i) { + if (i->used > 0) { + memmove((void*)&i->r, (void*)&i->r + i->used, i->available - i->used); + i->available -= i->used; + i->used = 0; + } + while (1) { ssize_t n; - if (i->available >= i->used + sizeof(FCGI_Record) - 65535 - && i->available >= i->used + sizeof(FCGI_Record) - 65535 - + ((LATEST(i)->contentLengthB1 << 8) | LATEST(i)->contentLengthB0) - + LATEST(i)->paddingLength) { - FCGI_Record *r = LATEST(i); - - i->used += sizeof(FCGI_Record) - 65535 - + ((LATEST(i)->contentLengthB1 << 8) | LATEST(i)->contentLengthB0) - + LATEST(i)->paddingLength; + if (i->available >= sizeof(FCGI_Record) - 65535 + && i->available >= sizeof(FCGI_Record) - 65535 + + ((i->r.contentLengthB1 << 8) | i->r.contentLengthB0) + + i->r.paddingLength) { + i->used = sizeof(FCGI_Record) - 65535 + + ((i->r.contentLengthB1 << 8) | i->r.contentLengthB0) + + i->r.paddingLength; - return r; - } - - if (i->used > 0) { - memmove(i->buf, i->buf + i->used, i->available - i->used); - i->available -= i->used; - i->used = 0; + return &i->r; } - n = recv(i->sock, i->buf + i->available, sizeof(i->buf) - i->available, 0); + n = recv(i->sock, (void*)&i->r + i->available, sizeof(i->r) - i->available, 0); if (n <= 0) return NULL; |