diff --git a/Makefile b/Makefile index ff21459..57b2544 100644 --- a/Makefile +++ b/Makefile @@ -128,7 +128,7 @@ qrap: $(QRAP_SRCS) passt.h valgrind: EXTRA_SYSCALLS += rt_sigprocmask rt_sigtimedwait rt_sigaction \ getpid gettid kill clock_gettime mmap \ munmap open unlink gettimeofday futex -valgrind: FLAGS:=-g -O0 $(filter-out -O%,$(FLAGS)) +valgrind: FLAGS:=-g -O0 $(filter-out -O%,$(FLAGS)) -DVALGRIND valgrind: all .PHONY: clean diff --git a/tcp.c b/tcp.c index a0e577d..40e3dec 100644 --- a/tcp.c +++ b/tcp.c @@ -2097,6 +2097,15 @@ static void tcp_conn_from_tap(struct ctx *c, * * Return: 0 on success, negative error code from recv() on failure */ +#ifdef VALGRIND +/* valgrind doesn't realise that passing a NULL buffer to recv() is ok if using + * MSG_TRUNC. We have a suppression for this in the tests, but it relies on + * valgrind being able to see the tcp_sock_consume() stack frame, which it won't + * if this gets inlined. This has a single caller making it a likely inlining + * candidate, and certain compiler versions will do so even at -O0. + */ + __attribute__((noinline)) +#endif /* VALGRIND */ static int tcp_sock_consume(const struct tcp_tap_conn *conn, uint32_t ack_seq) { /* Simply ignore out-of-order ACKs: we already consumed the data we diff --git a/test/valgrind.supp b/test/valgrind.supp index 1228056..a158394 100644 --- a/test/valgrind.supp +++ b/test/valgrind.supp @@ -3,7 +3,6 @@ passt_recv_MSG_TRUNC_into_NULL_buffer Memcheck:Param socketcall.recvfrom(buf) - fun:recv ... - fun:tcp_sock_consume* + fun:tcp_sock_consume }