From: Al Viro <viro@zeniv.linux.org.uk>
To: Mark Brown <broonie@kernel.org>
Cc: linux-fsdevel@vger.kernel.org, torvalds@linux-foundation.org,
brauner@kernel.org, jack@suse.cz, mjguzik@gmail.com,
paul@paul-moore.com, axboe@kernel.dk, audit@vger.kernel.org,
io-uring@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v4 15/59] struct filename: saner handling of long names
Date: Tue, 13 Jan 2026 19:17:02 +0000 [thread overview]
Message-ID: <20260113191702.GP3634291@ZenIV> (raw)
In-Reply-To: <20260113190701.GO3634291@ZenIV>
On Tue, Jan 13, 2026 at 07:07:01PM +0000, Al Viro wrote:
> FWIW, an unpleasant surprise is that LTP apparently doesn't test that
> case anywhere - the effect of that braino is to lower the cutoff for
> name length by 48 characters and there's not a single test in there
> that would test that ;-/
>
> chdir04 does check that name component is not too long, but that's
> a different codepath - it's individual filesystem's ->lookup() rejecting
> a component.
>
> Oh, well - not hard to add (to the same chdir04, for example)...
Crude variant on top of https://github.com/linux-test-project/ltp #master:
diff --git a/testcases/kernel/syscalls/chdir/chdir04.c b/testcases/kernel/syscalls/chdir/chdir04.c
index 6e53b7fef..7e959e090 100644
--- a/testcases/kernel/syscalls/chdir/chdir04.c
+++ b/testcases/kernel/syscalls/chdir/chdir04.c
@@ -11,6 +11,8 @@
#include "tst_test.h"
static char long_dir[] = "abcdefghijklmnopqrstmnopqrstuvwxyzabcdefghijklmnopqrstmnopqrstuvwxyzabcdefghijklmnopqrstmnopqrstuvwxyzabcdefghijklmnopqrstmnopqrstuvwxyzabcdefghijklmnopqrstmnopqrstuvwxyzabcdefghijklmnopqrstmnopqrstuvwxyzabcdefghijklmnopqrstmnopqrstuvwxyzabcdefghijklmnopqrstmnopqrstuvwxyz";
+static char long_path_4096[4096+1];
+static char long_path_4094[4094+1];
static char noexist_dir[] = "noexistdir";
static struct tcase {
@@ -20,16 +22,26 @@ static struct tcase {
{long_dir, ENAMETOOLONG},
{noexist_dir, ENOENT},
{0, EFAULT}, // bad_addr
+ {long_path_4096, ENAMETOOLONG},
+ {long_path_4094, 0},
};
static void verify_chdir(unsigned int i)
{
- TST_EXP_FAIL(chdir(tcases[i].dir), tcases[i].exp_errno, "chdir()");
+ if (tcases[i].exp_errno)
+ TST_EXP_FAIL(chdir(tcases[i].dir), tcases[i].exp_errno, "chdir()");
+ else
+ TST_EXP_PASS(chdir(tcases[i].dir), "chdir()");
}
static void setup(void)
{
tcases[2].dir = tst_get_bad_addr(NULL);
+ for (int i = 0; i < 4096; ) {
+ long_path_4096[i++] = '.';
+ long_path_4096[i++] = '/';
+ }
+ memcpy(long_path_4094, long_path_4096, 4094);
}
static struct tst_test test = {
next prev parent reply other threads:[~2026-01-13 19:15 UTC|newest]
Thread overview: 65+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-01-08 7:37 [PATCH v4 00/59] struct filename series Al Viro
2026-01-08 7:37 ` [PATCH v4 01/59] do_faccessat(): import pathname only once Al Viro
2026-01-08 7:37 ` [PATCH v4 02/59] do_fchmodat(): " Al Viro
2026-01-08 7:37 ` [PATCH v4 03/59] do_fchownat(): " Al Viro
2026-01-08 7:37 ` [PATCH v4 04/59] do_utimes_path(): " Al Viro
2026-01-08 7:37 ` [PATCH v4 05/59] chdir(2): " Al Viro
2026-01-08 7:37 ` [PATCH v4 06/59] chroot(2): " Al Viro
2026-01-08 7:37 ` [PATCH v4 07/59] user_statfs(): " Al Viro
2026-01-08 7:37 ` [PATCH v4 08/59] do_sys_truncate(): " Al Viro
2026-01-08 7:37 ` [PATCH v4 09/59] do_readlinkat(): " Al Viro
2026-01-08 7:37 ` [PATCH v4 10/59] get rid of audit_reusename() Al Viro
2026-01-08 7:37 ` [PATCH v4 11/59] ntfs: ->d_compare() must not block Al Viro
2026-01-08 7:37 ` [PATCH v4 12/59] getname_flags() massage, part 1 Al Viro
2026-01-08 7:37 ` [PATCH v4 13/59] getname_flags() massage, part 2 Al Viro
2026-01-08 7:37 ` [PATCH v4 14/59] struct filename: use names_cachep only for getname() and friends Al Viro
2026-01-08 7:37 ` [PATCH v4 15/59] struct filename: saner handling of long names Al Viro
2026-01-13 15:31 ` Mark Brown
2026-01-13 15:39 ` Al Viro
2026-01-13 17:51 ` Mark Brown
2026-01-13 19:07 ` Al Viro
2026-01-13 19:17 ` Al Viro [this message]
2026-01-08 7:37 ` [PATCH v4 16/59] fs: hide names_cache behind runtime const machinery Al Viro
2026-01-08 7:37 ` [PATCH v4 17/59] allow to use CLASS() for struct filename * Al Viro
2026-01-08 7:37 ` [PATCH v4 18/59] switch __getname_maybe_null() to CLASS(filename_flags) Al Viro
2026-01-08 7:37 ` [PATCH v4 19/59] allow incomplete imports of filenames Al Viro
2026-01-08 7:37 ` [PATCH v4 20/59] struct filename ->refcnt doesn't need to be atomic Al Viro
2026-01-08 7:37 ` [PATCH v4 21/59] file_getattr(): filename_lookup() accepts ERR_PTR() as filename Al Viro
2026-01-08 7:37 ` [PATCH v4 22/59] file_setattr(): " Al Viro
2026-01-08 7:37 ` [PATCH v4 23/59] move_mount(): " Al Viro
2026-01-08 7:37 ` [PATCH v4 24/59] ksmbd_vfs_path_lookup(): vfs_path_parent_lookup() accepts ERR_PTR() as name Al Viro
2026-01-08 7:37 ` [PATCH v4 25/59] ksmbd_vfs_rename(): " Al Viro
2026-01-08 7:37 ` [PATCH v4 26/59] do_filp_open(): DTRT when getting ERR_PTR() as pathname Al Viro
2026-01-08 7:37 ` [PATCH v4 27/59] rename do_filp_open() to do_file_open() Al Viro
2026-01-08 7:37 ` [PATCH v4 28/59] do_sys_openat2(): get rid of useless check, switch to CLASS(filename) Al Viro
2026-01-08 7:37 ` [PATCH v4 29/59] simplify the callers of file_open_name() Al Viro
2026-01-08 7:37 ` [PATCH v4 30/59] simplify the callers of do_open_execat() Al Viro
2026-01-08 7:37 ` [PATCH v4 31/59] simplify the callers of alloc_bprm() Al Viro
2026-01-08 7:37 ` [PATCH v4 32/59] switch {alloc,free}_bprm() to CLASS() Al Viro
2026-01-08 7:37 ` [PATCH v4 33/59] file_[gs]etattr(2): switch to CLASS(filename_maybe_null) Al Viro
2026-01-08 7:37 ` [PATCH v4 34/59] mount_setattr(2): don't mess with LOOKUP_EMPTY Al Viro
2026-01-08 7:37 ` [PATCH v4 35/59] do_open_execat(): don't care about LOOKUP_EMPTY Al Viro
2026-01-08 7:37 ` [PATCH v4 36/59] vfs_open_tree(): use CLASS(filename_uflags) Al Viro
2026-01-08 7:37 ` [PATCH v4 37/59] name_to_handle_at(): " Al Viro
2026-01-08 7:37 ` [PATCH v4 38/59] fspick(2): use CLASS(filename_flags) Al Viro
2026-01-08 7:37 ` [PATCH v4 39/59] do_fchownat(): unspaghettify a bit Al Viro
2026-01-08 7:37 ` [PATCH v4 40/59] chdir(2): " Al Viro
2026-01-08 7:37 ` [PATCH v4 41/59] do_utimes_path(): switch to CLASS(filename_uflags) Al Viro
2026-01-08 7:37 ` [PATCH v4 42/59] do_sys_truncate(): switch to CLASS(filename) Al Viro
2026-01-08 7:37 ` [PATCH v4 43/59] do_readlinkat(): switch to CLASS(filename_flags) Al Viro
2026-01-08 7:37 ` [PATCH v4 44/59] do_f{chmod,chown,access}at(): use CLASS(filename_uflags) Al Viro
2026-01-08 7:37 ` [PATCH v4 45/59] do_{renameat2,linkat,symlinkat}(): use CLASS(filename_consume) Al Viro
2026-01-08 7:37 ` [PATCH v4 46/59] do_{mknodat,mkdirat,unlinkat,rmdir}(): " Al Viro
2026-01-08 7:37 ` [PATCH v4 47/59] namei.c: convert getname_kernel() callers to CLASS(filename_kernel) Al Viro
2026-01-08 7:37 ` [PATCH v4 48/59] namei.c: switch user pathname imports to CLASS(filename{,_flags}) Al Viro
2026-01-08 7:37 ` [PATCH v4 49/59] filename_...xattr(): don't consume filename reference Al Viro
2026-01-08 7:37 ` [PATCH v4 50/59] move_mount(2): switch to CLASS(filename_maybe_null) Al Viro
2026-01-08 7:37 ` [PATCH v4 51/59] chroot(2): switch to CLASS(filename) Al Viro
2026-01-08 7:37 ` [PATCH v4 52/59] quotactl_block(): " Al Viro
2026-01-08 7:37 ` [PATCH v4 53/59] statx: switch to CLASS(filename_maybe_null) Al Viro
2026-01-08 7:37 ` [PATCH v4 54/59] user_statfs(): switch to CLASS(filename) Al Viro
2026-01-08 7:37 ` [PATCH v4 55/59] mqueue: " Al Viro
2026-01-08 7:38 ` [PATCH v4 56/59] ksmbd: use CLASS(filename_kernel) Al Viro
2026-01-08 7:38 ` [PATCH v4 57/59] alpha: switch osf_mount() to strndup_user() Al Viro
2026-01-08 7:38 ` [PATCH v4 58/59] sysfs(2): fs_index() argument is _not_ a pathname Al Viro
2026-01-08 7:38 ` [PATCH v4 59/59] switch init_mkdir() to use of do_mkdirat(), etc Al Viro
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260113191702.GP3634291@ZenIV \
--to=viro@zeniv.linux.org.uk \
--cc=audit@vger.kernel.org \
--cc=axboe@kernel.dk \
--cc=brauner@kernel.org \
--cc=broonie@kernel.org \
--cc=io-uring@vger.kernel.org \
--cc=jack@suse.cz \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mjguzik@gmail.com \
--cc=paul@paul-moore.com \
--cc=torvalds@linux-foundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.