From: Kevin Wolf <kwolf@redhat.com>
To: Eric Blake <eblake@redhat.com>
Cc: nhuck15@gmail.com, qemu-devel@nongnu.org, qemu-block@nongnu.org,
ppandit@redhat.com
Subject: Re: [PATCH 1/2] vvfat: Check that updated filenames are valid
Date: Wed, 24 Jun 2020 14:36:35 +0200 [thread overview]
Message-ID: <20200624123635.GB9253@linux.fritz.box> (raw)
In-Reply-To: <33941063-cfcc-002b-5fe8-d37050d8e532@redhat.com>
Am 23.06.2020 um 20:21 hat Eric Blake geschrieben:
> On 6/23/20 12:55 PM, Kevin Wolf wrote:
> > FAT allows only a restricted set of characters in file names, and for
> > some of the illegal characters, it's actually important that we catch
> > them: If filenames can contain '/', the guest can construct filenames
> > containing "../" and escape from the assigned vvfat directory. The same
> > problem could arise if ".." was ever accepted as a literal filename.
> >
> > Fix this by adding a check that all filenames are valid in
> > check_directory_consistency().
> >
> > Reported-by: Nathan Huckleberry <nhuck15@gmail.com>
> > Signed-off-by: Kevin Wolf <kwolf@redhat.com>
> > ---
> > block/vvfat.c | 23 +++++++++++++++++++++++
> > 1 file changed, 23 insertions(+)
> >
> > diff --git a/block/vvfat.c b/block/vvfat.c
> > index c65a98e3ee..2fab371258 100644
> > --- a/block/vvfat.c
> > +++ b/block/vvfat.c
> > @@ -520,6 +520,25 @@ static void set_begin_of_direntry(direntry_t* direntry, uint32_t begin)
> > direntry->begin_hi = cpu_to_le16((begin >> 16) & 0xffff);
> > }
> > +static bool valid_filename(const unsigned char *name)
> > +{
> > + unsigned char c;
> > + if (!strcmp((const char*)name, ".") || !strcmp((const char*)name, "..")) {
> > + return false;
> > + }
> > + for (; (c = *name); name++) {
> > + if (!((c >= '0' && c <= '9') ||
> > + (c >= 'A' && c <= 'Z') ||
> > + (c >= 'a' && c <= 'z') ||
> > + c > 127 ||
> > + strchr("$%'-_@~`!(){}^#&.+,;=[]", c) != 0))
>
> s/0/NULL/
Ok, though this line is just copied from to_valid_short_char(). Maybe I
can sneak in a (strictly speaking unrelated) change to that function to
keep both consistent.
> Hmm - would it be any more efficient to use a single comparison of strcspn()
> vs. strlen(), where you merely spell out the bytes that are rejected? Out
> of 256 byte values, NUL is implicitly rejected (since these are C strings),
> the 128 high-bit bytes are all valid, and you have permitted 62 alnum and 23
> other characters; that leaves merely 42 byte values to explicitly list in a
> reject string. Of course, writing the string literal containing those 42
> invalid bytes is itself a bit of an exercise in reading the ASCII table:
>
> "\x01\x02\x03\x04\x05\x06\x07"
> "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
> "\x10\x11\x12\x13\x14\x15\x16\x17"
> "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
> " \"*/:<>?\\|\x7f"
I think this would be really hard to read.
The above condition is a pretty straighforward implementation of what
the spec says (even the order of characters is the same).
Kevin
next prev parent reply other threads:[~2020-06-24 12:37 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-06-23 17:55 [PATCH 0/2] vvfat: Two small patches Kevin Wolf
2020-06-23 17:55 ` [PATCH 1/2] vvfat: Check that updated filenames are valid Kevin Wolf
2020-06-23 18:21 ` Eric Blake
2020-06-24 12:36 ` Kevin Wolf [this message]
2020-06-23 17:55 ` [PATCH 2/2] vvfat: Fix array_remove_slice() Kevin Wolf
2020-06-23 18:30 ` Eric Blake
2020-06-24 12:42 ` Kevin Wolf
2020-06-23 18:32 ` [PATCH 0/2] vvfat: Two small patches no-reply
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200624123635.GB9253@linux.fritz.box \
--to=kwolf@redhat.com \
--cc=eblake@redhat.com \
--cc=nhuck15@gmail.com \
--cc=ppandit@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.