From add7cd364008128515e0b46f0cc95f7fe0fdd0db Mon Sep 17 00:00:00 2001 From: Thomas Abraham Date: Mon, 30 Jun 2025 14:03:56 -0400 Subject: [PATCH 1/2] ensure file descriptors 0-2 are in use before using libuv libuv expects file descriptors <= STDERR_FILENO are in use. otherwise, it may abort when closing a file descriptor it opened. See https://github.com/libuv/libuv/pull/4559 Closes #5226 (cherry picked from commit 5cfdbeba72092e3e5f48f4b071084585efc5219f) --- lib/isc/uv.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/lib/isc/uv.c b/lib/isc/uv.c index 7ad878cf7f..a7e1a727b2 100644 --- a/lib/isc/uv.c +++ b/lib/isc/uv.c @@ -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); From 917e91b84e25e8e9cbf196f9eda2d527b417f042 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20=C5=A0pa=C4=8Dek?= Date: Tue, 1 Jul 2025 11:12:15 +0200 Subject: [PATCH 2/2] Test command line tools without stdio fds Testing all combinations seems unnecessary but is cheap. I was too lazy to run this against all tools we have. nsupdate was chosen because it is one of few tools which actually use stdin and the original issue was reproducible even without any network communication, which was not the case for simple dig invocation. Sorry for new shell test but doing this in Python seemed very complicated and fragile. (cherry picked from commit e415c5c996a3b408eb1064bd86048522897fc811) --- bin/tests/system/tools/tests.sh | 24 ++++++++++++++++++++++++ bin/tests/system/tools/tests_sh_tools.py | 18 ++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 bin/tests/system/tools/tests.sh create mode 100644 bin/tests/system/tools/tests_sh_tools.py diff --git a/bin/tests/system/tools/tests.sh b/bin/tests/system/tools/tests.sh new file mode 100644 index 0000000000..4132d99985 --- /dev/null +++ b/bin/tests/system/tools/tests.sh @@ -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>&- diff --git a/bin/tests/system/tools/tests_sh_tools.py b/bin/tests/system/tools/tests_sh_tools.py new file mode 100644 index 0000000000..b031a8ac70 --- /dev/null +++ b/bin/tests/system/tools/tests_sh_tools.py @@ -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()