freebsd-update: unconditionally regenerate passwd/login.conf files

The existing logic is nice in theory, but in practice freebsd-update will
not preserve the timestamps on these files. When doing a major upgrade, e.g.
from 12.1-RELEASE -> 12.2-RELEASE, pwd.mkdb et al. appear in the INDEX and
we clobber the timestamp several times in the process of packaging up the
existing system into /var/db/freebsd-update/files and extracting for
comparisons. This leads to these files not getting regenerated when they're
most likely to be needed.

Measures could be taken to preserve timestamps, but it's unclear whether
the complexity and overhead of doing so is really outweighed by the marginal
benefit.

I observed this issue when pkg subsequently failed to install a package that
wanted to add a user, claiming that the user was removed in the process.
bapt@ pointed to this pre-existing bug with freebsd-update as the cause.

PR:		234014, 232921
Reviewed by:	bapt, emaste
MFC after:	1 week
Differential Revision:	https://reviews.freebsd.org/D27635
This commit is contained in:
Kyle Evans 2020-12-17 03:42:54 +00:00
parent 228e2087a3
commit ebebc41e4c

View file

@ -2949,17 +2949,9 @@ Kernel updates have been installed. Please reboot and run
env DESTDIR=${BASEDIR} certctl rehash
fi
# Rebuild generated pwd files.
if [ ${BASEDIR}/etc/master.passwd -nt ${BASEDIR}/etc/spwd.db ] ||
[ ${BASEDIR}/etc/master.passwd -nt ${BASEDIR}/etc/pwd.db ] ||
[ ${BASEDIR}/etc/master.passwd -nt ${BASEDIR}/etc/passwd ]; then
pwd_mkdb -d ${BASEDIR}/etc -p ${BASEDIR}/etc/master.passwd
fi
# Rebuild /etc/login.conf.db if necessary.
if [ ${BASEDIR}/etc/login.conf -nt ${BASEDIR}/etc/login.conf.db ]; then
cap_mkdb ${BASEDIR}/etc/login.conf
fi
# Rebuild generated pwd files and /etc/login.conf.db.
pwd_mkdb -d ${BASEDIR}/etc -p ${BASEDIR}/etc/master.passwd
cap_mkdb ${BASEDIR}/etc/login.conf
# Rebuild man page databases, if necessary.
for D in /usr/share/man /usr/share/openssl/man; do