Skip to content

Commit d747df2

Browse files
committed
Make sure no mutexes are held when cond API are called
1 parent 7ba00f3 commit d747df2

4 files changed

Lines changed: 31 additions & 10 deletions

File tree

examples/benchmark/tls_bench.c

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -416,9 +416,9 @@ static int ServerMemSend(info_t* info, char* buf, int sz)
416416
XMEMCPY(&info->to_client.buf[info->to_client.write_idx], buf, sz);
417417
info->to_client.write_idx += sz;
418418
info->to_client.write_bytes += sz;
419+
THREAD_CHECK_RET(wc_UnLockMutex(&info->to_client.mutex));
419420

420421
THREAD_CHECK_RET(wolfSSL_CondSignal(&info->to_client.cond));
421-
THREAD_CHECK_RET(wc_UnLockMutex(&info->to_client.mutex));
422422

423423
#ifdef BENCH_USE_NONBLOCK
424424
if (sz == 0) {
@@ -436,7 +436,9 @@ static int ServerMemRecv(info_t* info, char* buf, int sz)
436436
#ifndef BENCH_USE_NONBLOCK
437437
while (info->to_server.write_idx - info->to_server.read_idx < sz &&
438438
!info->to_client.done) {
439+
THREAD_CHECK_RET(wc_UnLockMutex(&info->to_server.mutex));
439440
THREAD_CHECK_RET(wolfSSL_CondWait(&info->to_server.cond));
441+
THREAD_CHECK_RET(wc_LockMutex(&info->to_server.mutex));
440442
}
441443
#else
442444
if (info->to_server.write_idx - info->to_server.read_idx < sz) {
@@ -491,8 +493,8 @@ static int ClientMemSend(info_t* info, char* buf, int sz)
491493
info->to_server.write_idx += sz;
492494
info->to_server.write_bytes += sz;
493495

494-
THREAD_CHECK_RET(wolfSSL_CondSignal(&info->to_server.cond));
495496
THREAD_CHECK_RET(wc_UnLockMutex(&info->to_server.mutex));
497+
THREAD_CHECK_RET(wolfSSL_CondSignal(&info->to_server.cond));
496498

497499
#ifdef BENCH_USE_NONBLOCK
498500
if (sz == 0) {
@@ -510,7 +512,9 @@ static int ClientMemRecv(info_t* info, char* buf, int sz)
510512
#ifndef BENCH_USE_NONBLOCK
511513
while (info->to_client.write_idx - info->to_client.read_idx < sz &&
512514
!info->to_server.done) {
515+
THREAD_CHECK_RET(wc_UnLockMutex(&info->to_client.mutex));
513516
THREAD_CHECK_RET(wolfSSL_CondWait(&info->to_client.cond));
517+
THREAD_CHECK_RET(wc_LockMutex(&info->to_client.mutex));
514518
}
515519
#else
516520
if (info->to_client.write_idx - info->to_client.read_idx < sz) {
@@ -1052,7 +1056,9 @@ static int bench_tls_client(info_t* info)
10521056
if (info->doDTLS && !info->clientOrserverOnly) {
10531057
THREAD_CHECK_RET(wc_LockMutex(&info->dtls_mutex));
10541058
if (info->serverReady != 1) {
1059+
THREAD_CHECK_RET(wc_UnLockMutex(&info->dtls_mutex));
10551060
THREAD_CHECK_RET(wolfSSL_CondWait(&info->dtls_cond));
1061+
THREAD_CHECK_RET(wc_LockMutex(&info->dtls_mutex));
10561062
}
10571063
/* for next loop */
10581064
info->serverReady = 0;
@@ -1198,9 +1204,9 @@ static THREAD_RETURN WOLFSSL_THREAD_NO_JOIN client_thread(void* args)
11981204

11991205
ret = bench_tls_client(info);
12001206

1201-
THREAD_CHECK_RET(wolfSSL_CondSignal(&info->to_server.cond));
12021207
info->to_client.done = 1;
12031208
info->client.ret = ret;
1209+
THREAD_CHECK_RET(wolfSSL_CondSignal(&info->to_server.cond));
12041210

12051211
WOLFSSL_RETURN_FROM_THREAD(NULL);
12061212
}
@@ -1288,8 +1294,8 @@ static int SocketWaitClient(info_t* info)
12881294
if (!info->clientOrserverOnly) {
12891295
THREAD_CHECK_RET(wc_LockMutex(&info->dtls_mutex));
12901296
info->serverReady = 1;
1291-
THREAD_CHECK_RET(wolfSSL_CondSignal(&info->dtls_cond));
12921297
THREAD_CHECK_RET(wc_UnLockMutex(&info->dtls_mutex));
1298+
THREAD_CHECK_RET(wolfSSL_CondSignal(&info->dtls_cond));
12931299
}
12941300
#endif
12951301
connd = (int)recvfrom(info->listenFd, (char *)msg, sizeof(msg),
@@ -1656,9 +1662,9 @@ static THREAD_RETURN WOLFSSL_THREAD_NO_JOIN server_thread(void* args)
16561662
}
16571663
}
16581664

1659-
THREAD_CHECK_RET(wolfSSL_CondSignal(&info->to_client.cond));
16601665
info->to_server.done = 1;
16611666
info->server.ret = ret;
1667+
THREAD_CHECK_RET(wolfSSL_CondSignal(&info->to_client.cond));
16621668

16631669
WOLFSSL_RETURN_FROM_THREAD(NULL);
16641670
}

examples/echoserver/echoserver.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,8 @@ static void SignalReady(void* args, word16 port)
7474
THREAD_CHECK_RET(wc_LockMutex(&ready->mutex));
7575
ready->ready = 1;
7676
ready->port = port;
77-
THREAD_CHECK_RET(wolfSSL_CondSignal(&ready->cond));
7877
THREAD_CHECK_RET(wc_UnLockMutex(&ready->mutex));
78+
THREAD_CHECK_RET(wolfSSL_CondSignal(&ready->cond));
7979
#endif /* NO_MAIN_DRIVER && WOLFSSL_COND */
8080
(void)args;
8181
(void)port;

src/crl.c

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -936,7 +936,10 @@ static int SignalSetup(WOLFSSL_CRL* crl, int status)
936936
return BAD_MUTEX_E;
937937
}
938938
crl->setup = status;
939-
wc_UnLockMutex(&crl->crlLock);
939+
if (wc_UnLockMutex(&crl->crlLock) != 0) {
940+
WOLFSSL_MSG("wc_UnLockMutex crlLock failed");
941+
return BAD_MUTEX_E;
942+
}
940943

941944
ret = wolfSSL_CondSignal(&crl->cond);
942945
if (ret != 0)
@@ -1492,22 +1495,31 @@ static int StartMonitorCRL(WOLFSSL_CRL* crl)
14921495
}
14931496
while (crl->setup == 0) {
14941497
int condRet;
1495-
wc_UnLockMutex(&crl->crlLock);
1498+
if (wc_UnLockMutex(&crl->crlLock) != 0) {
1499+
WOLFSSL_MSG("wc_UnLockMutex crlLock failed");
1500+
return BAD_MUTEX_E;
1501+
}
14961502
condRet = wolfSSL_CondWait(&crl->cond);
1497-
wc_LockMutex(&crl->crlLock);
1503+
if (wc_LockMutex(&crl->crlLock) != 0) {
1504+
WOLFSSL_MSG("wc_LockMutex crlLock failed");
1505+
return BAD_MUTEX_E;
1506+
}
14981507
if (condRet != 0) {
14991508
ret = BAD_COND_E;
15001509
break;
15011510
}
15021511
}
15031512
if (ret >= 0 && crl->setup < 0)
15041513
ret = crl->setup; /* store setup error */
1505-
wc_UnLockMutex(&crl->crlLock);
15061514

