mirror of
https://github.com/isc-projects/bind9.git
synced 2026-05-28 04:34:54 -04:00
Fix nsupdate hang when processing a large update
The root cause is the fix for CVE-2024-0760 (part 3), which resets the TCP connection on a failed send. Specifically commit4b7c6138stops reading on the socket because the TCP connection is throttling. When the tcpdns_send_cb callback thinks about restarting reading on the socket, this fails because the socket is a client socket. And nsupdate is a client and is using the same netmgr code. This commit removes the requirement that the socket must be a server socket, allowing reading on the socket again after being throttled. (manually picked from commitaa24b77d8b)
This commit is contained in:
parent
7068d0698f
commit
90fbe91997
2 changed files with 22 additions and 11 deletions
|
|
@ -1269,12 +1269,18 @@ isc__nm_async_tcpdnssend(isc__networker_t *worker, isc__netievent_t *ev0) {
|
|||
goto fail;
|
||||
}
|
||||
|
||||
if (!sock->client && sock->reading) {
|
||||
sock->reading_throttled = true;
|
||||
isc__nm_stop_reading(sock);
|
||||
}
|
||||
|
||||
isc_log_write(isc_lctx, ISC_LOGCATEGORY_GENERAL, ISC_LOGMODULE_NETMGR,
|
||||
ISC_LOG_DEBUG(3),
|
||||
"throttling TCP connection, the other side is not "
|
||||
"reading the data, switching to uv_write()");
|
||||
sock->reading_throttled = true;
|
||||
isc__nm_stop_reading(sock);
|
||||
"%sthe other side is not "
|
||||
"reading the data, switching to uv_write()",
|
||||
!sock->client && sock->reading
|
||||
? "throttling TCP connection, "
|
||||
: "");
|
||||
|
||||
r = uv_write(&uvreq->uv_req.write, &sock->uv_handle.stream, bufs, nbufs,
|
||||
tcpdns_send_cb);
|
||||
|
|
|
|||
|
|
@ -1377,13 +1377,18 @@ tls_cycle_output(isc_nmsocket_t *sock) {
|
|||
break;
|
||||
}
|
||||
|
||||
isc_log_write(
|
||||
isc_lctx, ISC_LOGCATEGORY_GENERAL, ISC_LOGMODULE_NETMGR,
|
||||
ISC_LOG_DEBUG(3),
|
||||
"throttling TCP connection, the other side is not "
|
||||
"reading the data, switching to uv_write()");
|
||||
sock->reading_throttled = true;
|
||||
isc__nm_stop_reading(sock);
|
||||
if (!sock->client && sock->reading) {
|
||||
sock->reading_throttled = true;
|
||||
isc__nm_stop_reading(sock);
|
||||
}
|
||||
|
||||
isc_log_write(isc_lctx, ISC_LOGCATEGORY_GENERAL,
|
||||
ISC_LOGMODULE_NETMGR, ISC_LOG_DEBUG(3),
|
||||
"%sthe other side is not "
|
||||
"reading the data, switching to uv_write()",
|
||||
!sock->client && sock->reading
|
||||
? "throttling TCP connection, "
|
||||
: "");
|
||||
|
||||
r = uv_write(&req->uv_req.write, &sock->uv_handle.stream,
|
||||
&req->uvbuf, 1, tls_write_cb);
|
||||
|
|
|
|||
Loading…
Reference in a new issue