diff --git a/CMakeLists.txt b/CMakeLists.txt index 5f397383f6..ea34c78fd0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -897,6 +897,7 @@ set(BASIC_TESTS munmap_discontinuous nanosleep netfilter + netlink_mmap_disable no_mask_timeslice nscd numa diff --git a/src/record_syscall.cc b/src/record_syscall.cc index de288ff46e..c04e635a4e 100644 --- a/src/record_syscall.cc +++ b/src/record_syscall.cc @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -914,6 +915,14 @@ static bool block_sock_opt(int level, int optname, return true; } break; + case SOL_NETLINK: + switch (optname) { + case NETLINK_RX_RING: + case NETLINK_TX_RING: + syscall_state.emulate_result(-ENOPROTOOPT); + return true; + } + break; } return false; } diff --git a/src/test/netlink_mmap_disable.c b/src/test/netlink_mmap_disable.c new file mode 100644 index 0000000000..51118e2e6e --- /dev/null +++ b/src/test/netlink_mmap_disable.c @@ -0,0 +1,29 @@ +/* -*- Mode: C; tab-width: 8; c-basic-offset: 2; indent-tabs-mode: nil; -*- */ + +#include "util.h" + +int main(void) { + int sock = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE); + int ret; + unsigned int block_size = 16 * getpagesize(); + struct nl_mmap_req req = { + .nm_block_size = block_size, + .nm_block_nr = 64, + .nm_frame_size = 16384, + .nm_frame_nr = 64 * block_size / 16384, + }; + + if (sock < 0) { + atomic_puts("Can't create netlink socket"); + atomic_puts("EXIT-SUCCESS"); + return 0; + } + + ret = setsockopt(sock, SOL_NETLINK, NETLINK_RX_RING, &req, sizeof(req)); + test_assert(ret < 0 && errno == ENOPROTOOPT); + ret = setsockopt(sock, SOL_NETLINK, NETLINK_TX_RING, &req, sizeof(req)); + test_assert(ret < 0 && errno == ENOPROTOOPT); + + atomic_puts("EXIT-SUCCESS"); + return 0; +} diff --git a/src/test/util.h b/src/test/util.h index 4387a478b4..632996363a 100644 --- a/src/test/util.h +++ b/src/test/util.h @@ -38,6 +38,7 @@ #include #include #include +#include #include #include #include