140 Commits

Author SHA1 Message Date
ayuseleznev
6f8e0e97e5 evdns: fix a crash when evdns_base with waiting requests is freed
Fix undefined behaviour and application crash that might take
place in some rare cases after calling evdns_base_free when
there are requests in the waiting queue.

Current cleanup procedure in evdns_base_free_and_unlock
function includes 2 steps:
1. Finish all inflight requests.
2. Finish all waiting requests.
During the first step we iterate over each list in req_heads
structure and finish all requests in these lists. With current
logic finishing an inflight request (function request_finished)
removes it from the inflight requests container and forces
a wating connection to be sent (by calling
evdns_requests_pump_waiting_queue). When these new requests are
sent it is possible that they will be inserted to the list in
req_heads that we've already cleaned.
So in some cases container of the inflight requests is not empty
after this procedure and some requests are not finished and
deleted. When timeouts for these requests expire
evdns_request_timeout_callback is called but corresponding
evdns_base has been already deleted which causes undefined
behaviour and possible applicaton crash.

It is interesting to note that in old versions of libevent such
situation was not possible. This bug was introduced by the commit
14f84bbdc77d90b1d936076661443cdbf516c593. Before this commit
nameservers were deleted before finishing the requests. Therefore
it was not possible that requests from the waiting queue be sent
while we finish the inflight requests.

(cherry picked from commit 4da9f87ccbe71edb3b3aaf74b8b64d7e9c41dcaf)
2020-06-28 21:24:21 +03:00
Azat Khuzhin
ca92a7559e Relax bufferevent_connect_hostname_emfile
Do not do any assumptions on the error for the EMFILE from
getaddrinfo(), expect just any error.

Fixes: #924
(cherry picked from commit 4436287d1247fb2e9c80560debf852a94657e485)
2020-06-28 21:19:42 +03:00
Azat Khuzhin
546a366ca3
evdns: add new options -- so-rcvbuf/so-sndbuf
This will allow to customize SO_RCVBUF/SO_SNDBUF for nameservers in this
evdns_base, you may want to adjust them if the kernel starts dropping
udp packages.

(cherry picked from commit 538141eb7e590bc94c043b43b5e5483b13bc9c5e)
2019-08-02 00:05:49 +03:00
Azat Khuzhin
89932001f2
Disable logging for tests that assume printing warnings
To avoid possible confusion

But there is still one test that has some messages on windows:
  main/methods

Because this test needs >1 of avaiable methods, otherwise it will warn.

(cherry picked from commit 47d348a63130c91f2a6aadef291ff5687275df72)
2019-05-25 21:25:12 +03:00
Azat Khuzhin
58e81106ad
evdns: add DNS_OPTION_NAMESERVERS_NO_DEFAULT/EVDNS_BASE_NAMESERVERS_NO_DEFAULT
- DNS_OPTION_NAMESERVERS_NO_DEFAULT
  Do not "default" nameserver (i.e. "127.0.0.1:53") if there is no nameservers
  in resolv.conf, (iff DNS_OPTION_NAMESERVERS is set)

- EVDNS_BASE_NAMESERVERS_NO_DEFAULT
  If EVDNS_BASE_INITIALIZE_NAMESERVERS isset, do not add default
  nameserver if there are no nameservers in resolv.conf (just set
  DNS_OPTION_NAMESERVERS_NO_DEFAULT internally)

