]> git.ipfire.org Git - thirdparty/shadow.git/commitdiff
useradd: fix btrfs subvolume creation for single-component basedir master
authorHadi Chokr <hadichokr@icloud.com>
Tue, 28 Apr 2026 10:18:43 +0000 (12:18 +0200)
committerAlejandro Colomar <foss+github@alejandro-colomar.es>
Tue, 28 Apr 2026 13:32:50 +0000 (15:32 +0200)
dirname() replaces broken stpcpy index arithmetic that produced an
empty string for single-component paths (e.g. /koolhome), causing
statfs to fail and fall back to a regular directory. Use path in
the error message since dirname() modifies btrfs_check in-place,
making it unusable for logging after the call.

Fixes: c1d36a8acb1d (2019-05-04; "Add support for btrfs subvolumes for user homes")
Signed-off-by: Hadi Chokr <hadichokr@icloud.com>
Reviewed-by: Alejandro Colomar <alx@kernel.org>
src/useradd.c

index 9210379c8b970a380a90911bc10db32639d4a0a6..c0e28ef8b7a311ebcb147557c62fb26a6bc194f6 100644 (file)
@@ -2274,10 +2274,9 @@ static void create_home(const struct option_flags *flags)
                                        Prog, path);
                                fail_exit(E_HOMEDIR, process_selinux);
                        }
-                       stpcpy(&btrfs_check[strlen(path) - strlen(cp) - 1], "");
-                       if (statfs(btrfs_check, &sfs) == -1) {
-                               fprintf(stderr, "%s: statfs(\"%s\"): %s\n",
-                                       Prog, btrfs_check, strerrno());
+                       if (statfs(dirname(btrfs_check), &sfs) == -1) {
+                               fprintf(stderr, "%s: statfs(dirname(\"%s\")): %s\n",
+                                       Prog, path, strerrno());
                                fail_exit(E_HOMEDIR, process_selinux);
                        }
                        free(btrfs_check);