From f7cdd22f9a9dfed4972f77ae50f5ac67eb7845c8 Mon Sep 17 00:00:00 2001 From: Roberto De Ioris Date: Thu, 20 Nov 2014 07:25:19 +0100 Subject: [PATCH] attempt to fix error propagation in https --- plugins/http/https.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/plugins/http/https.c b/plugins/http/https.c index 3d7340d2..e716299c 100644 --- a/plugins/http/https.c +++ b/plugins/http/https.c @@ -10,6 +10,12 @@ extern struct uwsgi_http uhttp; +// taken from nginx +static void hr_ssl_clear_errors() { + while (ERR_peek_error()) {} + ERR_clear_error(); +} + void uwsgi_opt_https(char *opt, char *value, void *cr) { struct uwsgi_corerouter *ucr = (struct uwsgi_corerouter *) cr; char *client_ca = NULL; @@ -234,7 +240,7 @@ void hr_session_ssl_close(struct corerouter_session *cs) { #endif // clear the errors (otherwise they could be propagated) - ERR_clear_error(); + hr_ssl_clear_errors(); SSL_free(hr->ssl); } @@ -270,6 +276,8 @@ ssize_t hr_ssl_write(struct corerouter_peer *main_peer) { struct corerouter_session *cs = main_peer->session; struct http_session *hr = (struct http_session *) cs; + hr_ssl_clear_errors(); + int ret = SSL_write(hr->ssl, main_peer->out->buf + main_peer->out_pos, main_peer->out->pos - main_peer->out_pos); if (ret > 0) { main_peer->out_pos += ret; @@ -324,6 +332,8 @@ ssize_t hr_ssl_read(struct corerouter_peer *main_peer) { struct corerouter_session *cs = main_peer->session; struct http_session *hr = (struct http_session *) cs; + hr_ssl_clear_errors(); + // try to always leave 4k available if (uwsgi_buffer_ensure(main_peer->in, uwsgi.page_size)) return -1; int ret = SSL_read(hr->ssl, main_peer->in->buf + main_peer->in->pos, main_peer->in->len - main_peer->in->pos); @@ -385,6 +395,8 @@ ssize_t hr_ssl_shutdown(struct corerouter_peer *peer) { struct corerouter_session *cs = peer->session; struct http_session *hr = (struct http_session *) cs; + hr_ssl_clear_errors(); + int ret = SSL_shutdown(hr->ssl); int err = 0;