vfs: Make fs_parse() handle fs_param_is_fd-type params better

Make fs_parse() handle fs_param_is_fd-type parameters that are passed a
string by converting it to an integer (in addition to handling direct fd
specification).

Also range check the integer.

[fix from  Yin Fengwei folded]

Signed-off-by: David Howells <dhowells@redhat.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
David Howells 2019-03-25 16:38:31 +00:00 committed by Al Viro
parent f32356261d
commit 74983ac20a
1 changed files with 16 additions and 2 deletions

View File

@ -204,9 +204,23 @@ int fs_parse(struct fs_context *fc,
goto okay; goto okay;
case fs_param_is_fd: { case fs_param_is_fd: {
if (param->type != fs_value_is_file) switch (param->type) {
case fs_value_is_string:
if (!result->has_value)
goto bad_value;
ret = kstrtouint(param->string, 0, &result->uint_32);
break;
case fs_value_is_file:
result->uint_32 = param->dirfd;
ret = 0;
default:
goto bad_value; goto bad_value;
goto okay; }
if (result->uint_32 > INT_MAX)
goto bad_value;
goto maybe_okay;
} }
case fs_param_is_blockdev: case fs_param_is_blockdev: