Skip to content

Commit b730887

Browse files
committed
Fixes from review
1 parent 7c68c42 commit b730887

File tree

9 files changed

+201
-8
lines changed

9 files changed

+201
-8
lines changed

src/crl.c

Lines changed: 42 additions & 0 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
@@ -1737,6 +1738,16 @@ static THREAD_RETURN WOLFSSL_THREAD DoMonitor(void* arg)
17371738

17381739
if (crl->monitors[0].path) {
17391740
fPEM = open(crl->monitors[0].path, XEVENT_MODE | O_CLOEXEC);
1741+
#ifdef FD_CLOEXEC
1742+
if (fPEM == -1 && errno == EINVAL) {
1743+
fPEM = open(crl->monitors[0].path, XEVENT_MODE);
1744+
if (fPEM >= 0) {
1745+
int fdFlags = fcntl(fPEM, F_GETFD);
1746+
if (fdFlags >= 0)
1747+
(void)fcntl(fPEM, F_SETFD, fdFlags | FD_CLOEXEC);
1748+
}
1749+
}
1750+
#endif
17401751
if (fPEM == -1) {
17411752
WOLFSSL_MSG("PEM event dir open failed");
17421753
SignalSetup(crl, MONITOR_SETUP_E);
@@ -1747,6 +1758,16 @@ static THREAD_RETURN WOLFSSL_THREAD DoMonitor(void* arg)
17471758

17481759
if (crl->monitors[1].path) {
17491760
fDER = open(crl->monitors[1].path, XEVENT_MODE | O_CLOEXEC);
1761+
#ifdef FD_CLOEXEC
1762+
if (fDER == -1 && errno == EINVAL) {
1763+
fDER = open(crl->monitors[1].path, XEVENT_MODE);
1764+
if (fDER >= 0) {
1765+
int fdFlags = fcntl(fDER, F_GETFD);
1766+
if (fdFlags >= 0)
1767+
(void)fcntl(fDER, F_SETFD, fdFlags | FD_CLOEXEC);
1768+
}
1769+
}
1770+
#endif
17501771
if (fDER == -1) {
17511772
WOLFSSL_MSG("DER event dir open failed");
17521773
if (fPEM != -1)
@@ -1814,6 +1835,7 @@ static THREAD_RETURN WOLFSSL_THREAD DoMonitor(void* arg)
18141835
#include <sys/eventfd.h>
18151836
#include <unistd.h>
18161837
#include <fcntl.h>
1838+
#include <errno.h>
18171839

18181840
/* Fall back to no-op if EFD_CLOEXEC is unavailable. */
18191841
#ifndef EFD_CLOEXEC
@@ -1855,6 +1877,16 @@ static THREAD_RETURN WOLFSSL_THREAD DoMonitor(void* arg)
18551877
WOLFSSL_ENTER("DoMonitor");
18561878

18571879
crl->mfd = eventfd(0, EFD_CLOEXEC); /* our custom shutdown event */
1880+
#ifdef FD_CLOEXEC
1881+
if (crl->mfd < 0 && errno == EINVAL) {
1882+
crl->mfd = eventfd(0, 0);
1883+
if (crl->mfd >= 0) {
1884+
int fdFlags = fcntl(crl->mfd, F_GETFD);
1885+
if (fdFlags >= 0)
1886+
(void)fcntl(crl->mfd, F_SETFD, fdFlags | FD_CLOEXEC);
1887+
}
1888+
}
1889+
#endif
18581890
if (crl->mfd < 0) {
18591891
WOLFSSL_MSG("eventfd failed");
18601892
SignalSetup(crl, MONITOR_SETUP_E);
@@ -1863,6 +1895,16 @@ static THREAD_RETURN WOLFSSL_THREAD DoMonitor(void* arg)
18631895

18641896
#ifdef IN_CLOEXEC
18651897
notifyFd = inotify_init1(IN_CLOEXEC);
1898+
if (notifyFd < 0 && (errno == ENOSYS || errno == EINVAL)) {
1899+
notifyFd = inotify_init();
1900+
#ifdef FD_CLOEXEC
1901+
if (notifyFd >= 0) {
1902+
int fdFlags = fcntl(notifyFd, F_GETFD);
1903+
if (fdFlags >= 0)
1904+
(void)fcntl(notifyFd, F_SETFD, fdFlags | FD_CLOEXEC);
1905+
}
1906+
#endif
1907+
}
18661908
#else
18671909
notifyFd = inotify_init();
18681910
#ifdef FD_CLOEXEC

src/ssl.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19605,6 +19605,16 @@ int wolfSSL_RAND_egd(const char* nm)
1960519605
}
1960619606

1960719607
fd = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
19608+
#ifdef FD_CLOEXEC
19609+
if (fd < 0 && errno == EINVAL) {
19610+
fd = socket(AF_UNIX, SOCK_STREAM, 0);
19611+
if (fd >= 0) {
19612+
int fdFlags = fcntl(fd, F_GETFD);
19613+
if (fdFlags >= 0)
19614+
(void)fcntl(fd, F_SETFD, fdFlags | FD_CLOEXEC);
19615+
}
19616+
}
19617+
#endif
1960819618
if (fd < 0) {
1960919619
WOLFSSL_MSG("Error creating socket");
1961019620
WC_FREE_VAR_EX(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);

src/wolfio.c

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1510,6 +1510,16 @@ int wolfIO_TcpConnect(SOCKET_T* sockfd, const char* ip, word16 port, int to_sec)
15101510
#endif
15111511

15121512
*sockfd = (SOCKET_T)socket(addr.ss_family, SOCK_STREAM | SOCK_CLOEXEC, 0);
1513+
#if !defined(USE_WINDOWS_API) && defined(FD_CLOEXEC)
1514+
if (*sockfd <= SOCKET_INVALID && errno == EINVAL) {
1515+
*sockfd = (SOCKET_T)socket(addr.ss_family, SOCK_STREAM, 0);
1516+
if (*sockfd > SOCKET_INVALID) {
1517+
int fdFlags = fcntl(*sockfd, F_GETFD);
1518+
if (fdFlags >= 0)
1519+
(void)fcntl(*sockfd, F_SETFD, fdFlags | FD_CLOEXEC);
1520+
}
1521+
}
1522+
#endif
15131523
#ifdef USE_WINDOWS_API
15141524
if (*sockfd == SOCKET_INVALID)
15151525
#else
@@ -1588,11 +1598,31 @@ int wolfIO_TcpBind(SOCKET_T* sockfd, word16 port)
15881598
sin->sin6_addr = in6addr_any;
15891599
sin->sin6_port = XHTONS(port);
15901600
*sockfd = (SOCKET_T)socket(AF_INET6, SOCK_STREAM | SOCK_CLOEXEC, 0);
1601+
#if defined(FD_CLOEXEC)
1602+
if (*sockfd <= SOCKET_INVALID && errno == EINVAL) {
1603+
*sockfd = (SOCKET_T)socket(AF_INET6, SOCK_STREAM, 0);
1604+
if (*sockfd > SOCKET_INVALID) {
1605+
int fdFlags = fcntl(*sockfd, F_GETFD);
1606+
if (fdFlags >= 0)
1607+
(void)fcntl(*sockfd, F_SETFD, fdFlags | FD_CLOEXEC);
1608+
}
1609+
}
1610+
#endif
15911611
#else
15921612
sin->sin_family = AF_INET;
15931613
sin->sin_addr.s_addr = INADDR_ANY;
15941614
sin->sin_port = XHTONS(port);
15951615
*sockfd = (SOCKET_T)socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, 0);
1616+
#if defined(FD_CLOEXEC)
1617+
if (*sockfd <= SOCKET_INVALID && errno == EINVAL) {
1618+
*sockfd = (SOCKET_T)socket(AF_INET, SOCK_STREAM, 0);
1619+
if (*sockfd > SOCKET_INVALID) {
1620+
int fdFlags = fcntl(*sockfd, F_GETFD);
1621+
if (fdFlags >= 0)
1622+
(void)fcntl(*sockfd, F_SETFD, fdFlags | FD_CLOEXEC);
1623+
}
1624+
}
1625+
#endif
15961626
#endif
15971627

15981628
#ifdef USE_WINDOWS_API
@@ -1642,6 +1672,16 @@ int wolfIO_TcpAccept(SOCKET_T sockfd, SOCKADDR* peer_addr, XSOCKLENT* peer_len)
16421672
#if !defined(USE_WINDOWS_API) && !defined(WOLFSSL_ZEPHYR) && \
16431673
(defined(__linux__) || defined(__ANDROID__))
16441674
fd = (int)accept4(sockfd, peer_addr, peer_len, SOCK_CLOEXEC);
1675+
if (fd < 0 && (errno == ENOSYS || errno == EINVAL)) {
1676+
fd = (int)accept(sockfd, peer_addr, peer_len);
1677+
#ifdef FD_CLOEXEC
1678+
if (fd >= 0) {
1679+
int fdFlags = fcntl(fd, F_GETFD);
1680+
if (fdFlags >= 0)
1681+
(void)fcntl(fd, F_SETFD, fdFlags | FD_CLOEXEC);
1682+
}
1683+
#endif
1684+
}
16451685
#else
16461686
fd = (int)accept(sockfd, peer_addr, peer_len);
16471687
#if defined(FD_CLOEXEC) && !defined(USE_WINDOWS_API)

wolfcrypt/benchmark/benchmark.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1575,6 +1575,7 @@ static const char* bench_result_words3[][5] = {
15751575
#include <sys/syscall.h>
15761576
#include <unistd.h>
15771577
#include <fcntl.h>
1578+
#include <errno.h>
15781579

15791580
#ifndef PERF_FLAG_FD_CLOEXEC
15801581
#define PERF_FLAG_FD_CLOEXEC (1UL << 3)

wolfcrypt/src/port/af_alg/afalg_hash.c

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030

3131
#include <wolfssl/wolfcrypt/port/af_alg/wc_afalg.h>
3232
#include <wolfssl/wolfcrypt/port/af_alg/afalg_hash.h>
33+
#include <errno.h>
34+
#include <fcntl.h>
3335

3436
static const char WC_TYPE_HASH[] = "hash";
3537

@@ -229,7 +231,27 @@ static int AfalgHashCopy(wolfssl_AFALG_Hash* src, wolfssl_AFALG_Hash* dst)
229231

230232
#if defined(__linux__) && defined(SOCK_CLOEXEC)
231233
dst->rdFd = accept4(src->rdFd, NULL, NULL, SOCK_CLOEXEC);
234+
if (dst->rdFd < 0 && (errno == ENOSYS || errno == EINVAL)) {
235+
dst->rdFd = accept(src->rdFd, NULL, NULL);
236+
#ifdef FD_CLOEXEC
237+
if (dst->rdFd >= 0) {
238+
int fdFlags = fcntl(dst->rdFd, F_GETFD);
239+
if (fdFlags >= 0)
240+
(void)fcntl(dst->rdFd, F_SETFD, fdFlags | FD_CLOEXEC);
241+
}
242+
#endif
243+
}
232244
dst->alFd = accept4(src->alFd, NULL, NULL, SOCK_CLOEXEC);
245+
if (dst->alFd < 0 && (errno == ENOSYS || errno == EINVAL)) {
246+
dst->alFd = accept(src->alFd, NULL, NULL);
247+
#ifdef FD_CLOEXEC
248+
if (dst->alFd >= 0) {
249+
int fdFlags = fcntl(dst->alFd, F_GETFD);
250+
if (fdFlags >= 0)
251+
(void)fcntl(dst->alFd, F_SETFD, fdFlags | FD_CLOEXEC);
252+
}
253+
#endif
254+
}
233255
#else
234256
dst->rdFd = accept(src->rdFd, NULL, NULL);
235257
dst->alFd = accept(src->alFd, NULL, NULL);

wolfcrypt/src/port/af_alg/wc_afalg.c

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030
#include <wolfssl/wolfcrypt/port/af_alg/wc_afalg.h>
3131
#include <linux/if_alg.h>
3232
#include <sys/socket.h>
33+
#include <errno.h>
34+
#include <fcntl.h>
3335

3436
#ifndef SOCK_CLOEXEC
3537
#define SOCK_CLOEXEC 0
@@ -66,7 +68,20 @@ int wc_Afalg_Accept(struct sockaddr_alg* in, int inSz, int sock)
6668
}
6769

6870
#if defined(__linux__)
69-
return accept4(sock, NULL, NULL, SOCK_CLOEXEC);
71+
{
72+
int fd = accept4(sock, NULL, NULL, SOCK_CLOEXEC);
73+
if (fd < 0 && (errno == ENOSYS || errno == EINVAL)) {
74+
fd = accept(sock, NULL, NULL);
75+
#ifdef FD_CLOEXEC
76+
if (fd >= 0) {
77+
int fdFlags = fcntl(fd, F_GETFD);
78+
if (fdFlags >= 0)
79+
(void)fcntl(fd, F_SETFD, fdFlags | FD_CLOEXEC);
80+
}
81+
#endif
82+
}
83+
return fd;
84+
}
7085
#else
7186
return accept(sock, NULL, NULL);
7287
#endif
@@ -79,7 +94,18 @@ int wc_Afalg_Socket(void)
7994
{
8095
int sock;
8196

82-
if ((sock = socket(AF_ALG, SOCK_SEQPACKET | SOCK_CLOEXEC, 0)) < 0) {
97+
sock = socket(AF_ALG, SOCK_SEQPACKET | SOCK_CLOEXEC, 0);
98+
#ifdef FD_CLOEXEC
99+
if (sock < 0 && errno == EINVAL) {
100+
sock = socket(AF_ALG, SOCK_SEQPACKET, 0);
101+
if (sock >= 0) {
102+
int fdFlags = fcntl(sock, F_GETFD);
103+
if (fdFlags >= 0)
104+
(void)fcntl(sock, F_SETFD, fdFlags | FD_CLOEXEC);
105+
}
106+
}
107+
#endif
108+
if (sock < 0) {
83109
WOLFSSL_MSG("Failed to get AF_ALG socket");
84110
return WC_AFALG_SOCK_E;
85111
}

wolfcrypt/src/port/devcrypto/wc_devcrypto.c

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

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

3031
#ifndef O_CLOEXEC
3132
#define O_CLOEXEC 0
@@ -34,7 +35,18 @@ static volatile int fd;
3435
int wc_DevCryptoInit(void)
3536
{
3637
/* create descriptor */
37-
if ((fd = open("/dev/crypto", O_RDWR | O_CLOEXEC, 0)) < 0) {
38+
fd = open("/dev/crypto", O_RDWR | O_CLOEXEC, 0);
39+
#ifdef FD_CLOEXEC
40+
if (fd < 0 && errno == EINVAL) {
41+
fd = open("/dev/crypto", O_RDWR, 0);
42+
if (fd >= 0) {
43+
int fdFlags = fcntl(fd, F_GETFD);
44+
if (fdFlags >= 0)
45+
(void)fcntl(fd, F_SETFD, fdFlags | FD_CLOEXEC);
46+
}
47+
}
48+
#endif
49+
if (fd < 0) {
3850
WOLFSSL_MSG("Error opening /dev/crypto is cryptodev module loaded?");
3951
return WC_DEVCRYPTO_E;
4052
}

wolfcrypt/src/port/intel/quickassist_mem.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
#include <fcntl.h>
5858
#include <sys/ioctl.h>
5959
#include <sys/mman.h>
60+
#include <errno.h>
6061

6162
#ifndef O_CLOEXEC
6263
#define O_CLOEXEC 0
@@ -719,6 +720,16 @@ CpaStatus qaeMemInit(void)
719720
if (g_qaeMemFd < 0) {
720721
#ifndef QAT_V2
721722
g_qaeMemFd = open(QAE_MEM, O_RDWR | O_CLOEXEC);
723+
#ifdef FD_CLOEXEC
724+
if (g_qaeMemFd < 0 && errno == EINVAL) {
725+
g_qaeMemFd = open(QAE_MEM, O_RDWR);
726+
if (g_qaeMemFd >= 0) {
727+
int fdFlags = fcntl(g_qaeMemFd, F_GETFD);
728+
if (fdFlags >= 0)
729+
(void)fcntl(g_qaeMemFd, F_SETFD, fdFlags | FD_CLOEXEC);
730+
}
731+
}
732+
#endif
722733
if (g_qaeMemFd < 0) {
723734
printf("unable to open %s %d\n", QAE_MEM, g_qaeMemFd);
724735
return CPA_STATUS_FAIL;

0 commit comments

Comments
 (0)