diff options
Diffstat (limited to 'librabbitmq')
-rw-r--r-- | librabbitmq/amqp-cyassl.c | 21 | ||||
-rw-r--r-- | librabbitmq/amqp-gnutls.c | 21 | ||||
-rw-r--r-- | librabbitmq/amqp-openssl.c | 21 | ||||
-rw-r--r-- | librabbitmq/amqp-polarssl.c | 24 |
4 files changed, 58 insertions, 29 deletions
diff --git a/librabbitmq/amqp-cyassl.c b/librabbitmq/amqp-cyassl.c index f8e4d40..960e209 100644 --- a/librabbitmq/amqp-cyassl.c +++ b/librabbitmq/amqp-cyassl.c @@ -32,6 +32,8 @@ struct amqp_ssl_socket_context { CYASSL_CTX *ctx; CYASSL *ssl; + char *buffer; + size_t length; }; static ssize_t @@ -52,26 +54,30 @@ amqp_ssl_socket_writev(AMQP_UNUSED int sockfd, void *user_data) { struct amqp_ssl_socket_context *self = user_data; - char *buffer, *bufferp; ssize_t written = -1; + char *bufferp; size_t bytes; int i; bytes = 0; for (i = 0; i < iovcnt; ++i) { bytes += iov[i].iov_len; } - buffer = malloc(bytes); - if (!buffer) { - goto exit; + if (self->length < bytes) { + free(self->buffer); + self->buffer = malloc(bytes); + if (!self->buffer) { + self->length = 0; + goto exit; + } + self->length = bytes; } - bufferp = buffer; + bufferp = self->buffer; for (i = 0; i < iovcnt; ++i) { memcpy(bufferp, iov[i].iov_base, iov[i].iov_len); bufferp += iov[i].iov_len; } - written = CyaSSL_write(self->ssl, buffer, bytes); + written = CyaSSL_write(self->ssl, self->buffer, bytes); exit: - free(buffer); return written; } @@ -95,6 +101,7 @@ amqp_ssl_socket_close(int sockfd, if (self) { CyaSSL_free(self->ssl); CyaSSL_CTX_free(self->ctx); + free(self->buffer); free(self); } if (sockfd >= 0) { diff --git a/librabbitmq/amqp-gnutls.c b/librabbitmq/amqp-gnutls.c index a435371..3268007 100644 --- a/librabbitmq/amqp-gnutls.c +++ b/librabbitmq/amqp-gnutls.c @@ -34,6 +34,8 @@ struct amqp_ssl_socket_context { gnutls_session_t session; gnutls_certificate_credentials_t credentials; char *host; + char *buffer; + size_t length; }; static ssize_t @@ -54,26 +56,30 @@ amqp_ssl_socket_writev(AMQP_UNUSED int sockfd, void *user_data) { struct amqp_ssl_socket_context *self = user_data; - char *buffer, *bufferp; ssize_t written = -1; + char *bufferp; size_t bytes; int i; bytes = 0; for (i = 0; i < iovcnt; ++i) { bytes += iov[i].iov_len; } - buffer = malloc(bytes); - if (!buffer) { - goto exit; + if (self->length < bytes) { + free(self->buffer); + self->buffer = malloc(bytes); + if (!self->buffer) { + self->length = 0; + goto exit; + } + self->length = 0; } - bufferp = buffer; + bufferp = self->buffer; for (i = 0; i < iovcnt; ++i) { memcpy(bufferp, iov[i].iov_base, iov[i].iov_len); bufferp += iov[i].iov_len; } - written = gnutls_record_send(self->session, buffer, bytes); + written = gnutls_record_send(self->session, self->buffer, bytes); exit: - free(buffer); return written; } @@ -101,6 +107,7 @@ amqp_ssl_socket_close(int sockfd, gnutls_deinit(self->session); gnutls_certificate_free_credentials(self->credentials); free(self->host); + free(self->buffer); free(self); } return status; diff --git a/librabbitmq/amqp-openssl.c b/librabbitmq/amqp-openssl.c index d97aa4c..781ce8a 100644 --- a/librabbitmq/amqp-openssl.c +++ b/librabbitmq/amqp-openssl.c @@ -37,6 +37,8 @@ struct amqp_ssl_socket_context { BIO *bio; SSL_CTX *ctx; + char *buffer; + size_t length; }; static ssize_t @@ -74,26 +76,30 @@ amqp_ssl_socket_writev(AMQP_UNUSED int sockfd, void *user_data) { struct amqp_ssl_socket_context *self = user_data; - char *buffer, *bufferp; ssize_t written = -1; + char *bufferp; size_t bytes; int i; bytes = 0; for (i = 0; i < iovcnt; ++i) { bytes += iov[i].iov_len; } - buffer = malloc(bytes); - if (!buffer) { - goto exit; + if (self->length < bytes) { + free(self->buffer); + self->buffer = malloc(bytes); + if (!self->buffer) { + self->length = 0; + goto exit; + } + self->length = bytes; } - bufferp = buffer; + bufferp = self->buffer; for (i = 0; i < iovcnt; ++i) { memcpy(bufferp, iov[i].iov_base, iov[i].iov_len); bufferp += iov[i].iov_len; } - written = amqp_ssl_socket_send(sockfd, buffer, bytes, 0, self); + written = amqp_ssl_socket_send(sockfd, self->buffer, bytes, 0, self); exit: - free(buffer); return written; } @@ -131,6 +137,7 @@ amqp_ssl_socket_close(int sockfd, if (self) { BIO_free_all(self->bio); SSL_CTX_free(self->ctx); + free(self->buffer); free(self); } return 0 > sockfd ? -1 : 0; diff --git a/librabbitmq/amqp-polarssl.c b/librabbitmq/amqp-polarssl.c index e55aa00..55dbc43 100644 --- a/librabbitmq/amqp-polarssl.c +++ b/librabbitmq/amqp-polarssl.c @@ -41,6 +41,8 @@ struct amqp_ssl_socket_context { x509_cert *cert; ssl_context *ssl; ssl_session *session; + char *buffer; + size_t length; }; static ssize_t @@ -61,26 +63,31 @@ amqp_ssl_socket_writev(AMQP_UNUSED int sockfd, void *user_data) { struct amqp_ssl_socket_context *self = user_data; - char *buffer, *bufferp; ssize_t written = -1; + char *bufferp; size_t bytes; int i; bytes = 0; for (i = 0; i < iovcnt; ++i) { bytes += iov[i].iov_len; } - buffer = malloc(bytes); - if (!buffer) { - goto exit; + if (self->length < bytes) { + free(self->buffer); + self->buffer = malloc(bytes); + if (!self->buffer) { + self->length = 0; + goto exit; + } + self->length = bytes; } - bufferp = buffer; + bufferp = self->buffer; for (i = 0; i < iovcnt; ++i) { memcpy(bufferp, iov[i].iov_base, iov[i].iov_len); bufferp += iov[i].iov_len; } - written = ssl_write(self->ssl, (const unsigned char *)buffer, bytes); + written = ssl_write(self->ssl, (const unsigned char *)self->buffer, + bytes); exit: - free(buffer); return written; } @@ -113,11 +120,12 @@ amqp_ssl_socket_close(int sockfd, ssl_free(self->ssl); free(self->ssl); free(self->session); - free(self); + free(self->buffer); if (self->sockfd >= 0) { net_close(sockfd); status = 0; } + free(self); } return status; } |