Fixes: #569
(cherry picked from commit e5b8f4c1925867d8e4cd7dc0390e5141d7ef1106)
2019-05-25 21:25:11 +03:00
Azat Khuzhin
e0e5d53b21
test/dns: in solaris under EMFILE devpoll does not dispatch
(cherry picked from commit 3ce38f6d2d74edcacfe17d612c611ae35e97acfc)
2019-02-10 14:34:08 +03:00
Azat Khuzhin
5a26e7bd07
test/dns: in solaris under EMFILE the error is EAI_FAIL
(cherry picked from commit d234902da713cb722596f6bf66bb0dde8a3842dc)
2019-02-03 18:58:41 +03:00
Azat Khuzhin
170debc782
test: adjust expecting error for getaddrinfo() under EMFILE
When getaddrinfo() cannot allocate file descriptor glibc/musl-libc on
linux report EAI_SYSTEM error. But this is not true for freebsd libc [1]
(and hence apple libc [2]), they report EAI_NONAME error instead, so
adjust expectation.

  [1]: https://github.com/freebsd/freebsd/blob/master/lib/libc/net/getaddrinfo.c
  [2]: https://opensource.apple.com/source/Libc/

Refs: #749
Refs: https://github.com/libevent/libevent/issues/749#issuecomment-457838159
(cherry picked from commit 4ffc7116177230ad2b8b94d51bbf89a14dc83687)
2019-02-02 15:18:07 +03:00
Azat Khuzhin
6e759975b5
Merge branch 'regress-dns-fixes'
* regress-dns-fixes:
  Do not rely on getservbyname() for most of the dns regression tests
  Turn off dns/getaddrinfo_race_gotresolve by default
  Fix an error for debug locking in dns/getaddrinfo_race_gotresolve

(cherry picked from commit bd2184d8d42f721fa523d01b9a9250c75fedb855)
2019-02-02 15:17:59 +03:00
Philip Prindeville
d6c293af00
Eliminate compiler warnings (at least for gcc/linux)
Signed-off-by: Philip Prindeville <philipp@redfish-solutions.com>
Closes: #646 # cherry-picked from the PR
(cherry picked from commit be371163027d3988a30620537bf3fcb81fb7f077)
2019-02-02 15:17:58 +03:00
Azat Khuzhin
3237d6972d
Merge branch 'evdns_getaddrinfo-race-fix'
* evdns_getaddrinfo-race-fix:
  evdns: add regress test for getaddrinfo race
  evdns: fix race condition in evdns_getaddrinfo()

Merges: #673
(cherry picked from commit ee12c516cf5766b2c32203dcc20c32b8691a8ebb)
2019-02-02 15:17:58 +03:00
Leo Zhang
780eaac827
test: make regress_dns C89 compatible
Closes: #635 (cherry-picked)
(cherry picked from commit d9ffd2213702bc22c467bd83c230a1a5e97e9e67)
2019-02-02 15:17:57 +03:00
Azat Khuzhin
0d194c4e49
test/dns: install correct RLIMIT_NOFILE in bufferevent_connect_hostname_emfile
Otherwise poll() will fail with EINVAL:
       EINVAL The nfds value exceeds the RLIMIT_NOFILE value.

P.S. and cleanup this test a little, with early-return.

CI: https://travis-ci.org/libevent/libevent/jobs/370350426
(cherry picked from commit d1c8993c3c34030b68ecb6079bd9dce8cb3d3604)
2019-02-02 15:17:56 +03:00
Azat Khuzhin
f3eb294f79
test/dns: verify bufferevent_socket_connect() errorcb invoking if socket() fails
Refs: #600
(cherry picked from commit a3d8f2e09302536c6c0ffc3ccb1fc6f43b51dc4f)
2019-02-02 15:17:56 +03:00
Azat Khuzhin
442c7d947f
test/dns: cleanup test_bufferevent_connect_hostname()
(cherry picked from commit 623ef3ccdc0aafac7ae77a723cbad6d552ff9a01)
2019-02-02 15:17:56 +03:00
Azat Khuzhin
ebd12e6de7
Merge branch 'win32-fixes'
This patchset fixes win32 builds after some previous patches (referenced
in particular commits), and also removes some quirks for win32.

* win32-fixes:
  test: do not return void
  log/win32: fix exporting extern variable
  log-internal: missing extern "C"
  log: remove USE_GLOBAL_FOR_DEBUG_LOGGING
  cmake: Export missing symbols for win32
  cmake: eliminate EVENT_BUILDING_REGRESS_TEST, since we link with shared libs
  test: windows doesn't have WNOWAIT
  cmake: clean not used #defines from event-config.h
  cmake: add <pthread.h> only for non-win32

