[PATCH] afs: Fix the maximum cell name length
Jeffrey E Altman
jaltman at auristor.com
Mon Jan 6 10:58:51 PST 2025
On 1/6/2025 11:21 AM, David Howells wrote:
> 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: c3e9f888263b ("afs: Implement client support for the YFSVL.GetCellName RPC op")
> Reported-by: syzbot+7848fee1f1e5c53f912b at syzkaller.appspotmail.com
> Closes: https://lore.kernel.org/r/6776d25d.050a0220.3a8527.0048.GAE@google.com/
> Signed-off-by: David Howells <dhowells at redhat.com>
> Tested-by: syzbot+7848fee1f1e5c53f912b at syzkaller.appspotmail.com
> cc: Marc Dionne <marc.dionne at auristor.com>
> cc: linux-afs at lists.infradead.org
> ---
> fs/afs/afs.h | 2 +-
> fs/afs/afs_vl.h | 1 +
> fs/afs/vl_alias.c | 8 ++++++--
> fs/afs/vlclient.c | 2 +-
> 4 files changed, 9 insertions(+), 4 deletions(-)
>
> diff --git a/fs/afs/afs.h b/fs/afs/afs.h
> index b488072aee87..ec3db00bd081 100644
> --- a/fs/afs/afs.h
> +++ b/fs/afs/afs.h
> @@ -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 */
> diff --git a/fs/afs/afs_vl.h b/fs/afs/afs_vl.h
> index a06296c8827d..b835e25a2c02 100644
> --- a/fs/afs/afs_vl.h
> +++ b/fs/afs/afs_vl.h
> @@ -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 */
> diff --git a/fs/afs/vl_alias.c b/fs/afs/vl_alias.c
> index 9f36e14f1c2d..f9e76b604f31 100644
> --- a/fs/afs/vl_alias.c
> +++ b/fs/afs/vl_alias.c
> @@ -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);
> diff --git a/fs/afs/vlclient.c b/fs/afs/vlclient.c
> index cac75f89b64a..55dd0fc5aad7 100644
> --- a/fs/afs/vlclient.c
> +++ b/fs/afs/vlclient.c
> @@ -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;
>
>
> _______________________________________________
> linux-afs mailing list
> http://lists.infradead.org/mailman/listinfo/linux-afs
Reviewed-by: Jeffrey Altman <jaltman at auristor.com>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 4276 bytes
Desc: S/MIME Cryptographic Signature
URL: <http://lists.infradead.org/pipermail/linux-afs/attachments/20250106/437d78ac/attachment.p7s>
More information about the linux-afs
mailing list