Unverified Commit 8fd56ad6 authored by David Howells's avatar David Howells Committed by Christian Brauner
Browse files

afs: Fix the maximum cell name length



The kafs filesystem limits the maximum length of a cell to 256 bytes, but a
problem occurs if someone actually does that: kafs tries to create a
directory under /proc/net/afs/ with the name of the cell, but that fails
with a warning:

        WARNING: CPU: 0 PID: 9 at fs/proc/generic.c:405

because procfs limits the maximum filename length to 255.

However, the DNS limits the maximum lookup length and, by extension, the
maximum cell name, to 255 less two (length count and trailing NUL).

Fix this by limiting the maximum acceptable cellname length to 253.  This
also allows us to be sure we can create the "/afs/.<cell>/" mountpoint too.

Further, split the YFS VL record cell name maximum to be the 256 allowed by
the protocol and ignore the record retrieved by YFSVL.GetCellName if it
exceeds 253.

Fixes: c3e9f888 ("afs: Implement client support for the YFSVL.GetCellName RPC op")
Reported-by: default avatar <syzbot+7848fee1f1e5c53f912b@syzkaller.appspotmail.com>
Closes: https://lore.kernel.org/r/6776d25d.050a0220.3a8527.0048.GAE@google.com/


Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
Link: https://lore.kernel.org/r/376236.1736180460@warthog.procyon.org.uk


Tested-by: default avatar <syzbot+7848fee1f1e5c53f912b@syzkaller.appspotmail.com>
cc: Marc Dionne <marc.dionne@auristor.com>
cc: linux-afs@lists.infradead.org
Signed-off-by: default avatarChristian Brauner <brauner@kernel.org>
parent 3ff93c59
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -10,7 +10,7 @@

#include <linux/in.h>

#define AFS_MAXCELLNAME		256  	/* Maximum length of a cell name */
#define AFS_MAXCELLNAME		253  	/* Maximum length of a cell name (DNS limited) */
#define AFS_MAXVOLNAME		64  	/* Maximum length of a volume name */
#define AFS_MAXNSERVERS		8   	/* Maximum servers in a basic volume record */
#define AFS_NMAXNSERVERS	13  	/* Maximum servers in a N/U-class volume record */
+1 −0
Original line number Diff line number Diff line
@@ -13,6 +13,7 @@
#define AFS_VL_PORT		7003	/* volume location service port */
#define VL_SERVICE		52	/* RxRPC service ID for the Volume Location service */
#define YFS_VL_SERVICE		2503	/* Service ID for AuriStor upgraded VL service */
#define YFS_VL_MAXCELLNAME	256  	/* Maximum length of a cell name in YFS protocol */

enum AFSVL_Operations {
	VLGETENTRYBYID		= 503,	/* AFS Get VLDB entry by ID */
+6 −2
Original line number Diff line number Diff line
@@ -253,6 +253,7 @@ static char *afs_vl_get_cell_name(struct afs_cell *cell, struct key *key)
static int yfs_check_canonical_cell_name(struct afs_cell *cell, struct key *key)
{
	struct afs_cell *master;
	size_t name_len;
	char *cell_name;

	cell_name = afs_vl_get_cell_name(cell, key);
@@ -264,8 +265,11 @@ static int yfs_check_canonical_cell_name(struct afs_cell *cell, struct key *key)
		return 0;
	}

	master = afs_lookup_cell(cell->net, cell_name, strlen(cell_name),
				 NULL, false);
	name_len = strlen(cell_name);
	if (!name_len || name_len > AFS_MAXCELLNAME)
		master = ERR_PTR(-EOPNOTSUPP);
	else
		master = afs_lookup_cell(cell->net, cell_name, name_len, NULL, false);
	kfree(cell_name);
	if (IS_ERR(master))
		return PTR_ERR(master);
+1 −1
Original line number Diff line number Diff line
@@ -697,7 +697,7 @@ static int afs_deliver_yfsvl_get_cell_name(struct afs_call *call)
			return ret;

		namesz = ntohl(call->tmp);
		if (namesz > AFS_MAXCELLNAME)
		if (namesz > YFS_VL_MAXCELLNAME)
			return afs_protocol_error(call, afs_eproto_cellname_len);
		paddedsz = (namesz + 3) & ~3;
		call->count = namesz;