(cherry picked from commit d84f0205453941235b0e04729098d4329c189bba)
2019-02-02 15:13:49 +03:00
Azat Khuzhin
d6bafbbeb2 test/dns: replace servname since solaris does not have "http"
Yes, by default solaris (solaris10.dev 5.10 Generic_147148-26 i86pc i386 i86pc)
does not have "http" in /etc/services
2017-01-20 02:16:50 +03:00
Azat Khuzhin
0786253115 test/dns: run async resolving after sync one (to avoid timeouts)
If system resolver (sync one) will respond too slow, then we can fail async
request and evdns will retransmit tham again, but evdns server will accept that
failed requets, so we will have not 2 requests but 4.

Reproduced on centos box sometimes.
2017-01-19 20:50:22 +03:00
Azat Khuzhin
d7348bab60 test/dns: regression for empty hostname
Refs: #332
2016-03-25 00:33:43 +03:00
Azat Khuzhin
0b9d43249b test/dns: check exit code of evdns_getaddrinfo()
By some reason all autotools builds failed:
CI: https://travis-ci.org/libevent/libevent/builds/93125954
2015-11-25 17:30:31 +03:00
Azat Khuzhin
4ad348310c test/dns: cover evdns_getaddrinfo() and evdns_base_free() with @fail_requests 2015-11-25 13:09:02 +03:00
Azat Khuzhin
d6c6fb4200 test/dns: cover @fail_requests for evdns_base_free() 2015-11-25 13:09:02 +03:00
Azat Khuzhin
123d372864 test/dns: more graceful coverage of @fail_requests
In case when evdns_base_free() called with @fail_requests, we can potentially
have leaks, but we can avoid them if we will run event loop once again to
trigger defer cbs, so let's do this, instead of magical decrements (and also
this will give an example how to avoid leaks for evdns).
2015-11-25 13:09:01 +03:00
Azat Khuzhin
f55db9856e test/regress_dns: fix compilation warnings (-Wmissing-field-initializers/for)
I don't have an error for loop because gcc5 have --std=gnu11 by default.
We need some options-consistency for all versions/compilers and build systems
to avoid such patches.

