diff options
author | Björn Gustavsson <[email protected]> | 2019-08-23 14:50:52 +0200 |
---|---|---|
committer | Björn Gustavsson <[email protected]> | 2019-08-23 14:50:52 +0200 |
commit | 4a055cbed15129dcb63384a3c24c07513cdcb88b (patch) | |
tree | eee62316d5adefe4ac4688ce6f08869e61185483 /lib/stdlib/src | |
parent | 1b9555761cee3ff018a86dc1762792b5bda26c23 (diff) | |
parent | a7c5d6c80d6879cb1c67b60632ac31c5459c26d4 (diff) | |
download | otp-4a055cbed15129dcb63384a3c24c07513cdcb88b.tar.gz otp-4a055cbed15129dcb63384a3c24c07513cdcb88b.tar.bz2 otp-4a055cbed15129dcb63384a3c24c07513cdcb88b.zip |
Merge branch 'maint'
* maint:
Fix filelib:wildcard/1,2 for patterns containing ".." and/or "@"
Diffstat (limited to 'lib/stdlib/src')
-rw-r--r-- | lib/stdlib/src/filelib.erl | 32 |
1 files changed, 27 insertions, 5 deletions
diff --git a/lib/stdlib/src/filelib.erl b/lib/stdlib/src/filelib.erl index de839be5cf..d1a5a4dc35 100644 --- a/lib/stdlib/src/filelib.erl +++ b/lib/stdlib/src/filelib.erl @@ -281,6 +281,14 @@ do_wildcard_2([], _, Result, _Mod) -> do_wildcard_3(Base, [[double_star]|Rest], Result, Mod) -> do_double_star(".", [Base], Rest, Result, Mod, true); +do_wildcard_3(Base, [".."|Rest], Result, Mod) -> + case do_is_dir(Base, Mod) of + true -> + Matches = [filename:join(Base, "..")], + do_wildcard_2(Matches, Rest, Result, Mod); + false -> + Result + end; do_wildcard_3(Base0, [Pattern|Rest], Result, Mod) -> case do_list_dir(Base0, Mod) of {ok, Files} -> @@ -387,15 +395,29 @@ compile_wildcard(Pattern0, Cwd0) -> end. compile_wildcard_2([Part|Rest], Root) -> - case compile_part(Part) of - Part -> - compile_wildcard_2(Rest, compile_join(Root, Part)); - Pattern -> - compile_wildcard_3(Rest, [Pattern,Root]) + Pattern = compile_part(Part), + case is_literal_pattern(Pattern) of + true -> + %% Add this literal pattern to the literal pattern prefix. + %% This is an optimization to avoid listing all files of + %% a directory only to discard all but one. For example, + %% without this optimizaton, there would be three + %% redundant directory listings when executing this + %% wildcard: "./lib/compiler/ebin/*.beam" + compile_wildcard_2(Rest, compile_join(Root, Pattern)); + false -> + %% This is the end of the literal prefix. Compile the + %% rest of the pattern. + compile_wildcard_3(Rest, [Pattern,Root]) end; compile_wildcard_2([], {root,PrefixLen,Root}) -> {{exists,Root},PrefixLen}. +is_literal_pattern([H|T]) -> + is_integer(H) andalso is_literal_pattern(T); +is_literal_pattern([]) -> + true. + compile_wildcard_3([Part|Rest], Result) -> compile_wildcard_3(Rest, [compile_part(Part)|Result]); compile_wildcard_3([], Result) -> |