|
- 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 `QueryWrap`s), 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.
PR-URL: https://github.com/nodejs/node/pull/26253
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
|