Fixes: https://travis-ci.org/libevent/libevent/jobs/84403473
Fixes: https://travis-ci.org/libevent/libevent/builds/84403463
2015-10-09 01:47:44 +03:00
Azat Khuzhin
1e8bfbc6bc tests/regress_dns: cover that randomize-case works case-insensitive
Regression-for: #288
2015-10-09 01:12:12 +03:00
Nick Mathewson
51821e20b2 Merge pull request #207 from azat/avoid-leaking-of-event_debug_map_HT_GROW
Avoid leaking of event_debug_map_HT_GROW
2015-02-04 08:33:42 -05:00
Nick Mathewson
537177d315 New function to get address for nameserver. 2015-02-02 13:57:22 -05:00
Azat Khuzhin
3540a193b5 regress_dns: drop hack for event_debug_map_HT_GROW in leak tests 2015-01-08 04:51:27 +03:00
Azat Khuzhin
3ca9d43d32 evdns: add retry/reissue tests for EVDNS_BASE_DISABLE_WHEN_INACTIVE 2014-09-30 01:39:51 +04:00
Nick Mathewson
89c1a3b7fe Fix several memory leaks in the unit tests.
Also add a comment to buffer.c about why we call
evbuffer_file_segment_free on failure to add the segment.
2014-09-18 12:40:38 -04:00
Nick Mathewson
08c88ea563 use correct tt macro for pointer compare 2014-09-18 11:28:19 -04:00
Nick Mathewson
afce2721c2 Merge pull request #128 from azat/tests-disable-when-inactive-v5
Some tests for EVDNS_BASE_DISABLE_WHEN_INACTIVE flag
2014-09-18 11:25:27 -04:00
Azat Khuzhin
5ca9e97ed0 regress dns: drop alarm() (since windows don't have it) 2014-04-11 18:50:10 +04:00
Azat Khuzhin
fea86a64c5 evdns: add regress test for flag EVDNS_BASE_DISABLE_WHEN_INACTIVE without ns 2014-04-10 01:37:12 +04:00
Azat Khuzhin
ad0493eebf evdns: add regress for EVDNS_BASE_DISABLE_WHEN_INACTIVE base flag 2014-04-10 01:11:03 +04:00
Azat Khuzhin
2fdc5f299f regress_dns: fix leaks in getaddrinfo_async{,_cancel_stress} tests 2014-03-23 15:12:29 +04:00
Nick Mathewson
f314900dfd DNS tests: add a missing check 2013-08-06 19:38:48 -04:00
Nick Mathewson
87cd6f0186 Fix some crash-on-fail cases in DNS regression tests
Found by coverity.
2013-08-06 19:35:56 -04:00
Nick Mathewson
e1766a1b6d Actually use the log facility for reporting evdns problems.
Fixes issue #63.  Also refactors the evdns logging and log backend a
bit, so that it wastes a little less code.
2013-05-29 16:26:50 -04:00
Azat Khuzhin
7e876df71b Fix dns/leak_resume_send_err test.
Because we don't cancel request,
and want our callback to recieve DNS_ERR_SHUTDOWN,
we use deferred callback, and there was
- one extra malloc(),
  @see reply_schedule_callback()
- and one missing free
  @see request_finished() (req->handle->pending_cb = 1)
than we don't need to count in testleak_cleanup()

So just decrement allocated_chunks to 2,
like we already take care about it.
2013-05-13 19:56:00 +00:00
Azat Khuzhin
1cd9ff591d Add tests for evdns_base_resume().
- leak_resume
- leak_cancel_and_resume
- leak_resume_send_err
- leak_cancel_and_resume_send_err
2013-05-13 19:56:00 +00:00
Nick Mathewson
b1b054f064 Make all tests pass under EVENT_DEBUG_MODE=1
The fix was easy: the tests that were failing were those tests that
also enabled debug mode themselves. So, let them know when
EVENT_DEBUG_MODE is on, so they won't do that.
2013-04-26 12:12:08 -04:00
Nick Mathewson
2e6a985003 Merge remote-tracking branch 'github/20_win64_compilation' into 21_win64_compilation
Conflicts:
	event.c
	http.c
	sample/event-read-fifo.c
	test/regress_bufferevent.c
2012-11-01 18:12:07 -04:00
Nick Mathewson
94866c2763 Compile without warnings on mingw64
This is mostly a matter of catching cases where we were still
assuming that evutil_socket_t could be used as an int.
2012-11-01 17:56:06 -04:00
Nick Mathewson
9852107f37 Merge remote-tracking branch 'origin/patches-2.0'
Conflicts:
	buffer.c
	http.c
2012-07-26 10:43:13 -04:00
Nick Mathewson
6355b2a4ca Remove unused variable; spotted by coverity 2012-07-26 10:16:47 -04:00
Nick Mathewson
7ef04e4b48 Merge remote-tracking branch 'origin/patches-2.0'
Conflicts:
	configure.in
	test/regress_buffer.c
	test/regress_dns.c
2012-07-26 10:09:13 -04:00
Nick Mathewson
4f3732d75e Fix various check-after-dereference issues in unit tests: found by coverity 2012-07-26 09:35:43 -04:00
Nick Mathewson
13525c50eb Fix another possible uninitialized read in dns regression tests. Found by coverity. 2012-07-25 16:07:22 -04:00
Nick Mathewson
6fdbf3a2bc Merge remote-tracking branch 'origin/patches-2.0' 2012-07-25 16:06:51 -04:00