Module Name: src Committed By: riastradh Date: Mon Aug 28 22:25:50 UTC 2023
Modified Files: src: UPDATING src/tests/usr.sbin/certctl: t_certctl.sh src/usr.sbin/certctl: certctl.sh Log Message: certctl(8): Avoid clobbering prepopulated /etc/openssl/certs. Also avoid clobbering some other edge cases like symlinks or non-directories there. This way, we have the following transitions on system updates: - If /etc/openssl/certs is empty (as in default NetBSD<10 installs): quietly populated on rehash. - If /etc/openssl/certs is nonempty (you've added things to it, e.g. by hand or with mozilla-rootcerts) and has never been managed by certctl(8): left alone on rehash, with an error message to explain what you need to do. - If /etc/openssl/certs has been managed by certctl(8): quietly updated on rehash. Note: This means current installations made since certctl(8) was added will be treated like /etc/openssl/certs is nonempty and has never been managed by certctl(8). To work around this, you can just delete /etc/openssl/certs and rerun `certctl rehash'. To generate a diff of this commit: cvs rdiff -u -r1.342 -r1.343 src/UPDATING cvs rdiff -u -r1.4 -r1.5 src/tests/usr.sbin/certctl/t_certctl.sh cvs rdiff -u -r1.2 -r1.3 src/usr.sbin/certctl/certctl.sh Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/UPDATING diff -u src/UPDATING:1.342 src/UPDATING:1.343 --- src/UPDATING:1.342 Wed Jul 19 17:49:40 2023 +++ src/UPDATING Mon Aug 28 22:25:49 2023 @@ -1,4 +1,4 @@ -$NetBSD: UPDATING,v 1.342 2023/07/19 17:49:40 martin Exp $ +$NetBSD: UPDATING,v 1.343 2023/08/28 22:25:49 riastradh Exp $ This file (UPDATING) is intended to be a brief reference to recent changes that might cause problems in the build process, and a guide for @@ -19,6 +19,21 @@ See also: BUILDING, build.sh, Makefile. Recent changes: ^^^^^^^^^^^^^^^ +20230828: + If: + - you updated to current and ran postinstall between 20230826 + and 20230828 inclusive, and + - you are not using anything outside the base system to + populate /etc/openssl/certs (e.g., manually adding + certificates or using ca-certificates or mozilla-rootcerts or + mozilla-rootcerts-openssl from pkgsrc), + delete /etc/openssl/certs and rerun postinstall or just + `certctl rehash'. + + Otherwise, certctl(8) will think someone else has left + /etc/openssl/certs in the way and will avoid clobbering it on + upgrade from older NetBSD. + 20230718: build.sh will use mk.conf in the same directory as build.sh instead of /etc/mk.conf, unless MAKECONF is already defined in the environment. Index: src/tests/usr.sbin/certctl/t_certctl.sh diff -u src/tests/usr.sbin/certctl/t_certctl.sh:1.4 src/tests/usr.sbin/certctl/t_certctl.sh:1.5 --- src/tests/usr.sbin/certctl/t_certctl.sh:1.4 Mon Aug 28 22:25:41 2023 +++ src/tests/usr.sbin/certctl/t_certctl.sh Mon Aug 28 22:25:49 2023 @@ -1,6 +1,6 @@ #!/bin/sh -# $NetBSD: t_certctl.sh,v 1.4 2023/08/28 22:25:41 riastradh Exp $ +# $NetBSD: t_certctl.sh,v 1.5 2023/08/28 22:25:49 riastradh Exp $ # # Copyright (c) 2023 The NetBSD Foundation, Inc. # All rights reserved. @@ -358,7 +358,6 @@ symlinkcertsdir_body() mkdir empty ln -sfn empty certs - atf_expect_fail "certctl clobbers symlink at /etc/openssl/certs" atf_check -s not-exit:0 -e match:symlink $CERTCTL -n rehash atf_check -s not-exit:0 -e match:symlink $CERTCTL rehash atf_check -s exit:0 rmdir empty @@ -375,7 +374,6 @@ regularfilecertsdir_body() rmdir certs echo 'hello world' >certs - atf_expect_fail "certctl clobbers file at /etc/openssl/certs" atf_check -s not-exit:0 -e match:directory $CERTCTL -n rehash atf_check -s not-exit:0 -e match:directory $CERTCTL rehash atf_check -s exit:0 rm certs @@ -393,7 +391,6 @@ prepopulatedcerts_body() setupconf certs1 ln -sfn "$(atf_get_srcdir)/certs2"/*.pem certs/ - atf_expect_fail "certctl clobbers prepopulated /etc/openssl/certs" atf_check -s not-exit:0 -e match:manual $CERTCTL -n rehash atf_check -s not-exit:0 -e match:manual $CERTCTL rehash for cert in "$(atf_get_srcdir)/certs2"/*.pem; do Index: src/usr.sbin/certctl/certctl.sh diff -u src/usr.sbin/certctl/certctl.sh:1.2 src/usr.sbin/certctl/certctl.sh:1.3 --- src/usr.sbin/certctl/certctl.sh:1.2 Mon Aug 28 22:25:32 2023 +++ src/usr.sbin/certctl/certctl.sh Mon Aug 28 22:25:50 2023 @@ -1,6 +1,6 @@ #!/bin/sh -# $NetBSD: certctl.sh,v 1.2 2023/08/28 22:25:32 riastradh Exp $ +# $NetBSD: certctl.sh,v 1.3 2023/08/28 22:25:50 riastradh Exp $ # # Copyright (c) 2023 The NetBSD Foundation, Inc. # All rights reserved. @@ -427,9 +427,40 @@ rehash() return fi - # Delete the active certificates symlink cache. - run rm -rf "$certsdir" + # Delete the active certificates symlink cache, if either it is + # empty or nonexistent, or it is tagged for use by certctl. + if [ -f "$certsdir/.certctl" ]; then + # Directory exists and is managed by certctl(8). + # Safe to delete it and everything in it. + run rm -rf "$certsdir" + elif [ -h "$certsdir" ]; then + # Paranoia: refuse to chase a symlink. (Caveat: this + # is not secure against an adversary who can recreate + # the symlink at any time. Just a helpful check for + # mistakes.) + error "certificates directory is a symlink" + return 1 + elif [ ! -e "$certsdir" ]; then + # Directory doesn't exist at all. Nothing to do! + elif [ ! -d "$certsdir" ]; then + error "certificates directory is not a directory" + return 1 + elif ! find "$certsdir" -maxdepth 0 -type d -empty -exit 1; then + # certsdir exists, is a directory, and is empty. Safe + # to delete it with rmdir and take it over. + run rmdir "$certsdir" + else + error "existing certificates; set manual or move them" + return 1 + fi run mkdir "$certsdir" + if $vflag; then + printf '# initialize %s\n' "$certsdir" + fi + if ! $nflag; then + printf 'This directory is managed by certctl(8).\n' \ + >$certsdir/.certctl + fi # Create a temporary file for the single-file bundle. This # will be automatically deleted on normal exit or