File 0927-Fix-filelib-wildcard-1-2-for-not-a-directory.patch of Package erlang
From f7bc9fc284a46b906dba5c935628855adbc7a258 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Gustavsson?= <bjorn@erlang.org>
Date: Wed, 3 Jun 2020 13:29:24 +0200
Subject: [PATCH] Fix filelib:wildcard/1,2 for "not-a-directory/.."
---
lib/stdlib/src/filelib.erl | 38 +++++++++++++++++++++++++++----
lib/stdlib/test/filelib_SUITE.erl | 2 ++
2 files changed, 36 insertions(+), 4 deletions(-)
diff --git a/lib/stdlib/src/filelib.erl b/lib/stdlib/src/filelib.erl
index 565f00b0a5..7f8c282a79 100644
--- a/lib/stdlib/src/filelib.erl
+++ b/lib/stdlib/src/filelib.erl
@@ -268,9 +268,9 @@ do_wildcard(Pattern, Cwd, Mod) ->
lists:sort(Files).
do_wildcard_1({exists,File}, Mod) ->
- case eval_read_link_info(File, Mod) of
- {ok,_} -> [File];
- _ -> []
+ case exists(File, Mod) of
+ true -> [File];
+ false -> []
end;
do_wildcard_1([Base|Rest], Mod) ->
do_wildcard_2([Base], Rest, [], Mod).
@@ -562,6 +562,36 @@ wrap_escapes([]) ->
badpattern(Reason) ->
error({badpattern,Reason}).
+exists(File, Mod) ->
+ case eval_read_link_info(File, Mod) of
+ {error, _} ->
+ false;
+ {ok, _Info} ->
+ case os:type() of
+ {win32,_} ->
+ do_exists(filename:split(File), Mod, []);
+ _ ->
+ true
+ end
+ end.
+
+do_exists([P,".."|Ps], Mod, Acc) ->
+ %% On Windows, "pathname/.." will seem to exist even if pathname
+ %% does not refer to a directory.
+ Path = case Acc of
+ [] -> P;
+ _ -> filename:join(lists:reverse(Acc, [P]))
+ end,
+ case eval_read_link_info(Path, Mod) of
+ {ok, #file_info{type=directory}} ->
+ do_exists(Ps, Mod, Acc);
+ _ ->
+ false
+ end;
+do_exists([P|Ps], Mod, Acc) ->
+ do_exists(Ps, Mod, [P|Acc]);
+do_exists([], _, _) -> true.
+
eval_read_file_info(File, file) ->
file:read_file_info(File);
eval_read_file_info(File, erl_prim_loader) ->
diff --git a/lib/stdlib/test/filelib_SUITE.erl b/lib/stdlib/test/filelib_SUITE.erl
index 367dd6b407..203ba2c31e 100644
--- a/lib/stdlib/test/filelib_SUITE.erl
+++ b/lib/stdlib/test/filelib_SUITE.erl
@@ -123,6 +123,8 @@ wcc(Wc, Error) ->
{'EXIT',{{badpattern,Error},
[{filelib,wildcard,2,_}|_]}} = (catch filelib:wildcard(Wc, ".")).
+disable_prefix_opt([_,$:|_]=Wc) ->
+ Wc;
disable_prefix_opt([C|Wc]) when $a =< C, C =< $z; C =:= $@ ->
%% There is an optimization for patterns that have a literal prefix
%% (such as "lib/compiler/ebin/*"). Test that we'll get the same result
--
2.26.2