Skip to content

Commit 0c9a496

Browse files
Merge pull request #10162 from embhorn/gh9753
Use O_CLOEXEC to avoid race conditions
2 parents a20c391 + 2dc0076 commit 0c9a496

14 files changed

Lines changed: 186 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
@@ -477,7 +480,9 @@ OPENSSL_NO_PK
477480
OS_WINDOWS
478481
OTHERBOARD
479482
OTHER_BOARD
483+
O_CLOEXEC
480484
PEER_INFO
485+
PERF_FLAG_FD_CLOEXEC
481486
PKA_ECC_SCALAR_MUL_IN_B_COEFF
482487
PLATFORMIO
483488
PLUTON_CRYPTO_ECC
@@ -520,6 +525,7 @@ SL_SE_KEY_TYPE_ECC_X25519
520525
SL_SE_KEY_TYPE_ECC_X448
521526
SL_SE_PRF_HMAC_SHA1
522527
SNIFFER_SINGLE_SESSION_CACHE
528+
SOCK_CLOEXEC
523529
SOFTDEVICE_PRESENT
524530
SO_NOSIGPIPE
525531
SO_REUSEPORT
@@ -1124,6 +1130,7 @@ __sun
11241130
__svr4__
11251131
__thumb__
11261132
__ti__
1133+
__unix__
11271134
__x86_64__
11281135
__xtensa__
11291136
byte

src/crl.c

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1678,6 +1678,7 @@ static int SwapLists(WOLFSSL_CRL* crl)
16781678
#include <sys/time.h>
16791679
#include <fcntl.h>
16801680
#include <unistd.h>
1681+
#include <errno.h>
16811682

16821683
#ifdef __MACH__
16831684
#define XEVENT_MODE O_EVTONLY
@@ -1686,6 +1687,7 @@ static int SwapLists(WOLFSSL_CRL* crl)
16861687
#endif
16871688

16881689

1690+
16891691
/* we need a unique kqueue user filter fd for crl in case user is doing custom
16901692
* events too */
16911693
#ifndef CRL_CUSTOM_FD
@@ -1729,6 +1731,7 @@ static THREAD_RETURN WOLFSSL_THREAD DoMonitor(void* arg)
17291731
SignalSetup(crl, MONITOR_SETUP_E);
17301732
return NULL;
17311733
}
1734+
wc_set_cloexec(crl->mfd);
17321735

17331736
/* listen for custom shutdown event */
17341737
EV_SET(&change, CRL_CUSTOM_FD, EVFILT_USER, EV_ADD, 0, 0, NULL);
@@ -1743,7 +1746,7 @@ static THREAD_RETURN WOLFSSL_THREAD DoMonitor(void* arg)
17431746
fDER = -1;
17441747

