|
|
Message-ID: <20220512211014.GL7074@brightrain.aerifal.cx>
Date: Thu, 12 May 2022 17:10:15 -0400
From: Rich Felker <dalias@...c.org>
To: Oliver Ford <ojford@...il.com>
Cc: musl@...ts.openwall.com
Subject: Re: [PATCH musl v2 3/3] mntent: fix parsing lines with
optional fields
On Thu, May 12, 2022 at 09:58:30PM +0100, Oliver Ford wrote:
> On Thu, May 12, 2022 at 3:08 PM Rich Felker <dalias@...c.org> wrote:
> >
> > - There's also an independent bug in hasmntent that was reported a
> > long time ago then lost: it will return false positives when one
> > mntopt name is a substring of another. strstr is just not the right
> > operation here, at least not without added logic to ensure matching
> > on a whole option boundary. This is a separate issue that calls for
> > a separate patch though, not a blocker on the patch under discussion
> > here.
> >
> Looking at this, the "hasmntopt" function does match options where the
> string is part of the option but not the whole option. So the opt "ro"
> will correctly match the "ro" (for read-only) option, but also match
> an option that contains "symlinkroot".
>
> The following version of the function keeps the initial strstr, but
> adds an extra check so that it doesn't match unless the next character
> is either a comma or nul. If there's no other special cases we need to
> handle, I'll submit as a
> patch?
>
> char *hasmntopt(const struct mntent *mnt, const char *opt)
> {
> char *op = strstr(mnt->mnt_opts, opt);
>
> if (op == NULL) return NULL;
> size_t len = strlen(opt);
> char *end = op + len;
> if (*end == '\0' || *end == ',') return op;
>
> return NULL;
> }
This fails to check that the match is at the start of an option
(preceded by a ',' or at the beginning of string) and fails to
continue if the first match is a false positive (e.g. "ro" in
"symlinkroot,ro"). It's possible to solve this still using strstr in a
loop, but it might be easier to just iterate delimiters and strcmp.
Also, I'm not sure if hasmntopt is supposed to return a match or not
for something like "uid" in "uid=1001"; if so, being followed by '='
also needs to be considered valid match.
Rich
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.