[U-Boot] [PATCH] fat: handle paths that include ../

Stephen Warren swarren at wwwdotorg.org
Thu Sep 10 19:22:35 CEST 2015


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.



More information about the U-Boot mailing list