17451748
if (crl->monitors[0].path) {
1746-
fPEM = open(crl->monitors[0].path, XEVENT_MODE);
1749+
fPEM = wc_open_cloexec(crl->monitors[0].path, XEVENT_MODE);
17471750
if (fPEM == -1) {
17481751
WOLFSSL_MSG("PEM event dir open failed");
17491752
SignalSetup(crl, MONITOR_SETUP_E);
@@ -1753,7 +1756,7 @@ static THREAD_RETURN WOLFSSL_THREAD DoMonitor(void* arg)
17531756
}
17541757

17551758
if (crl->monitors[1].path) {
1756-
fDER = open(crl->monitors[1].path, XEVENT_MODE);
1759+
fDER = wc_open_cloexec(crl->monitors[1].path, XEVENT_MODE);
17571760
if (fDER == -1) {
17581761
WOLFSSL_MSG("DER event dir open failed");
17591762
if (fPEM != -1)
@@ -1820,7 +1823,8 @@ static THREAD_RETURN WOLFSSL_THREAD DoMonitor(void* arg)
18201823
#include <sys/inotify.h>
18211824
#include <sys/eventfd.h>
18221825
#include <unistd.h>
1823-
1826+
#include <fcntl.h>
1827+
#include <errno.h>
18241828

18251829
#ifndef max
18261830
static WC_INLINE int max(int a, int b)
@@ -1855,14 +1859,32 @@ static THREAD_RETURN WOLFSSL_THREAD DoMonitor(void* arg)
18551859

18561860
WOLFSSL_ENTER("DoMonitor");
18571861

1862+
#ifdef EFD_CLOEXEC
1863+
crl->mfd = eventfd(0, EFD_CLOEXEC); /* our custom shutdown event */
1864+
if (crl->mfd < 0 && (errno == ENOSYS || errno == EINVAL)) {
1865+
crl->mfd = eventfd(0, 0);
1866+
wc_set_cloexec(crl->mfd);
1867+
}
1868+
#else
18581869
crl->mfd = eventfd(0, 0); /* our custom shutdown event */
1870+
wc_set_cloexec(crl->mfd);
1871+
#endif
18591872
if (crl->mfd < 0) {
18601873
WOLFSSL_MSG("eventfd failed");
18611874
SignalSetup(crl, MONITOR_SETUP_E);
18621875
return NULL;
18631876
}
18641877

1878+
#ifdef IN_CLOEXEC
1879+
notifyFd = inotify_init1(IN_CLOEXEC);
1880+
if (notifyFd < 0 && (errno == ENOSYS || errno == EINVAL)) {
1881+
notifyFd = inotify_init();
1882+
wc_set_cloexec(notifyFd);
1883+
}
1884+
#else
18651885
notifyFd = inotify_init();
1886+
wc_set_cloexec(notifyFd);
1887+
#endif
18661888
if (notifyFd < 0) {
18671889
WOLFSSL_MSG("inotify failed");
18681890
(void)close(crl->mfd);

src/ssl.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19653,7 +19653,7 @@ int wolfSSL_RAND_egd(const char* nm)
1965319653
return WOLFSSL_FATAL_ERROR;
1965419654
}
1965519655

19656-
fd = socket(AF_UNIX, SOCK_STREAM, 0);
19656+
fd = wc_socket_cloexec(AF_UNIX, SOCK_STREAM, 0);
1965719657
if (fd < 0) {
1965819658
WOLFSSL_MSG("Error creating socket");
1965919659
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 (int)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
@@ -1612,16 +1612,30 @@ static const char* bench_result_words3[][5] = {
16121612
#include <linux/perf_event.h>
16131613
#include <sys/syscall.h>
16141614
#include <unistd.h>
1615+
#include <fcntl.h>
1616+
#include <errno.h>
1617+
1618+
#ifndef PERF_FLAG_FD_CLOEXEC
1619+
#define PERF_FLAG_FD_CLOEXEC (1UL << 3)
1620+
#endif
16151621

16161622
static THREAD_LS_T word64 begin_cycles;
16171623
static THREAD_LS_T word64 total_cycles;
16181624
static THREAD_LS_T int cycles = -1;
16191625
static THREAD_LS_T struct perf_event_attr atr;
16201626

1627+
/* Try with PERF_FLAG_FD_CLOEXEC first; on older kernels (< 3.14) this
1628+
* fails with EINVAL, so fall back to flags=0 and set FD_CLOEXEC via
1629+
* fcntl() as a best-effort. */
16211630
#define INIT_CYCLE_COUNTER do { \
16221631
atr.type = PERF_TYPE_HARDWARE; \
16231632
atr.config = PERF_COUNT_HW_CPU_CYCLES; \
1624-
cycles = (int)syscall(__NR_perf_event_open, &atr, 0, -1, -1, 0); \
1633+
cycles = (int)syscall(__NR_perf_event_open, &atr, 0, -1, -1, \
1634+
PERF_FLAG_FD_CLOEXEC); \
1635+
if (cycles < 0 && errno == EINVAL) { \
1636+
cycles = (int)syscall(__NR_perf_event_open, &atr, 0, -1, -1, 0); \
1637+
wc_set_cloexec(cycles); \
1638+
} \
16251639
} while (0);
16261640

16271641
#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: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,9 @@
3333
#include <fcntl.h>
3434
#include <sys/ioctl.h>
3535
#include <devctl.h>
36-
3736
#include <errno.h>
3837

38+
3939
/* for devctl use */
4040
int caamFd = -1;
4141
static wolfSSL_Mutex caamMutex;
@@ -48,7 +48,7 @@ int wc_CAAMInitInterface()
4848
return -1;
4949
}
5050

51-
caamFd = open("/dev/wolfCrypt", O_RDWR);
51+
caamFd = wc_open_cloexec("/dev/wolfCrypt", O_RDWR);
5252
if (caamFd < 0) {
5353
WOLFSSL_MSG("Could not open /dev/wolfCrypt");
5454
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)