about summary refs log tree commit diff homepage
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2019-01-06 19:40:04 -0500
committerJune McEnroe <june@causal.agency>2019-01-06 19:40:04 -0500
commitbb13065c4542f9329e2be2c6c6a977e573d4cc0a (patch)
treeee6fe7b9d4e54b8c1e3ee07831e28bd6a4a96828
parentHandle KCGI_HUP (diff)
downloadtorus-bb13065c4542f9329e2be2c6c6a977e573d4cc0a.tar.gz
torus-bb13065c4542f9329e2be2c6c6a977e573d4cc0a.zip
Swallow writes after the connection is closed
It was not okay.
-rw-r--r--image.c20
1 files changed, 15 insertions, 5 deletions
diff --git a/image.c b/image.c
index 9ef6b22..1cc298f 100644
--- a/image.c
+++ b/image.c
@@ -174,11 +174,20 @@ static noreturn void errkcgi(int eval, enum kcgi_err code, const char *str) {
 	errx(eval, "%s: %s", str, kcgi_strerror(code));
 }
 
+struct Stream {
+	struct kreq *req;
+	bool hup;
+};
+
+// XXX: Swallow writes after the connection is closed.
 static int streamWrite(void *cookie, const char *buf, int len) {
-	struct kreq *req = cookie;
-	enum kcgi_err error = khttp_write(req, buf, (size_t)len);
-	if (error == KCGI_HUP) return -1;
-	if (error) errkcgi(EX_IOERR, error, "khttp_write");
+	struct Stream *stream = cookie;
+	if (stream->hup) return len;
+	enum kcgi_err error = khttp_write(stream->req, buf, (size_t)len);
+	if (error) {
+		if (error != KCGI_HUP) errkcgi(EX_IOERR, error, "khttp_write");
+		stream->hup = true;
+	}
 	return len;
 }
 
@@ -219,7 +228,8 @@ static void worker(void) {
 		if (error == KCGI_HUP) goto next;
 		if (error) errkcgi(EX_IOERR, error, "khttp_body");
 
-		FILE *stream = fwopen(&req, streamWrite);
+		struct Stream cookie = { .req = &req };
+		FILE *stream = fwopen(&cookie, streamWrite);
 		if (!stream) err(EX_OSERR, "fwopen");
 
 		render(stream, tileX, tileY);