[9.20] fix: dev: Ensure file descriptors 0-2 are in use

libuv expect file descriptors <= STDERR_FILENO are in use. otherwise,
it may abort when closing a file descriptor it opened.

Closes #5226

Backport of MR !10582

Merge branch 'backport-main-9.20' into 'bind-9.20'

See merge request isc-projects/bind9!10908
This commit is contained in:
Ondřej Surý 2025-08-28 12:46:16 +02:00
commit 35dee6eb90
3 changed files with 57 additions and 0 deletions

View file

@ -0,0 +1,24 @@
#!/usr/sh
# Copyright (C) Internet Systems Consortium, Inc. ("ISC")
#
# SPDX-License-Identifier: MPL-2.0
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, you can obtain one at https://mozilla.org/MPL/2.0/.
#
# See the COPYRIGHT file distributed with this work for additional
# information regarding copyright ownership.
set -e
. ../conf.sh
echo_i "tools must not crash if stdio is closed"
"$NSUPDATE" 0>&-
"$NSUPDATE" 0>&- 1>&-
"$NSUPDATE" 0>&- 1>&- 2>&-
"$NSUPDATE" 0>&- 2>&-
"$NSUPDATE" 1>&-
"$NSUPDATE" 1>&- 2>&-
"$NSUPDATE" 2>&-

View file

@ -0,0 +1,18 @@
# Copyright (C) Internet Systems Consortium, Inc. ("ISC")
#
# SPDX-License-Identifier: MPL-2.0
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, you can obtain one at https://mozilla.org/MPL/2.0/.
#
# See the COPYRIGHT file distributed with this work for additional
# information regarding copyright ownership.
import pytest
pytestmark = pytest.mark.extra_artifacts([])
def test_tools(run_tests_sh):
run_tests_sh()

View file

@ -130,6 +130,21 @@ isc__uv_free(void *ptr) {
void
isc__uv_initialize(void) {
/*
* Ensure the first 3 file descriptors are open
* otherwise, libuv may use one and trigger abort
* when closing it.
*
* See https://github.com/libuv/libuv/pull/4559
*/
do {
int fd = open("/dev/null", O_RDWR, 0);
RUNTIME_CHECK(fd >= 0);
if (fd > STDERR_FILENO) {
close(fd);
break;
}
} while (true);
#if UV_VERSION_HEX >= UV_VERSION(1, 38, 0)
int r;
isc_mem_create(&isc__uv_mctx);