diff options
author | Alan Antonuk <alan.antonuk@gmail.com> | 2014-12-29 22:42:21 -0800 |
---|---|---|
committer | Alan Antonuk <alan.antonuk@gmail.com> | 2014-12-29 22:42:21 -0800 |
commit | ee54e274fe3c8d41bba0f274b997a587bff2482b (patch) | |
tree | 55756e4752e58112a5a9d61642047394eee2419b /librabbitmq/amqp_openssl.c | |
parent | 9626dd5cd5f78894f1416a1afd2d624ddd4904ae (diff) | |
download | rabbitmq-c-ee54e274fe3c8d41bba0f274b997a587bff2482b.tar.gz |
Check for double close/open in socket impl
Check to state of socket when doing open/read/write/close to prevent double-open
and double-close issues with the socket implementation.
Fixes #228
Diffstat (limited to 'librabbitmq/amqp_openssl.c')
-rw-r--r-- | librabbitmq/amqp_openssl.c | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/librabbitmq/amqp_openssl.c b/librabbitmq/amqp_openssl.c index 393a84e..85b9ca5 100644 --- a/librabbitmq/amqp_openssl.c +++ b/librabbitmq/amqp_openssl.c @@ -117,6 +117,10 @@ amqp_ssl_socket_writev(void *base, char *bufferp; size_t bytes; int i; + if (-1 == self->sockfd) { + return AMQP_STATUS_SOCKET_CLOSED; + } + bytes = 0; for (i = 0; i < iovcnt; ++i) { bytes += iov[i].iov_len; @@ -148,6 +152,9 @@ amqp_ssl_socket_recv(void *base, { struct amqp_ssl_socket_t *self = (struct amqp_ssl_socket_t *)base; ssize_t received; + if (-1 == self->sockfd) { + return AMQP_STATUS_SOCKET_CLOSED; + } ERR_clear_error(); self->internal_error = 0; @@ -232,6 +239,9 @@ amqp_ssl_socket_open(void *base, const char *host, int port, struct timeval *tim struct amqp_ssl_socket_t *self = (struct amqp_ssl_socket_t *)base; long result; int status; + if (-1 != self->sockfd) { + return AMQP_STATUS_SOCKET_INUSE; + } ERR_clear_error(); self->ssl = SSL_new(self->ctx); @@ -301,19 +311,18 @@ amqp_ssl_socket_close(void *base) { struct amqp_ssl_socket_t *self = (struct amqp_ssl_socket_t *)base; - if (self->ssl) { - SSL_shutdown(self->ssl); - SSL_free(self->ssl); - self->ssl = NULL; + if (-1 == self->sockfd) { + return AMQP_STATUS_SOCKET_CLOSED; } - if (-1 != self->sockfd) { - if (amqp_os_socket_close(self->sockfd)) { - return AMQP_STATUS_SOCKET_ERROR; - } + SSL_shutdown(self->ssl); + SSL_free(self->ssl); + self->ssl = NULL; - self->sockfd = -1; + if (amqp_os_socket_close(self->sockfd)) { + return AMQP_STATUS_SOCKET_ERROR; } + self->sockfd = -1; return AMQP_STATUS_OK; } |