Skip to content

dns: refactor QueryWrap lifetime management

  • Prefer RAII-style management over manual resource management.
  • Prefer env->SetImmediate() over a separate uv_async_t.
  • Perform ares_destroy() before possibly tearing down c-ares state.
  • Verify that the number of active queries is non-negative.
  • Let pending callbacks know when their underlying QueryWrap object has been destroyed.

The last item has been a real bug, in that when Workers shut down during currently running DNS queries, they may run into use-after-free situations because:

  1. Shutting the Worker down leads to the cleanup code deleting the QueryWrap objects first; then
  2. deleting the ChannelWrap object (as it has been created before the QueryWraps), whose destructor runs ares_destroy(), which in turn invokes all pending query callbacks with ARES_ECANCELLED,
  3. which lead to use-after-free, as the callback tried to access the deleted QueryWrap object.

The added test verifies that this is no longer an issue.

Checklist
  • make -j4 test (UNIX), or vcbuild test (Windows) passes
  • tests and/or benchmarks are included
  • commit message follows commit guidelines

Merge request reports

Loading