From 39e1352d1c411b26430ebbaeeb86ca8db06eb9fb Mon Sep 17 00:00:00 2001 From: evgeny Date: Sun, 25 Oct 2026 23:56:40 +0100 Subject: [PATCH] Intercept fortified recvfrom in socket monitor fault tests --- tests/Makefile.am | 2 +- tests/test_socket_monitor.c | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/tests/Makefile.am b/tests/Makefile.am index 3b45bed1a..ac2d09481 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -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 diff --git a/tests/test_socket_monitor.c b/tests/test_socket_monitor.c index 3bdaa3e8c..ba890a373 100644 --- a/tests/test_socket_monitor.c +++ b/tests/test_socket_monitor.c @@ -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));