adduser: create dataset only if home is directly within dataset

Currently, if the prefix of the new home directory is a subdirectory
of a ZFS dataset, adduser will create a new dataset up one or more
levels from the intended destination.  "pw useradd" will then create
a normal directory in the desired location, leaving an unused dataset.
Check for this situation when determining whether to create a dataset,
and let pw create the directory.

Reviewed by:	des
Differential Revision:	https://reviews.freebsd.org/D45229
MFC after:	3 days
This commit is contained in:
Mike Karels 2024-05-20 08:43:34 -05:00
parent b780b6508b
commit 0b39b2e2dd

View File

@ -474,7 +474,7 @@ get_homeperm() {
# so, enable ZFS home dataset creation.
#
get_zfs_home() {
local _prefix=
local _prefix= _tmp=
# check if zfs kernel module is loaded before attempting to run zfs to
# prevent loading the kernel module on systems that don't use ZFS
@ -487,6 +487,13 @@ get_zfs_home() {
Zcreate="no"
return
fi
# Make sure that _prefix is not a subdirectory within a dataset. If it
# is, the containing dataset will be the same for it and its parent.
_tmp=$(${ZFSCMD} list -Ho name "$(dirname "${homeprefix}")" 2>/dev/null)
if [ "${_tmp}" = "${_prefix}" ]; then
Zcreate="no"
return
fi
zhome="${_prefix}/${username}"
}