diff options
author | Jo-Philipp Wich <jo@mein.io> | 2018-06-26 08:35:06 +0200 |
---|---|---|
committer | Jo-Philipp Wich <jo@mein.io> | 2018-06-26 12:40:07 +0200 |
commit | 796d42bceed2015bb00309a3bf0f49279b070c19 (patch) | |
tree | 7fb1af7e4a62e22009326424f4d93f085a85b462 | |
parent | 393b59ef5d1d05fd00e102231e689f646c438582 (diff) |
client: flush buffered SSL output when tearing down client ustream
When the outer SSL ustream triggers a change notification due to
encountering EOF, the inner connection ustream might still have
pending data buffered.
Previously, such a condition led to truncated files delivered by
uhttpd via HTTPS and could be triggered by requesting large resources
via slow network links.
Mitigate the problem by propagating the EOF status indicator from
the outer ustream to the inner one and by deferring the client
connection shutdown until the inner ustream output buffer has been
completely drained.
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
-rw-r--r-- | client.c | 6 |
1 files changed, 6 insertions, 0 deletions
@@ -553,6 +553,12 @@ void uh_client_notify_state(struct client *cl) if (!s->eof || s->w.data_bytes) return; + + if (cl->tls && cl->ssl.conn && cl->ssl.conn->w.data_bytes) { + cl->ssl.conn->eof = s->eof; + if (!ustream_write_pending(cl->ssl.conn)) + return; + } } return client_close(cl); |