aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRicardo Branco <rbranco@suse.de>2026-04-26 16:44:39 +0000
committerPouria Mousavizadeh Tehrani <pouria@FreeBSD.org>2026-05-01 20:27:36 +0000
commit459ac3044b516af698d7342431bdbcf784fdf7a4 (patch)
treee0aec49065e04bda170de33c4ddde50f5a3125a2
parent19ff93c921a9d31770bcfc194c078e7a42a5f14f (diff)
-rw-r--r--sys/kern/vfs_lookup.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/sys/kern/vfs_lookup.c b/sys/kern/vfs_lookup.c
index 39c7da803de1..c1363c0104d3 100644
--- a/sys/kern/vfs_lookup.c
+++ b/sys/kern/vfs_lookup.c
@@ -778,13 +778,17 @@ restart:
cnp->cn_nameptr = cnp->cn_pnbuf;
if (*(cnp->cn_nameptr) == '/') {
/*
- * Reset the lookup to start from the real root without
- * origin path name reloading.
+ * For ABI-root lookups, preserve the ABI root while
+ * following absolute symlinks during the first lookup.
+ *
+ * Only force the real root after the ABI lookup has
+ * already failed and namei() has restarted in the
+ * native namespace. Otherwise absolute symlinks inside
+ * /compat/linux, including the ELF interpreter symlink,
+ * incorrectly escape to the native root (PR 289739).
*/
- if (__predict_false(ndp->ni_rootdir != pwd->pwd_rdir)) {
- cnp->cn_flags |= ISRESTARTED;
+ if ((cnp->cn_flags & ISRESTARTED) != 0)
ndp->ni_rootdir = pwd->pwd_rdir;
- }
vrele(dp);
error = namei_handle_root(ndp, &dp);
if (error != 0)