From: Max Kellermann <max.kellermann@xxxxxxxxx> commit 550f7ca98ee028a606aa75705a7e77b1bd11720f upstream. If the full path to be built by ceph_mdsc_build_path() happens to be longer than PATH_MAX, then this function will enter an endless (retry) loop, effectively blocking the whole task. Most of the machine becomes unusable, making this a very simple and effective DoS vulnerability. I cannot imagine why this retry was ever implemented, but it seems rather useless and harmful to me. Let's remove it and fail with ENAMETOOLONG instead. Cc: stable@xxxxxxxxxxxxxxx Reported-by: Dario Weißer <dario@xxxxxxxxx> Signed-off-by: Max Kellermann <max.kellermann@xxxxxxxxx> Reviewed-by: Alex Markuze <amarkuze@xxxxxxxxxx> Signed-off-by: Ilya Dryomov <idryomov@xxxxxxxxx> Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx> --- fs/ceph/mds_client.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) --- a/fs/ceph/mds_client.c +++ b/fs/ceph/mds_client.c @@ -2808,12 +2808,11 @@ retry: if (pos < 0) { /* - * A rename didn't occur, but somehow we didn't end up where - * we thought we would. Throw a warning and try again. + * The path is longer than PATH_MAX and this function + * cannot ever succeed. Creating paths that long is + * possible with Ceph, but Linux cannot use them. */ - pr_warn_client(cl, "did not end path lookup where expected (pos = %d)\n", - pos); - goto retry; + return ERR_PTR(-ENAMETOOLONG); } *pbase = base; Patches currently in stable-queue which might be from max.kellermann@xxxxxxxxx are queue-6.12/erofs-fix-psi-memstall-accounting.patch queue-6.12/ceph-give-up-on-paths-longer-than-path_max.patch queue-6.12/ceph-fix-memory-leaks-in-__ceph_sync_read.patch