diff options
author | Alan Antonuk <alan.antonuk@gmail.com> | 2015-10-20 23:44:00 -0700 |
---|---|---|
committer | Alan Antonuk <alan.antonuk@gmail.com> | 2015-10-22 20:30:17 -0700 |
commit | 26a53d29bd32809e07687ef6515d48ef7d07f0b8 (patch) | |
tree | 0a443fdda82c7411785c1dc3e7fe93475273c11b /librabbitmq/amqp_openssl.c | |
parent | bbe5ddbdd6f18fdde30642cbdff7b935016d5bec (diff) | |
download | rabbitmq-c-26a53d29bd32809e07687ef6515d48ef7d07f0b8.tar.gz |
Lib: don't try hard when closing SSL sockets
If a heartbeat timeout occurs skip calling SSL_shutdown as it involves doing a
send() which will likely hang. Additionally don't wait for a response when doing
an SSL_shutdown, as the underlying transport will not be reused.
Fixes #313
Diffstat (limited to 'librabbitmq/amqp_openssl.c')
-rw-r--r-- | librabbitmq/amqp_openssl.c | 27 |
1 files changed, 6 insertions, 21 deletions
diff --git a/librabbitmq/amqp_openssl.c b/librabbitmq/amqp_openssl.c index 727f48c..651353b 100644 --- a/librabbitmq/amqp_openssl.c +++ b/librabbitmq/amqp_openssl.c @@ -348,34 +348,19 @@ error_out1: } static int -amqp_ssl_socket_close(void *base) +amqp_ssl_socket_close(void *base, amqp_socket_close_enum force) { - int res; struct amqp_ssl_socket_t *self = (struct amqp_ssl_socket_t *)base; if (-1 == self->sockfd) { return AMQP_STATUS_SOCKET_CLOSED; } -start_shutdown: - res = SSL_shutdown(self->ssl); - if (0 == res) { - goto start_shutdown; - } else if (-1 == res) { - self->internal_error = SSL_get_error(self->ssl, res); - switch (self->internal_error) { - case SSL_ERROR_WANT_READ: - res = amqp_poll(self->sockfd, AMQP_SF_POLLIN, amqp_time_infinite()); - break; - case SSL_ERROR_WANT_WRITE: - res = amqp_poll(self->sockfd, AMQP_SF_POLLOUT, amqp_time_infinite()); - break; - } - if (AMQP_STATUS_OK == res) { - goto start_shutdown; - } - /* Swallow errors in poll, just consider the connection dead */ + if (AMQP_SC_NONE == force) { + /* don't try too hard to shutdown the connection */ + SSL_shutdown(self->ssl); } + SSL_free(self->ssl); self->ssl = NULL; @@ -400,7 +385,7 @@ amqp_ssl_socket_delete(void *base) struct amqp_ssl_socket_t *self = (struct amqp_ssl_socket_t *)base; if (self) { - amqp_ssl_socket_close(self); + amqp_ssl_socket_close(self, AMQP_SC_NONE); SSL_CTX_free(self->ctx); free(self); |