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() 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);