| From f6b95ada93ae11814d35e3fdd7a064dc298ed361 Mon Sep 17 00:00:00 2001 |
| From: David Howells <dhowells@redhat.com> |
| Date: Mon, 9 Dec 2019 15:04:45 +0000 |
| Subject: [PATCH] afs: Fix mountpoint parsing |
| |
| commit 158d58335393af3956a9c06f0816ee75ed1f1447 upstream. |
| |
| Each AFS mountpoint has strings that define the target to be mounted. This |
| is required to end in a dot that is supposed to be stripped off. The |
| string can include suffixes of ".readonly" or ".backup" - which are |
| supposed to come before the terminal dot. To add to the confusion, the "fs |
| lsmount" afs utility does not show the terminal dot when displaying the |
| string. |
| |
| The kernel mount source string parser, however, assumes that the terminal |
| dot marks the suffix and that the suffix is always "" and is thus ignored. |
| In most cases, there is no suffix and this is not a problem - but if there |
| is a suffix, it is lost and this affects the ability to mount the correct |
| volume. |
| |
| The command line mount command, on the other hand, is expected not to |
| include a terminal dot - so the problem doesn't arise there. |
| |
| Fix this by making sure that the dot exists and then stripping it when |
| passing the string to the mount configuration. |
| |
| Fixes: bec5eb614130 ("AFS: Implement an autocell mount capability [ver #2]") |
| Reported-by: Jonathan Billings <jsbillings@jsbillings.org> |
| Signed-off-by: David Howells <dhowells@redhat.com> |
| Reviewed-by: Marc Dionne <marc.dionne@auristor.com> |
| Tested-by: Jonathan Billings <jsbillings@jsbillings.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/fs/afs/mntpt.c b/fs/afs/mntpt.c |
| index f532d6d3bd28..79bc5f1338ed 100644 |
| --- a/fs/afs/mntpt.c |
| +++ b/fs/afs/mntpt.c |
| @@ -126,7 +126,7 @@ static int afs_mntpt_set_params(struct fs_context *fc, struct dentry *mntpt) |
| if (src_as->cell) |
| ctx->cell = afs_get_cell(src_as->cell); |
| |
| - if (size > PAGE_SIZE - 1) |
| + if (size < 2 || size > PAGE_SIZE - 1) |
| return -EINVAL; |
| |
| page = read_mapping_page(d_inode(mntpt)->i_mapping, 0, NULL); |
| @@ -140,7 +140,9 @@ static int afs_mntpt_set_params(struct fs_context *fc, struct dentry *mntpt) |
| } |
| |
| buf = kmap(page); |
| - ret = vfs_parse_fs_string(fc, "source", buf, size); |
| + ret = -EINVAL; |
| + if (buf[size - 1] == '.') |
| + ret = vfs_parse_fs_string(fc, "source", buf, size - 1); |
| kunmap(page); |
| put_page(page); |
| if (ret < 0) |
| -- |
| 2.7.4 |
| |