*** buffer overflow detected ***: terminated points to ares_fds
Brad House
brad at brad-house.com
Mon Jan 3 22:26:03 CET 2022
Is it possible you've destroyed the ares_channel when this is called? I
haven't had a chance to look at your code.
Also, have you tried to run this through ASAN or Valgrind?
On 1/3/22 4:07 PM, James Read via c-ares wrote:
> Hi,
>
> I have joined this mailing list because I have a difficult bug which
> seems to relate to a c-ares function call.
>
> The program I am developing reads lines from a file which is a list of
> domain names. It performs asynchronous dns and then downloads the
> landing pages with an epoll based event loop. The program runs well
> for thousands of iterations and then bombs out with a *** buffer
> overflow detected ***: terminated error. The following backtrace
> points the finger of blame at a call to ares_fd:
>
> Program received signal SIGABRT, Aborted.
> __pthread_kill_implementation (no_tid=0, signo=6,
> threadid=140737351407424) at pthread_kill.c:44
> 44 pthread_kill.c: No such file or directory.
> (gdb) bt
> #0 __pthread_kill_implementation (no_tid=0, signo=6,
> threadid=140737351407424) at pthread_kill.c:44
> #1 __pthread_kill_internal (signo=6, threadid=140737351407424) at
> pthread_kill.c:80
> #2 __GI___pthread_kill (threadid=140737351407424,
> signo=signo at entry=6) at pthread_kill.c:91
> #3 0x00007ffff7dae476 in __GI_raise (sig=sig at entry=6) at
> ../sysdeps/posix/raise.c:26
> #4 0x00007ffff7d947b7 in __GI_abort () at abort.c:79
> #5 0x00007ffff7df55e6 in __libc_message
> (action=action at entry=do_abort, fmt=fmt at entry=0x7ffff7f46ef4 "*** %s
> ***: terminated\n") at ../sysdeps/posix/libc_fatal.c:155
> #6 0x00007ffff7ea122a in __GI___fortify_fail
> (msg=msg at entry=0x7ffff7f46e9a "buffer overflow detected") at
> fortify_fail.c:26
> #7 0x00007ffff7e9fb46 in __GI___chk_fail () at chk_fail.c:28
> #8 0x00007ffff7ea116b in __fdelt_chk (d=<optimised out>) at
> fdelt_chk.c:25
> #9 0x00007ffff7f9699a in ares_fds () from /usr/local/lib/libcares.so.2
> #10 0x000055555555682d in wait_ares (channel=0x555556bb32a0) at
> epoll_recv_with_async_dns.c:80
> #11 0x000055555555772e in main (argc=2, argv=0x7fffffffe0a8) at
> epoll_recv_with_async_dns.c:299
>
> The offending line of code is:
>
> nfds = ares_fds(channel, &read_fds, &write_fds);
>
> I don't understand how this is a buffer overflow as the function call
> only uses locally initialised variables. Here is the full function:
>
> static void wait_ares(ares_channel channel)
> {
> struct timeval *tvp, tv;
> fd_set read_fds, write_fds;
> int nfds;
>
> FD_ZERO(&read_fds);
> FD_ZERO(&write_fds);
> nfds = ares_fds(channel, &read_fds, &write_fds);
>
> if (nfds > 0) {
> tvp = ares_timeout(channel, NULL, &tv);
> select(nfds, &read_fds, &write_fds, NULL, tvp);
> ares_process(channel, &read_fds, &write_fds);
> }
> }
>
> Just in case I haven't provided enough information a full code listing
> can be downloaded from
> https://github.com/JamesRead5737/epoll-and-c-ares-crawler
>
More information about the c-ares
mailing list