Make sure we free @ra in in icmp6_client_read_handler even when icmp6_client_handle_message returns -ECANCELED. Fixes this: ==1088== 1,176 bytes in 9 blocks are definitely lost in loss record 28 of 29 ==1088== at 0x4843839: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) ==1088== by 0x4808A1: l_malloc (util.c:62) ==1088== by 0x4C0966: icmp6_client_read_handler (icmp6.c:659) ==1088== by 0x4877AF: io_callback (io.c:120) ==1088== by 0x48693C: l_main_iterate (main.c:478) ==1088== by 0x486A0B: l_main_run (main.c:525) ==1088== by 0x486A0B: l_main_run (main.c:507) ==1088== by 0x486C3F: l_main_run_with_signal (main.c:647) ==1088== by 0x404755: main (main.c:532) --- ell/icmp6.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/ell/icmp6.c b/ell/icmp6.c index 6b1652c..87e46d1 100644 --- a/ell/icmp6.c +++ b/ell/icmp6.c @@ -401,9 +401,7 @@ static bool icmp6_client_read_handler(struct l_io *io, void *userdata) } r = icmp6_client_handle_message(client, ra, l, &src); - if (r == -ECANCELED) - return true; - else if (r < 0) + if (r < 0) goto done; /* Stop solicitations */ -- 2.32.0