15071515
if (ret < 0) {
15081516
WOLFSSL_MSG("DoMonitor setup failure");
15091517
crl->tid = INVALID_THREAD_VAL; /* thread already done */
15101518
}
1519+
if (wc_UnLockMutex(&crl->crlLock) != 0) {
1520+
WOLFSSL_MSG("wc_UnLockMutex crlLock failed");
1521+
return BAD_MUTEX_E;
1522+
}
15111523

15121524
return ret;
15131525
}

wolfcrypt/src/wc_port.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3704,12 +3704,14 @@ char* mystrnstr(const char* s1, const char* s2, unsigned int n)
37043704

37053705
if (pthread_mutex_init(&cond->mutex, NULL) != 0)
37063706
return MEMORY_E;
3707+
37073708
if (pthread_cond_init(&cond->cond, NULL) != 0) {
37083709
/* Keep compilers happy that we are using the return code */
37093710
if (pthread_mutex_destroy(&cond->mutex) != 0)
37103711
return MEMORY_E;
37113712
return MEMORY_E;
37123713
}
3714+
37133715
return 0;
37143716
}
37153717

@@ -3722,6 +3724,7 @@ char* mystrnstr(const char* s1, const char* s2, unsigned int n)
37223724

37233725
if (pthread_mutex_destroy(&cond->mutex) != 0)
37243726
ret = MEMORY_E;
3727+
37253728
if (pthread_cond_destroy(&cond->cond) != 0)
37263729
ret = MEMORY_E;
37273730

0 commit comments

Comments
 (0)