aboutsummaryrefslogtreecommitdiff
path: root/networks
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
parent1fccd7a7bca5a980706b098d0b75f6c99edab63d (diff)
downloadhaxircd-2423b203c96814efa1a177222f448527146a1c0c.tar.gz
haxircd-2423b203c96814efa1a177222f448527146a1c0c.zip
Fix some locking bugs
Diffstat (limited to 'networks')
-rw-r--r--networks/openssl.c4
-rw-r--r--networks/openssl_buffered.c7
2 files changed, 8 insertions, 3 deletions
diff --git a/networks/openssl.c b/networks/openssl.c
index fdfd602..6b67f11 100644
--- a/networks/openssl.c
+++ b/networks/openssl.c
@@ -140,7 +140,6 @@ size_t openssl_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)) {
case SSL_ERROR_WANT_READ:
@@ -150,12 +149,14 @@ size_t openssl_recv(void *handle, char *data, size_t len, char *err) {
pollfd.events = POLLOUT;
break;
default:
+ mutex_unlock(&(openssl_handle->mutex));
*err = 3;
return 0;
}
} else {
break;
}
+ mutex_unlock(&(openssl_handle->mutex));
res = poll(&pollfd, 1, PING_INTERVAL*1000);
if (res == 0) { // Timeout
@@ -180,6 +181,7 @@ size_t openssl_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;
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;