fix failure of glob to match broken symlinks under some conditions
authorRich Felker <dalias@aerifal.cx>
Thu, 11 Jul 2019 20:55:17 +0000 (16:55 -0400)
committerRich Felker <dalias@aerifal.cx>
Wed, 7 Aug 2019 06:38:45 +0000 (02:38 -0400)
commite408deefeb1a60b6e9e1bb63393590926f96ee64
tree96116a6faec49580bc3cd200ed08e15be7f66b65
parentd493206de7df4db07ad34f24701539ba0a6ed38c
fix failure of glob to match broken symlinks under some conditions

when the pattern ended with one or more literal path components, or
when the GLOB_MARK flag was passed to request that glob flag directory
results and the type obtained by readdir was unknown or inconclusive
(symlink), the stat function was called to evaluate existence and/or
determine type. however, stat fails with ENOENT for broken symlinks,
and this caused the match to be omitted from the results.

instead, use stat only for the unknown/inconclusive cases with
GLOB_MARK, and otherwise, or if stat fails, use lstat existence still
needs to be determined. this minimizes the number of costly syscalls,
performing both only in the case where GLOB_MARK is in use and there
is a final literal path component which is a broken symlink.

based on/simplified from patch by James Y Knight.
src/regex/glob.c