From c836cdfadb29dde5f7afee662a27e9d691bb9ba0 Mon Sep 17 00:00:00 2001 From: Omar Polo Date: Mon, 29 Mar 2021 09:42:06 +0000 Subject: [PATCH] handle CGI scripts that replies with the maximum header length allowed the 1024 bytes limits is for the META only, not for the whole response. That means that the maximum size for the header line is 1029! --- ChangeLog | 4 ++++ gmid.h | 5 ++++- regress/Makefile | 1 + regress/max-length-reply | 3 +++ regress/runtime | 3 +++ 5 files changed, 15 insertions(+), 1 deletion(-) create mode 100755 regress/max-length-reply diff --git a/ChangeLog b/ChangeLog index 43300e2..3e8e2c6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2021-03-27 Omar Polo + + * gmid.h (struct client): correctly handle CGI scripts that replies with the maximum header length allowed + 2021-03-20 Omar Polo * 1.6 tagged diff --git a/gmid.h b/gmid.h index 7e9bba0..8188bf9 100644 --- a/gmid.h +++ b/gmid.h @@ -180,8 +180,11 @@ struct client { const char *meta; int fd, pfd; DIR *dir; - char sbuf[1024]; + + /* big enough to store STATUS + SPACE + META + CRLF */ + char sbuf[1029]; ssize_t len, off; + struct sockaddr_storage addr; struct vhost *host; /* host they're talking to */ }; diff --git a/regress/Makefile b/regress/Makefile index 317a460..b485d64 100644 --- a/regress/Makefile +++ b/regress/Makefile @@ -68,6 +68,7 @@ testdata: fill-file printf "# hello world\n" > testdata/index.gmi ./sha testdata/index.gmi testdata/index.gmi.sha cp hello slow err invalid serve-bigfile env testdata/ + cp max-length-reply testdata mkdir testdata/dir cp hello testdata/dir cp testdata/index.gmi testdata/dir/foo.gmi diff --git a/regress/max-length-reply b/regress/max-length-reply new file mode 100755 index 0000000..0311158 --- /dev/null +++ b/regress/max-length-reply @@ -0,0 +1,3 @@ +#!/bin/sh + +printf '20 iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii\r\n' diff --git a/regress/runtime b/regress/runtime index 80bf32c..d24ac08 100755 --- a/regress/runtime +++ b/regress/runtime @@ -183,6 +183,9 @@ echo OK GET /err with cgi eq "$(raw /invalid | wc -c | xargs)" 2048 "Unexpected body for /invalid" echo OK GET /invalid with cgi +eq "$(raw /max-length-reply | wc -c | xargs)" 1029 "Unexpected header for /max-length-reply" +echo OK GET /max-length-reply with cgi + # try a big file eq "$(head /serve-bigfile)" "20 application/octet-stream" "Unexpected head for /serve-bigfile" get /bigfile > bigfile