public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
From: Stephen Warren <swarren@wwwdotorg.org>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH] fat: handle paths that include ../
Date: Thu, 10 Sep 2015 10:22:35 -0700	[thread overview]
Message-ID: <55F1BC5B.1020200@wwwdotorg.org> (raw)
In-Reply-To: <1438142103-24381-1-git-send-email-swarren@wwwdotorg.org>

On 07/28/2015 08:55 PM, Stephen Warren wrote:
> The FAT code contains a special case to parse the root directory. This
> is needed since the root directory location/layout on disk is special
> cased for FAT12/16. In particular, the location and size of the FAT12/16
> root directory is hard-coded and contiguous, whereas all FAT12/16 non-root
> directories, and all FAT32 directories, are stored in a non-contiguous
> fashion, with the layout represented by a linked-list of clusters in the
> FAT.
> 
> If a file path contains ../ (for example /extlinux/../bcm2835-rpi-cm.dtb),
> it is possible to need to parse the root directory for the first element
> in the path (requiring application of the special case), then a sub-
> directory (in the general way), then re-parse the root directory (again
> requiring the special case). However, the current code in U-Boot only
> applies the special case for the very first path element, and never for
> any later path element. When reparsing the root directory without
> applying the special case, any file in a sector (or cluster?) other than
> the first sector/cluster of the root directory will not be found.
> 
> This change modifies the non-root-dir-parsing loop of do_fat_read_at()
> to detect if it's walked back to the root directory, and if so, jumps
> back to the special case code that handles parsing of the root directory.

Is this change slated for v2015.10, or is the plan to leave this issue
in place until the FAT implementation replacement is accepted for the
release after that?

> 
> This change was tested using sandbox by executing:
> 
> ./u-boot -c "host bind 0 ../sd-p1.bin; ls host 0:0"
> ./u-boot -c "host bind 0 ../sd-p1.bin; ls host 0:0 /"
> ./u-boot -c "host bind 0 ../sd-p1.bin; ls host 0:0 /extlinux"
> ./u-boot -c "host bind 0 ../sd-p1.bin; ls host 0:0 /extlinux/"
> ./u-boot -c "host bind 0 ../sd-p1.bin; ls host 0:0 /extlinux/.."
> ./u-boot -c "host bind 0 ../sd-p1.bin; ls host 0:0 /extlinux/../"
> ./u-boot -c "host bind 0 ../sd-p1.bin; ls host 0:0 /extlinux/../backup"
> ./u-boot -c "host bind 0 ../sd-p1.bin; ls host 0:0 /extlinux/../backup/"
> ./u-boot -c "host bind 0 ../sd-p1.bin; ls host 0:0 /extlinux/../backup/.."
> ./u-boot -c "host bind 0 ../sd-p1.bin; ls host 0:0 /extlinux/../backup/../"
> ./u-boot -c "host bind 0 ../sd-p1.bin; load host 0:0 0 /bcm2835-rpi-cm.dtb"
> ./u-boot -c "host bind 0 ../sd-p1.bin; load host 0:0 0 /extlinux/../bcm2835-rpi-cm.dtb"
> ./u-boot -c "host bind 0 ../sd-p1.bin; load host 0:0 0 /backup/../bcm2835-rpi-cm.dtb"
> ./u-boot -c "host bind 0 ../sd-p1.bin; load host 0:0 0 /extlinux/..backup/../bcm2835-rpi-cm.dtb"
> ./u-boot -c "host bind 0 ../sd-p1.bin; load host 0:0 0 /extlinux/../backup/../bcm2835-rpi-cm.dtb"
> 
> (/extlinux and /backup are in different sectors so trigger some different
> cases, and bcm2835-rpi-cm.dtb is in a sector of the root directory other
> than the first).
> 
> In all honesty, this change is a bit of a hack, using goto and all.
> However, as demonstrated above it appears to work well in practice, is
> quite minimal, likely doesn't introduce any risk of regressions, and
> hopefully doesn't introduce any maintenance issues.
> 
> The correct fix would be to collapse the root and non-root loops in
> do_fat_read_at() and get_dentfromdir() into a single loop that has a
> small special-case when moving from one sector to the next, to handle
> the layout difference of root/non-root directories. AFAIK all other
> aspects of directory parsing are identical. However, that's a much
> larger change which needs significantly more thought before it's
> implemented.

  reply	other threads:[~2015-09-10 17:22 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-07-29  3:55 [U-Boot] [PATCH] fat: handle paths that include ../ Stephen Warren
2015-09-10 17:22 ` Stephen Warren [this message]
2015-09-10 22:26   ` Tom Rini
2015-09-11 17:01     ` Stephen Warren
2015-09-12 12:47 ` [U-Boot] " Tom Rini

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=55F1BC5B.1020200@wwwdotorg.org \
    --to=swarren@wwwdotorg.org \
    --cc=u-boot@lists.denx.de \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox