Skip to content

Commit e26ab42

Browse files
committed
Use O_CLOEXEC to avoid race conditions
1 parent 178e10e commit e26ab42

13 files changed

Lines changed: 182 additions & 23 deletions

File tree

.wolfssl_known_macro_extras

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,7 @@ DTLS_RECEIVEFROM_NO_TIMEOUT_ON_INVALID_PEER
219219
ECCSI_ORDER_MORE_BITS_THAN_PRIME
220220
ECC_DUMP_OID
221221
ECDHE_SIZE
222+
EFD_CLOEXEC
222223
ENABLED_BSDKM_REGISTER
223224
ENABLE_SECURE_SOCKETS_LOGS
224225
ESP32
@@ -234,6 +235,7 @@ ETHERNET_AVAILABLE
234235
ETHERNET_H
235236
EV_TRIGGER
236237
EXTERNAL_LOADER_APP
238+
FD_CLOEXEC
237239
FIPS_OPTEST_FULL_RUN_AT_MODULE_INIT
238240
FORCE_FAILURE_GETRANDOM
239241
FP_ECC_CONTROL
@@ -317,6 +319,7 @@ IGNORE_NETSCAPE_CERT_TYPE
317319
INCLUDE_uxTaskGetStackHighWaterMark
318320
INTEGRITY
319321
INTIMEVER
322+
IN_CLOEXEC
320323
IOTSAFE_NO_GETDATA
321324
IOTSAFE_SIG_8BIT_LENGTH
322325
KCAPI_USE_XMALLOC
@@ -476,7 +479,9 @@ OPENSSL_NO_PK
476479
OS_WINDOWS
477480
OTHERBOARD
478481
OTHER_BOARD
482+
O_CLOEXEC
479483
PEER_INFO
484+
PERF_FLAG_FD_CLOEXEC
480485
PKA_ECC_SCALAR_MUL_IN_B_COEFF
481486
PLATFORMIO
482487
PLUTON_CRYPTO_ECC
@@ -519,6 +524,7 @@ SL_SE_KEY_TYPE_ECC_X25519
519524
SL_SE_KEY_TYPE_ECC_X448
520525
SL_SE_PRF_HMAC_SHA1
521526
SNIFFER_SINGLE_SESSION_CACHE
527+
SOCK_CLOEXEC
522528
SOFTDEVICE_PRESENT
523529
SO_NOSIGPIPE
524530
SO_REUSEPORT
@@ -1116,6 +1122,7 @@ __sun
11161122
__svr4__
11171123
__thumb__
11181124
__ti__
1125+
__unix__
11191126
__x86_64__
11201127
__xtensa__
11211128
byte

src/crl.c

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1659,6 +1659,7 @@ static int SwapLists(WOLFSSL_CRL* crl)
16591659
#include <sys/time.h>
16601660
#include <fcntl.h>
16611661
#include <unistd.h>
1662+
#include <errno.h>
16621663

16631664
#ifdef __MACH__
16641665
#define XEVENT_MODE O_EVTONLY
@@ -1667,6 +1668,7 @@ static int SwapLists(WOLFSSL_CRL* crl)
16671668
#endif
16681669

16691670

1671+
16701672
/* we need a unique kqueue user filter fd for crl in case user is doing custom
16711673
* events too */
16721674
#ifndef CRL_CUSTOM_FD
@@ -1710,6 +1712,7 @@ static THREAD_RETURN WOLFSSL_THREAD DoMonitor(void* arg)
17101712
SignalSetup(crl, MONITOR_SETUP_E);
17111713
return NULL;
17121714
}
1715+
wc_set_cloexec(crl->mfd);
17131716

17141717
/* listen for custom shutdown event */
17151718
EV_SET(&change, CRL_CUSTOM_FD, EVFILT_USER, EV_ADD, 0, 0, NULL);
@@ -1724,7 +1727,7 @@ static THREAD_RETURN WOLFSSL_THREAD DoMonitor(void* arg)
17241727
fDER = -1;
17251728

17261729
if (crl->monitors[0].path) {
1727-
fPEM = open(crl->monitors[0].path, XEVENT_MODE);
1730+
fPEM = wc_open_cloexec(crl->monitors[0].path, XEVENT_MODE);
17281731
if (fPEM == -1) {
17291732
WOLFSSL_MSG("PEM event dir open failed");
17301733
SignalSetup(crl, MONITOR_SETUP_E);
@@ -1734,7 +1737,7 @@ static THREAD_RETURN WOLFSSL_THREAD DoMonitor(void* arg)
17341737
}
17351738

17361739
if (crl->monitors[1].path) {
1737-
fDER = open(crl->monitors[1].path, XEVENT_MODE);
1740+
fDER = wc_open_cloexec(crl->monitors[1].path, XEVENT_MODE);
17381741
if (fDER == -1) {
17391742
WOLFSSL_MSG("DER event dir open failed");
17401743
if (fPEM != -1)
@@ -1801,6 +1804,13 @@ static THREAD_RETURN WOLFSSL_THREAD DoMonitor(void* arg)
18011804
#include <sys/inotify.h>
18021805
#include <sys/eventfd.h>
18031806
#include <unistd.h>
1807+
#include <fcntl.h>
1808+
#include <errno.h>
1809+
1810+
/* Fall back to no-op if EFD_CLOEXEC is unavailable. */
1811+
#ifndef EFD_CLOEXEC
1812+
#define EFD_CLOEXEC 0
1813+
#endif
18041814

18051815

18061816
#ifndef max
@@ -1836,14 +1846,29 @@ static THREAD_RETURN WOLFSSL_THREAD DoMonitor(void* arg)
18361846

18371847
WOLFSSL_ENTER("DoMonitor");
18381848

1839-
crl->mfd = eventfd(0, 0); /* our custom shutdown event */
1849+
crl->mfd = eventfd(0, EFD_CLOEXEC); /* our custom shutdown event */
1850+
#ifdef FD_CLOEXEC
1851+
if (crl->mfd < 0 && errno == EINVAL) {
1852+
crl->mfd = eventfd(0, 0);
1853+
wc_set_cloexec(crl->mfd);
1854+
}
1855+
#endif
18401856
if (crl->mfd < 0) {
18411857
WOLFSSL_MSG("eventfd failed");
18421858
SignalSetup(crl, MONITOR_SETUP_E);
18431859
return NULL;
18441860
}
18451861

1862+
#ifdef IN_CLOEXEC
1863+
notifyFd = inotify_init1(IN_CLOEXEC);
1864+
if (notifyFd < 0 && (errno == ENOSYS || errno == EINVAL)) {
1865+
notifyFd = inotify_init();
1866+
wc_set_cloexec(notifyFd);
1867+
}
1868+
#else
18461869
notifyFd = inotify_init();
1870+
wc_set_cloexec(notifyFd);
1871+
#endif
18471872
if (notifyFd < 0) {
18481873
WOLFSSL_MSG("inotify failed");
18491874
(void)close(crl->mfd);

src/ssl.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19601,7 +19601,7 @@ int wolfSSL_RAND_egd(const char* nm)
1960119601
return WOLFSSL_FATAL_ERROR;
1960219602
}
1960319603

19604-
fd = socket(AF_UNIX, SOCK_STREAM, 0);
19604+
fd = wc_socket_cloexec(AF_UNIX, SOCK_STREAM, 0);
1960519605
if (fd < 0) {
1960619606
WOLFSSL_MSG("Error creating socket");
1960719607
WC_FREE_VAR_EX(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);

src/wolfio.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
#include <wolfssl/wolfio.h>
4343
#include <wolfssl/wolfcrypt/logging.h>
4444

45+
4546
#ifdef NUCLEUS_PLUS_2_3
4647
/* Holds last Nucleus networking error number */
4748
int Nucleus_Net_Errno;
@@ -1494,7 +1495,7 @@ int wolfIO_TcpConnect(SOCKET_T* sockfd, const char* ip, word16 port, int to_sec)
14941495
}
14951496
#endif
14961497

1497-
*sockfd = (SOCKET_T)socket(addr.ss_family, SOCK_STREAM, 0);
1498+
*sockfd = (SOCKET_T)wc_socket_cloexec(addr.ss_family, SOCK_STREAM, 0);
14981499
#ifdef USE_WINDOWS_API
14991500
if (*sockfd == SOCKET_INVALID)
15001501
#else
@@ -1572,12 +1573,12 @@ int wolfIO_TcpBind(SOCKET_T* sockfd, word16 port)
15721573
sin->sin6_family = AF_INET6;
15731574
sin->sin6_addr = in6addr_any;
15741575
sin->sin6_port = XHTONS(port);
1575-
*sockfd = (SOCKET_T)socket(AF_INET6, SOCK_STREAM, 0);
1576+
*sockfd = (SOCKET_T)wc_socket_cloexec(AF_INET6, SOCK_STREAM, 0);
15761577
#else
15771578
sin->sin_family = AF_INET;
15781579
sin->sin_addr.s_addr = INADDR_ANY;
15791580
sin->sin_port = XHTONS(port);
1580-
*sockfd = (SOCKET_T)socket(AF_INET, SOCK_STREAM, 0);
1581+
*sockfd = (SOCKET_T)wc_socket_cloexec(AF_INET, SOCK_STREAM, 0);
15811582
#endif
15821583

15831584
#ifdef USE_WINDOWS_API
@@ -1623,7 +1624,7 @@ int wolfIO_TcpBind(SOCKET_T* sockfd, word16 port)
16231624
#ifdef HAVE_SOCKADDR
16241625
int wolfIO_TcpAccept(SOCKET_T sockfd, SOCKADDR* peer_addr, XSOCKLENT* peer_len)
16251626
{
1626-
return (int)accept(sockfd, peer_addr, peer_len);
1627+
return wc_accept_cloexec((int)sockfd, peer_addr, peer_len);
16271628
}
16281629
#endif /* HAVE_SOCKADDR */
16291630

wolfcrypt/benchmark/benchmark.c

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1574,16 +1574,30 @@ static const char* bench_result_words3[][5] = {
15741574
#include <linux/perf_event.h>
15751575
#include <sys/syscall.h>
15761576
#include <unistd.h>
1577+
#include <fcntl.h>
1578+
#include <errno.h>
1579+
1580+
#ifndef PERF_FLAG_FD_CLOEXEC
1581+
#define PERF_FLAG_FD_CLOEXEC (1UL << 3)
1582+
#endif
15771583

15781584
static THREAD_LS_T word64 begin_cycles;
15791585
static THREAD_LS_T word64 total_cycles;
15801586
static THREAD_LS_T int cycles = -1;
15811587
static THREAD_LS_T struct perf_event_attr atr;
15821588

1589+
/* Try with PERF_FLAG_FD_CLOEXEC first; on older kernels (< 3.14) this
1590+
* fails with EINVAL, so fall back to flags=0 and set FD_CLOEXEC via
1591+
* fcntl() as a best-effort. */
15831592
#define INIT_CYCLE_COUNTER do { \
15841593
atr.type = PERF_TYPE_HARDWARE; \
15851594
atr.config = PERF_COUNT_HW_CPU_CYCLES; \
1586-
cycles = (int)syscall(__NR_perf_event_open, &atr, 0, -1, -1, 0); \
1595+
cycles = (int)syscall(__NR_perf_event_open, &atr, 0, -1, -1, \
1596+
PERF_FLAG_FD_CLOEXEC); \
1597+
if (cycles < 0 && errno == EINVAL) { \
1598+
cycles = (int)syscall(__NR_perf_event_open, &atr, 0, -1, -1, 0); \
1599+
wc_set_cloexec(cycles); \
1600+
} \
15871601
} while (0);
15881602

15891603
#define BEGIN_CYCLES read(cycles, &begin_cycles, sizeof(begin_cycles));

wolfcrypt/src/port/af_alg/afalg_hash.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,19 @@
1919
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
2020
*/
2121

22+
#if defined(__linux__) && !defined(_GNU_SOURCE)
23+
#define _GNU_SOURCE 1
24+
#endif
25+
2226
#include <wolfssl/wolfcrypt/libwolfssl_sources.h>
2327

2428
#if defined(WOLFSSL_AFALG_HASH) || (defined(WOLFSSL_AFALG_XILINX_SHA3) \
2529
&& defined(WOLFSSL_SHA3))
2630

2731
#include <wolfssl/wolfcrypt/port/af_alg/wc_afalg.h>
2832
#include <wolfssl/wolfcrypt/port/af_alg/afalg_hash.h>
33+
#include <errno.h>
34+
#include <fcntl.h>
2935

3036
static const char WC_TYPE_HASH[] = "hash";
3137

@@ -223,8 +229,8 @@ static int AfalgHashCopy(wolfssl_AFALG_Hash* src, wolfssl_AFALG_Hash* dst)
223229
}
224230
#endif
225231

226-
dst->rdFd = accept(src->rdFd, NULL, 0);
227-
dst->alFd = accept(src->alFd, NULL, 0);
232+
dst->rdFd = wc_accept_cloexec(src->rdFd, NULL, NULL);
233+
dst->alFd = wc_accept_cloexec(src->alFd, NULL, NULL);
228234

229235
if (dst->rdFd == WC_SOCK_NOTSET || dst->alFd == WC_SOCK_NOTSET) {
230236
AfalgHashFree(dst);

wolfcrypt/src/port/af_alg/wc_afalg.c

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,20 @@
1919
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
2020
*/
2121

22+
#if defined(__linux__) && !defined(_GNU_SOURCE)
23+
#define _GNU_SOURCE 1
24+
#endif
25+
2226
#include <wolfssl/wolfcrypt/libwolfssl_sources.h>
2327

2428
#if defined(WOLFSSL_AFALG) || defined(WOLFSSL_AFALG_XILINX)
2529

2630
#include <wolfssl/wolfcrypt/port/af_alg/wc_afalg.h>
2731
#include <linux/if_alg.h>
32+
#include <sys/socket.h>
33+
#include <errno.h>
34+
#include <fcntl.h>
35+
2836

2937

3038
/* Sets the type of socket address to use */
@@ -56,7 +64,7 @@ int wc_Afalg_Accept(struct sockaddr_alg* in, int inSz, int sock)
5664
return WC_AFALG_SOCK_E;
5765
}
5866

59-
return accept(sock, NULL, 0);
67+
return wc_accept_cloexec(sock, NULL, NULL);
6068
}
6169

6270

@@ -66,7 +74,8 @@ int wc_Afalg_Socket(void)
6674
{
6775
int sock;
6876

69-
if ((sock = socket(AF_ALG, SOCK_SEQPACKET, 0)) < 0) {
77+
sock = wc_socket_cloexec(AF_ALG, SOCK_SEQPACKET, 0);
78+
if (sock < 0) {
7079
WOLFSSL_MSG("Failed to get AF_ALG socket");
7180
return WC_AFALG_SOCK_E;
7281
}

wolfcrypt/src/port/caam/wolfcaam_qnx.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434
#include <sys/ioctl.h>
3535
#include <devctl.h>
3636

37-
#include <errno.h>
3837

3938
/* for devctl use */
4039
int caamFd = -1;
@@ -48,7 +47,7 @@ int wc_CAAMInitInterface()
4847
return -1;
4948
}
5049

51-
caamFd = open("/dev/wolfCrypt", O_RDWR);
50+
caamFd = wc_open_cloexec("/dev/wolfCrypt", O_RDWR);
5251
if (caamFd < 0) {
5352
WOLFSSL_MSG("Could not open /dev/wolfCrypt");
5453
return -1;

wolfcrypt/src/port/devcrypto/wc_devcrypto.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,13 @@
2626
static volatile int fd;
2727

2828
#include <wolfssl/wolfcrypt/port/devcrypto/wc_devcrypto.h>
29+
#include <fcntl.h>
2930

3031
int wc_DevCryptoInit(void)
3132
{
3233
/* create descriptor */
33-
if ((fd = open("/dev/crypto", O_RDWR, 0)) < 0) {
34+
fd = wc_open_cloexec("/dev/crypto", O_RDWR);
35+
if (fd < 0) {
3436
WOLFSSL_MSG("Error opening /dev/crypto is cryptodev module loaded?");
3537
return WC_DEVCRYPTO_E;
3638
}

wolfcrypt/src/port/intel/quickassist_mem.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@
5757
#include <fcntl.h>
5858
#include <sys/ioctl.h>
5959
#include <sys/mman.h>
60+
#include <errno.h>
61+
6062

6163
#ifdef SAL_IOMMU_CODE
6264
#include <icp_sal_iommu.h>
@@ -714,7 +716,7 @@ CpaStatus qaeMemInit(void)
714716
{
715717
if (g_qaeMemFd < 0) {
716718
#ifndef QAT_V2
717-
g_qaeMemFd = open(QAE_MEM, O_RDWR);
719+
g_qaeMemFd = wc_open_cloexec(QAE_MEM, O_RDWR);
718720
if (g_qaeMemFd < 0) {
719721
printf("unable to open %s %d\n", QAE_MEM, g_qaeMemFd);
720722
return CPA_STATUS_FAIL;

0 commit comments

Comments
 (0)