Skip to content

Commit ab8e0f9

Browse files
authored
[libc] Enable socket entrypoints in overlay mode (llvm#195035)
This is slightly tricky in that many of these functions depend on types (struct sockaddrs, msghdr, ...) and we cannot overlay types. However, this works because these functions are simple syscall wrappers which simply forward the data to the kernel -- so it's really the kernel that's defining these structures. This approach is compatible with libraries which implement these functions the same way, this includes at least glibc (on all architectures) and musl (on 32-bit architectures). 64-bit musl repacks the [c]msghdr structures to zero out padding fields, and overlaying that can lead to subtle bugs. However, I believe that overlaying musl is not a very interesting use case, so I'm leaving that as a TODO. If someone is interested in doing that, they can either exclude these entrypoints from the overlay or implement the musl-compatible repacking code.
1 parent 5a91032 commit ab8e0f9

5 files changed

Lines changed: 68 additions & 55 deletions

File tree

libc/config/linux/aarch64/entrypoints.txt

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -279,9 +279,29 @@ set(TARGET_LIBC_ENTRYPOINTS
279279
libc.src.sys.resource.getrlimit
280280
libc.src.sys.resource.setrlimit
281281

282-
# sys/sendfile entrypoints
282+
# sys/sendfile.h entrypoints
283283
libc.src.sys.sendfile.sendfile
284284

285+
# sys/socket.h entrypoints
286+
libc.src.sys.socket.accept
287+
libc.src.sys.socket.accept4
288+
libc.src.sys.socket.bind
289+
libc.src.sys.socket.connect
290+
libc.src.sys.socket.getsockopt
291+
libc.src.sys.socket.listen
292+
libc.src.sys.socket.recv
293+
libc.src.sys.socket.recvfrom
294+
libc.src.sys.socket.send
295+
libc.src.sys.socket.sendto
296+
libc.src.sys.socket.setsockopt
297+
libc.src.sys.socket.shutdown
298+
libc.src.sys.socket.socket
299+
libc.src.sys.socket.socketpair
300+
# TODO: These functions are not compatible with 64-bit musl. They need to
301+
# be excluded if overlaying musl.
302+
libc.src.sys.socket.recvmsg
303+
libc.src.sys.socket.sendmsg
304+
285305
# sys/stat.h entrypoints
286306
libc.src.sys.stat.chmod
287307
libc.src.sys.stat.fchmod
@@ -1222,17 +1242,6 @@ if(LLVM_LIBC_FULL_BUILD)
12221242

12231243
# sys/select.h entrypoints
12241244
libc.src.sys.select.select
1225-
1226-
# sys/socket.h entrypoints
1227-
libc.src.sys.socket.accept
1228-
libc.src.sys.socket.accept4
1229-
libc.src.sys.socket.bind
1230-
libc.src.sys.socket.connect
1231-
libc.src.sys.socket.getsockopt
1232-
libc.src.sys.socket.listen
1233-
libc.src.sys.socket.setsockopt
1234-
libc.src.sys.socket.shutdown
1235-
libc.src.sys.socket.socket
12361245
)
12371246
endif()
12381247

libc/config/linux/riscv/entrypoints.txt

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -279,9 +279,29 @@ set(TARGET_LIBC_ENTRYPOINTS
279279
libc.src.sys.resource.getrlimit
280280
libc.src.sys.resource.setrlimit
281281

282-
# sys/sendfile entrypoints
282+
# sys/sendfile.h entrypoints
283283
libc.src.sys.sendfile.sendfile
284284

285+
# sys/socket.h entrypoints
286+
libc.src.sys.socket.accept
287+
libc.src.sys.socket.accept4
288+
libc.src.sys.socket.bind
289+
libc.src.sys.socket.connect
290+
libc.src.sys.socket.getsockopt
291+
libc.src.sys.socket.listen
292+
libc.src.sys.socket.recv
293+
libc.src.sys.socket.recvfrom
294+
libc.src.sys.socket.send
295+
libc.src.sys.socket.sendto
296+
libc.src.sys.socket.setsockopt
297+
libc.src.sys.socket.shutdown
298+
libc.src.sys.socket.socket
299+
libc.src.sys.socket.socketpair
300+
# TODO: These functions are not compatible with 64-bit musl. They need to
301+
# be excluded if overlaying musl.
302+
libc.src.sys.socket.recvmsg
303+
libc.src.sys.socket.sendmsg
304+
285305
# sys/stat.h entrypoints
286306
libc.src.sys.stat.chmod
287307
libc.src.sys.stat.fchmod
@@ -1356,24 +1376,6 @@ if(LLVM_LIBC_FULL_BUILD)
13561376

13571377
# sys/select.h entrypoints
13581378
libc.src.sys.select.select
1359-
1360-
# sys/socket.h entrypoints
1361-
libc.src.sys.socket.accept
1362-
libc.src.sys.socket.accept4
1363-
libc.src.sys.socket.bind
1364-
libc.src.sys.socket.connect
1365-
libc.src.sys.socket.getsockopt
1366-
libc.src.sys.socket.listen
1367-
libc.src.sys.socket.setsockopt
1368-
libc.src.sys.socket.shutdown
1369-
libc.src.sys.socket.socket
1370-
libc.src.sys.socket.socketpair
1371-
libc.src.sys.socket.send
1372-
libc.src.sys.socket.sendto
1373-
libc.src.sys.socket.sendmsg
1374-
libc.src.sys.socket.recv
1375-
libc.src.sys.socket.recvfrom
1376-
libc.src.sys.socket.recvmsg
13771379
)
13781380
endif()
13791381

libc/config/linux/x86_64/entrypoints.txt

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -295,9 +295,29 @@ set(TARGET_LIBC_ENTRYPOINTS
295295
libc.src.sys.sem.semctl
296296
libc.src.sys.sem.semop
297297

298-
# sys/sendfile entrypoints
298+
# sys/sendfile.h entrypoints
299299
libc.src.sys.sendfile.sendfile
300300

301+
# sys/socket.h entrypoints
302+
libc.src.sys.socket.accept
303+
libc.src.sys.socket.accept4
304+
libc.src.sys.socket.bind
305+
libc.src.sys.socket.connect
306+
libc.src.sys.socket.getsockopt
307+
libc.src.sys.socket.listen
308+
libc.src.sys.socket.recv
309+
libc.src.sys.socket.recvfrom
310+
libc.src.sys.socket.send
311+
libc.src.sys.socket.sendto
312+
libc.src.sys.socket.setsockopt
313+
libc.src.sys.socket.shutdown
314+
libc.src.sys.socket.socket
315+
libc.src.sys.socket.socketpair
316+
# TODO: These functions are not compatible with 64-bit musl. They need to
317+
# be excluded if overlaying musl.
318+
libc.src.sys.socket.recvmsg
319+
libc.src.sys.socket.sendmsg
320+
301321
# sys/stat.h entrypoints
302322
libc.src.sys.stat.chmod
303323
libc.src.sys.stat.fchmod
@@ -1433,24 +1453,6 @@ if(LLVM_LIBC_FULL_BUILD)
14331453
# sys/select.h entrypoints
14341454
libc.src.sys.select.select
14351455

1436-
# sys/socket.h entrypoints
1437-
libc.src.sys.socket.accept
1438-
libc.src.sys.socket.accept4
1439-
libc.src.sys.socket.socket
1440-
libc.src.sys.socket.bind
1441-
libc.src.sys.socket.connect
1442-
libc.src.sys.socket.getsockopt
1443-
libc.src.sys.socket.listen
1444-
libc.src.sys.socket.shutdown
1445-
libc.src.sys.socket.socketpair
1446-
libc.src.sys.socket.setsockopt
1447-
libc.src.sys.socket.send
1448-
libc.src.sys.socket.sendto
1449-
libc.src.sys.socket.sendmsg
1450-
libc.src.sys.socket.recv
1451-
libc.src.sys.socket.recvfrom
1452-
libc.src.sys.socket.recvmsg
1453-
14541456
# wchar.h entrypoints
14551457
libc.src.wchar.mblen
14561458
libc.src.wchar.mbrlen

libc/test/src/sys/socket/linux/shutdown_test.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ TEST_F(LlvmLibcShutdownTest, ShutWrProducesEOF) {
3232
// Reading from sv[1] should report end-of-file by returning 0.
3333
char read_buf[10];
3434
ASSERT_THAT(LIBC_NAMESPACE::read(sv[1], read_buf, sizeof(read_buf)),
35-
Succeeds(0));
35+
Succeeds<ssize_t>(0));
3636

3737
ASSERT_THAT(LIBC_NAMESPACE::close(sv[0]), Succeeds(0));
3838
ASSERT_THAT(LIBC_NAMESPACE::close(sv[1]), Succeeds(0));
@@ -49,7 +49,7 @@ TEST_F(LlvmLibcShutdownTest, ShutRdPreventsReading) {
4949
// Reading from sv[0] should report end-of-file by returning 0.
5050
char read_buf[10];
5151
ASSERT_THAT(LIBC_NAMESPACE::read(sv[0], read_buf, sizeof(read_buf)),
52-
Succeeds(0));
52+
Succeeds<ssize_t>(0));
5353

5454
ASSERT_THAT(LIBC_NAMESPACE::close(sv[0]), Succeeds(0));
5555
ASSERT_THAT(LIBC_NAMESPACE::close(sv[1]), Succeeds(0));
@@ -66,9 +66,9 @@ TEST_F(LlvmLibcShutdownTest, ShutRdWrDoesBoth) {
6666
// Both descriptors should report end-of-file by returning 0.
6767
char read_buf[10];
6868
ASSERT_THAT(LIBC_NAMESPACE::read(sv[0], read_buf, sizeof(read_buf)),
69-
Succeeds(0));
69+
Succeeds<ssize_t>(0));
7070
ASSERT_THAT(LIBC_NAMESPACE::read(sv[1], read_buf, sizeof(read_buf)),
71-
Succeeds(0));
71+
Succeeds<ssize_t>(0));
7272

7373
ASSERT_THAT(LIBC_NAMESPACE::close(sv[0]), Succeeds(0));
7474
ASSERT_THAT(LIBC_NAMESPACE::close(sv[1]), Succeeds(0));

libc/test/src/sys/socket/linux/socketopt_test.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ TEST_F(LlvmLibcSocketOptTest, BasicSocketOpt) {
4848
ASSERT_THAT(
4949
LIBC_NAMESPACE::getsockopt(sock, SOL_SOCKET, SO_TYPE, &optval, &optlen),
5050
Succeeds(0));
51-
ASSERT_EQ(optval, SOCK_STREAM);
51+
ASSERT_EQ(optval, static_cast<int>(SOCK_STREAM));
5252
ASSERT_EQ(optlen, static_cast<socklen_t>(sizeof(optval)));
5353

5454
optval = SOCK_DGRAM;

0 commit comments

Comments
 (0)