diff -ruN fnord-1.10-20091213fwb/buffer.h fnord-1.10-20100519fwb/buffer.h --- fnord-1.10-20091213fwb/buffer.h 2002-11-26 02:13:43.000000000 +0100 +++ fnord-1.10-20100519fwb/buffer.h 2010-05-19 11:19:46.000000000 +0200 @@ -12,8 +12,8 @@ #define BUFFER_INIT(op,fd,buf,len) { (buf), 0, 0, (len), (fd), (op) } #define BUFFER_INIT_READ(op,fd,buf,len) BUFFER_INIT(op,fd,buf,len) /*obsolete*/ -#define BUFFER_INSIZE 8192 -#define BUFFER_OUTSIZE 8192 +#define BUFFER_INSIZE 65536 +#define BUFFER_OUTSIZE 65536 extern void buffer_init(buffer* b,int (*op)(),int fd,char* y,unsigned int ylen); diff -ruN fnord-1.10-20091213fwb/httpd.c fnord-1.10-20100519fwb/httpd.c --- fnord-1.10-20091213fwb/httpd.c 2009-12-13 23:38:02.000000000 +0100 +++ fnord-1.10-20100519fwb/httpd.c 2010-05-19 13:05:18.000000000 +0200 @@ -592,6 +592,7 @@ while(poll(pfd,nr,-1)!=-1) { /* read from cgi */ if (pfd[0].revents&POLLIN) { + pollin_read: if (!(n=read(fd[0],ibuf,sizeof(ibuf)))) break; if (n<0) goto cgi_500; /* startup */ @@ -624,7 +625,8 @@ buffer_put(buffer_1,ibuf,n); } size+=n; - if (pfd[0].revents&POLLHUP) break; + /* bad: there may be data left to read even if POLLHUP is set */ + if ((pfd[0].revents&POLLHUP) && (n == sizeof(ibuf))) goto pollin_read; } /* write to cgi the post data */ else if (nr>1 && pfd[1].revents&POLLOUT) {