Intercept fortified recvfrom in socket monitor fault tests

This commit is contained in:
evgeny committed 2026-10-25 23:56:40 +01:00
1 parent a4b2d937aa
commit 39e1352d1c
2 files changed
+7 -1

No files matched your search

+1 -1
View File
@@ -284,7 +284,7 @@ test_socket_monitor_LDFLAGS = -Wl,--wrap=socket -Wl,--wrap=bind -Wl,--wrap=close
-Wl,--wrap=get_interface_ip_by_index -Wl,--wrap=get_interface_ipv6_addr_nl \
-Wl,--wrap=get_default_route_netif_index -Wl,--wrap=get_outgoing_local_ip -Wl,--wrap=etcp_socket_cbk_fire
if OS_LINUX
test_socket_monitor_LDFLAGS += -Wl,--wrap=recvfrom
test_socket_monitor_LDFLAGS += -Wl,--wrap=recvfrom -Wl,--wrap=__recvfrom_chk
else
test_socket_monitor_LDFLAGS += -Wl,--wrap=read
endif
+6
View File
@@ -123,6 +123,12 @@ ssize_t __wrap_recvfrom(int fd, void* out, size_t cap, int flags, struct sockadd
memset(address, 0, sizeof(struct sockaddr_nl)); *address_size = sizeof(struct sockaddr_nl);
size_t len = event_length; memcpy(out, event, len); event_length = 0; return (ssize_t)len;
}
/* При -Og glibc FORTIFY оставляет checked-вызов вместо прямого recvfrom. */
ssize_t __wrap___recvfrom_chk(int fd, void* out, size_t cap, size_t object_size, int flags,
struct sockaddr* address, socklen_t* address_size) {
assert(cap <= object_size);
return __wrap_recvfrom(fd, out, cap, flags, address, address_size);
}
static void fire_event(int status, unsigned index) {
struct nlmsghdr* header = (struct nlmsghdr*)event;
memset(event, 0, sizeof(event));