aboutsummaryrefslogtreecommitdiff
path: root/networks/openssl_buffered.c
diff options
context:
space:
mode:
authorTest_User <hax@andrewyu.org>2024-06-19 07:16:56 -0400
committerTest_User <hax@andrewyu.org>2024-06-19 07:16:56 -0400
commit2423b203c96814efa1a177222f448527146a1c0c (patch)
tree8c0c80efb7998ab25710b108e735c15d13db6bbc /networks/openssl_buffered.c
parent1fccd7a7bca5a980706b098d0b75f6c99edab63d (diff)
downloadhaxircd-2423b203c96814efa1a177222f448527146a1c0c.tar.gz
haxircd-2423b203c96814efa1a177222f448527146a1c0c.zip
Fix some locking bugs
Diffstat (limited to 'networks/openssl_buffered.c')
-rw-r--r--networks/openssl_buffered.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/networks/openssl_buffered.c b/networks/openssl_buffered.c
index 6959d33..c973dcd 100644
--- a/networks/openssl_buffered.c
+++ b/networks/openssl_buffered.c
@@ -272,9 +272,9 @@ size_t openssl_buffered_recv(void *handle, char *data, size_t len, char *err) {
return 0;
}
res = SSL_read(openssl_handle->ssl, data, len);
- mutex_unlock(&(openssl_handle->mutex));
if (res <= 0) {
- switch(SSL_get_error(openssl_handle->ssl, res)) {
+ int ssl_err = SSL_get_error(openssl_handle->ssl, res);
+ switch(ssl_err) {
case SSL_ERROR_WANT_READ:
pollfd.events = POLLIN;
break;
@@ -283,11 +283,13 @@ size_t openssl_buffered_recv(void *handle, char *data, size_t len, char *err) {
break;
default:
*err = 3;
+ mutex_unlock(&(openssl_handle->mutex));
return 0;
}
} else {
break;
}
+ mutex_unlock(&(openssl_handle->mutex));
res = poll(&pollfd, 1, PING_INTERVAL*1000);
if (res == 0) { // Timeout
@@ -312,6 +314,7 @@ size_t openssl_buffered_recv(void *handle, char *data, size_t len, char *err) {
return 0;
}
} while (1);
+ mutex_unlock(&(openssl_handle->mutex));
*err = 0;
return (size_t)res;