Re: [REPOST PATCH] nfs: fix port value parsing

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, 2022-06-30 at 07:33 +0800, Ian Kent wrote:
> 
> On 29/6/22 23:33, Trond Myklebust wrote:
> > On Wed, 2022-06-29 at 09:02 +0800, Ian Kent wrote:
> > > On 28/6/22 22:34, Trond Myklebust wrote:
> > > > On Tue, 2022-06-28 at 08:25 +0800, Ian Kent wrote:
> > > > > The valid values of nfs options port and mountport are 0 to
> > > > > USHRT_MAX.
> > > > > 
> > > > > The fs parser will return a fail for port values that are
> > > > > negative
> > > > > and the sloppy option handling then returns success.
> > > > > 
> > > > > But the sloppy option handling is meant to return success for
> > > > > invalid
> > > > > options not valid options with invalid values.
> > > > > 
> > > > > Parsing these values as s32 rather than u32 prevents the
> > > > > parser
> > > > > from
> > > > > returning a parse fail allowing the later USHRT_MAX option
> > > > > check
> > > > > to
> > > > > correctly return a fail in this case. The result check could
> > > > > be
> > > > > changed
> > > > > to use the int_32 union variant as well but leaving it as a
> > > > > uint_32
> > > > > check avoids using two logical compares instead of one.
> > > > > 
> > > > > Signed-off-by: Ian Kent <raven@xxxxxxxxxx>
> > > > > ---
> > > > >    fs/nfs/fs_context.c |    4 ++--
> > > > >    1 file changed, 2 insertions(+), 2 deletions(-)
> > > > > 
> > > > > diff --git a/fs/nfs/fs_context.c b/fs/nfs/fs_context.c
> > > > > index 9a16897e8dc6..f4da1d2be616 100644
> > > > > --- a/fs/nfs/fs_context.c
> > > > > +++ b/fs/nfs/fs_context.c
> > > > > @@ -156,14 +156,14 @@ static const struct fs_parameter_spec
> > > > > nfs_fs_parameters[] = {
> > > > >           fsparam_u32   ("minorversion",  Opt_minorversion),
> > > > >           fsparam_string("mountaddr",     Opt_mountaddr),
> > > > >           fsparam_string("mounthost",     Opt_mounthost),
> > > > > -       fsparam_u32   ("mountport",     Opt_mountport),
> > > > > +       fsparam_s32   ("mountport",     Opt_mountport),
> > > > >           fsparam_string("mountproto",    Opt_mountproto),
> > > > >           fsparam_u32   ("mountvers",     Opt_mountvers),
> > > > >           fsparam_u32   ("namlen",        Opt_namelen),
> > > > >           fsparam_u32   ("nconnect",      Opt_nconnect),
> > > > >           fsparam_u32   ("max_connect",   Opt_max_connect),
> > > > >           fsparam_string("nfsvers",       Opt_vers),
> > > > > -       fsparam_u32   ("port",          Opt_port),
> > > > > +       fsparam_s32   ("port",          Opt_port),
> > > > >           fsparam_flag_no("posix",        Opt_posix),
> > > > >           fsparam_string("proto",         Opt_proto),
> > > > >           fsparam_flag_no("rdirplus",     Opt_rdirplus),
> > > > > 
> > > > > 
> > > > Why don't we just check for the ENOPARAM return value from
> > > > fs_parse()?
> > > In this case I think the return will be EINVAL.
> > My point is that 'sloppy' is only supposed to work to suppress the
> > error in the case where an option is not found by the parser. That
> > corresponds to the error ENOPARAM.
> 
> Well, yes, and that's why ENOPARAM isn't returned and shouldn't be.
> 
> And if the sloppy option is given it doesn't get to check the value
> 
> of the option, it just returns success which isn't right.
> 
> 
> > 
> > > I think that's a bit to general for this case.
> > > 
> > > This seemed like the most sensible way to fix it.
> > > 
> > Your patch works around just one symptom of the problem instead of
> > addressing the root cause.
> > 
> Ok, how do you recommend I fix this?
> 

Maybe I'm missing something, but why not this?

8<--------------------------------
diff --git a/fs/nfs/fs_context.c b/fs/nfs/fs_context.c
index 9a16897e8dc6..8f1f9b4af89d 100644
--- a/fs/nfs/fs_context.c
+++ b/fs/nfs/fs_context.c
@@ -484,7 +484,7 @@ static int nfs_fs_context_parse_param(struct
fs_context *fc,
 
 	opt = fs_parse(fc, nfs_fs_parameters, param, &result);
 	if (opt < 0)
-		return ctx->sloppy ? 1 : opt;
+		return (opt == -ENOPARAM && ctx->sloppy) ? 1 : opt;
 
 	if (fc->security)
 		ctx->has_sec_mnt_opts = 1;

-- 
Trond Myklebust
Linux NFS client maintainer, Hammerspace
trond.myklebust@xxxxxxxxxxxxxxx






[Index of Archives]     [Linux Filesystem Development]     [Linux USB Development]     [Linux Media Development]     [Video for Linux]     [Linux NILFS]     [Linux Audio Users]     [Yosemite Info]     [Linux SCSI]

  Powered by Linux