summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Klishin <klishinm@vmware.com>2022-01-04 12:46:34 +0400
committerMichael Klishin <michael@clojurewerkz.org>2022-01-04 13:07:03 +0400
commit18ad3582a4d374cb23471372d26899266e288341 (patch)
tree35fb981727523bfd5e5b4836593231ee0c66e8a5
parentfe545eaa7a60539e37b2d5e765549cb69b9208b6 (diff)
downloadrabbitmq-server-git-18ad3582a4d374cb23471372d26899266e288341.tar.gz
Merge pull request #3936 from rabbitmq/lukebakken/fix-all-read-file
Fix all uses of file:read_file/1 (cherry picked from commit c75ac14efad7bcb1d576ef01ec34e59b7a93ec22) Conflicts: deps/rabbit/src/rabbit_definitions_import_local_filesystem.erl
-rw-r--r--deps/rabbit/apps/rabbitmq_prelaunch/src/rabbit_prelaunch_conf.erl2
-rw-r--r--deps/rabbit/src/rabbit.erl2
-rw-r--r--deps/rabbit_common/src/rabbit_misc.erl24
-rw-r--r--deps/rabbit_common/src/rabbit_semver_parser.erl7
-rw-r--r--deps/rabbitmq_management/src/rabbit_mgmt_wm_health_check_certificate_expiration.erl2
-rw-r--r--deps/rabbitmq_peer_discovery_k8s/src/rabbit_peer_discovery_k8s.erl8
-rw-r--r--deps/rabbitmq_tracing/src/rabbit_tracing_files.erl2
-rw-r--r--deps/rabbitmq_tracing/src/rabbit_tracing_wm_file.erl2
-rw-r--r--deps/rabbitmq_trust_store/src/rabbit_trust_store_file_provider.erl6
9 files changed, 40 insertions, 15 deletions
diff --git a/deps/rabbit/apps/rabbitmq_prelaunch/src/rabbit_prelaunch_conf.erl b/deps/rabbit/apps/rabbitmq_prelaunch/src/rabbit_prelaunch_conf.erl
index 465166e415..5c39afc54d 100644
--- a/deps/rabbit/apps/rabbitmq_prelaunch/src/rabbit_prelaunch_conf.erl
+++ b/deps/rabbit/apps/rabbitmq_prelaunch/src/rabbit_prelaunch_conf.erl
@@ -483,7 +483,7 @@ get_passphrase(ConfigEntryDecoder) ->
io:format(IoDevice, "~n", []),
PP;
{file, Filename} ->
- {ok, File} = file:read_file(Filename),
+ {ok, File} = rabbit_misc:raw_read_file(Filename),
[PP|_] = binary:split(File, [<<"\r\n">>, <<"\n">>]),
PP;
PP ->
diff --git a/deps/rabbit/src/rabbit.erl b/deps/rabbit/src/rabbit.erl
index 64c29828f5..ba9c8ca5e5 100644
--- a/deps/rabbit/src/rabbit.erl
+++ b/deps/rabbit/src/rabbit.erl
@@ -1462,7 +1462,7 @@ motd() ->
undefined ->
undefined;
File ->
- case file:read_file(File) of
+ case rabbit_misc:raw_read_file(File) of
{ok, MOTD} -> string:trim(MOTD, trailing, [$\r,$\n]);
{error, _} -> undefined
end
diff --git a/deps/rabbit_common/src/rabbit_misc.erl b/deps/rabbit_common/src/rabbit_misc.erl
index 01a0dc0bf0..6501aa97e3 100644
--- a/deps/rabbit_common/src/rabbit_misc.erl
+++ b/deps/rabbit_common/src/rabbit_misc.erl
@@ -13,6 +13,8 @@
-include("rabbit_framing.hrl").
-include("rabbit_misc.hrl").
+-include_lib("kernel/include/file.hrl").
+
-ifdef(TEST).
-export([decompose_pid/1, compose_pid/4]).
-endif.
@@ -79,6 +81,7 @@
-export([rpc_call/4, rpc_call/5]).
-export([get_gc_info/1]).
-export([group_proplists_by/2]).
+-export([raw_read_file/1]).
%% Horrible macro to use in guards
-define(IS_BENIGN_EXIT(R),
@@ -1222,7 +1225,7 @@ version() ->
otp_release() ->
File = filename:join([code:root_dir(), "releases",
erlang:system_info(otp_release), "OTP_VERSION"]),
- case file:read_file(File) of
+ case raw_read_file(File) of
{ok, VerBin} ->
%% 17.0 or later, we need the file for the minor version
string:strip(binary_to_list(VerBin), both, $\n);
@@ -1403,6 +1406,25 @@ rpc_call(Node, Mod, Fun, Args, Timeout) ->
get_gc_info(Pid) ->
rabbit_runtime:get_gc_info(Pid).
+-spec raw_read_file(Filename) -> {ok, Binary} | {error, Reason} when
+ Filename :: file:name_all(),
+ Binary :: binary(),
+ Reason :: file:posix() | badarg | terminated | system_limit.
+raw_read_file(File) ->
+ try
+ % Note: this works around the win32 file leak in file:read_file/1
+ % https://github.com/erlang/otp/issues/5527
+ {ok, FInfo} = file:read_file_info(File, [raw]),
+ {ok, Fd} = file:open(File, [read, raw, binary]),
+ try
+ file:read(Fd, FInfo#file_info.size)
+ after
+ file:close(Fd)
+ end
+ catch
+ error:{badmatch, Error} -> Error
+ end.
+
%% -------------------------------------------------------------------------
%% Begin copypasta from gen_server2.erl
diff --git a/deps/rabbit_common/src/rabbit_semver_parser.erl b/deps/rabbit_common/src/rabbit_semver_parser.erl
index 3a036021f7..0456de1ae4 100644
--- a/deps/rabbit_common/src/rabbit_semver_parser.erl
+++ b/deps/rabbit_common/src/rabbit_semver_parser.erl
@@ -15,9 +15,12 @@
-define(p_zero_or_more,true).
-
-spec file(file:name()) -> any().
-file(Filename) -> case file:read_file(Filename) of {ok,Bin} -> parse(Bin); Err -> Err end.
+file(Filename) ->
+ case rabbit_misc:raw_read_file(Filename) of
+ {ok,Bin} -> parse(Bin);
+ Err -> Err
+ end.
-spec parse(binary() | list()) -> any().
parse(List) when is_list(List) -> parse(unicode:characters_to_binary(List));
diff --git a/deps/rabbitmq_management/src/rabbit_mgmt_wm_health_check_certificate_expiration.erl b/deps/rabbitmq_management/src/rabbit_mgmt_wm_health_check_certificate_expiration.erl
index 3d6dcd1062..fe0944fb79 100644
--- a/deps/rabbitmq_management/src/rabbit_mgmt_wm_health_check_certificate_expiration.erl
+++ b/deps/rabbitmq_management/src/rabbit_mgmt_wm_health_check_certificate_expiration.erl
@@ -127,7 +127,7 @@ read_cert(undefined) ->
read_cert({pem, Pem}) ->
Pem;
read_cert(Path) ->
- case file:read_file(Path) of
+ case rabbit_misc:raw_read_file(Path) of
{ok, Bin} ->
Bin;
Err ->
diff --git a/deps/rabbitmq_peer_discovery_k8s/src/rabbit_peer_discovery_k8s.erl b/deps/rabbitmq_peer_discovery_k8s/src/rabbit_peer_discovery_k8s.erl
index 2e8970877c..2cb7b9ea59 100644
--- a/deps/rabbitmq_peer_discovery_k8s/src/rabbit_peer_discovery_k8s.erl
+++ b/deps/rabbitmq_peer_discovery_k8s/src/rabbit_peer_discovery_k8s.erl
@@ -118,7 +118,7 @@ get_config_key(Key, Map) ->
make_request() ->
M = ?CONFIG_MODULE:config_map(?BACKEND_CONFIG_KEY),
- {ok, Token} = file:read_file(get_config_key(k8s_token_path, M)),
+ {ok, Token} = rabbit_misc:raw_read_file(get_config_key(k8s_token_path, M)),
Token1 = binary:replace(Token, <<"\n">>, <<>>),
?HTTPC_MODULE:get(
get_config_key(k8s_scheme, M),
@@ -169,7 +169,7 @@ extract_node_list(Response) ->
-spec base_path(events | endpoints, term()) -> string().
base_path(Type, Args) ->
M = ?CONFIG_MODULE:config_map(?BACKEND_CONFIG_KEY),
- {ok, Namespace} = file:read_file(get_config_key(k8s_namespace_path, M)),
+ {ok, Namespace} = rabbit_misc:raw_read_file(get_config_key(k8s_namespace_path, M)),
NameSpace1 = binary:replace(Namespace, <<"\n">>, <<>>),
rabbit_peer_discovery_httpc:build_path([api, v1, namespaces, NameSpace1, Type, Args]).
@@ -219,9 +219,9 @@ generate_v1_event(Namespace, Name, Type, Reason, Message, Timestamp, HostName) -
-spec send_event(term(),term(), term()) -> {ok, term()} | {error, term()}.
send_event(Type, Reason, Message) ->
M = ?CONFIG_MODULE:config_map(?BACKEND_CONFIG_KEY),
- {ok, Token} = file:read_file(get_config_key(k8s_token_path, M)),
+ {ok, Token} = rabbit_misc:raw_read_file(get_config_key(k8s_token_path, M)),
Token1 = binary:replace(Token, <<"\n">>, <<>>),
- {ok, NameSpace} = file:read_file(
+ {ok, NameSpace} = rabbit_misc:raw_read_file(
get_config_key(k8s_namespace_path, M)),
NameSpace1 = binary:replace(NameSpace, <<"\n">>, <<>>),
diff --git a/deps/rabbitmq_tracing/src/rabbit_tracing_files.erl b/deps/rabbitmq_tracing/src/rabbit_tracing_files.erl
index 7fb0e66a93..989351b622 100644
--- a/deps/rabbitmq_tracing/src/rabbit_tracing_files.erl
+++ b/deps/rabbitmq_tracing/src/rabbit_tracing_files.erl
@@ -37,7 +37,7 @@ full_path(Name0) ->
%%--------------------------------------------------------------------
file_info(Name) ->
- Size = case file:read_file_info(full_path(Name)) of
+ Size = case file:read_file_info(full_path(Name), [raw]) of
{ok, Info} ->
Info#file_info.size;
{error, Error} ->
diff --git a/deps/rabbitmq_tracing/src/rabbit_tracing_wm_file.erl b/deps/rabbitmq_tracing/src/rabbit_tracing_wm_file.erl
index 042e76e296..93fbc18367 100644
--- a/deps/rabbitmq_tracing/src/rabbit_tracing_wm_file.erl
+++ b/deps/rabbitmq_tracing/src/rabbit_tracing_wm_file.erl
@@ -39,7 +39,7 @@ serve(ReqData, Context) ->
serve(Name) ->
Path = rabbit_tracing_files:full_path(Name),
- {ok, Content} = file:read_file(Path),
+ {ok, Content} = rabbit_misc:raw_read_file(Path),
Content.
delete_resource(ReqData, Context) ->
diff --git a/deps/rabbitmq_trust_store/src/rabbit_trust_store_file_provider.erl b/deps/rabbitmq_trust_store/src/rabbit_trust_store_file_provider.erl
index 4ed98af1f5..3b098123dc 100644
--- a/deps/rabbitmq_trust_store/src/rabbit_trust_store_file_provider.erl
+++ b/deps/rabbitmq_trust_store/src/rabbit_trust_store_file_provider.erl
@@ -47,7 +47,7 @@ extract_cert(Path, FileName) ->
scan_then_parse(Absolute).
scan_then_parse(Filename) when is_list(Filename) ->
- {ok, Bin} = file:read_file(Filename),
+ {ok, Bin} = rabbit_misc:raw_read_file(Filename),
[{'Certificate', Data, not_encrypted}] = public_key:pem_decode(Bin),
Data.
@@ -64,11 +64,11 @@ list_certs_0(Path) ->
FileNames).
modification_time(Path) ->
- {ok, Info} = file:read_file_info(Path, [{time, posix}]),
+ {ok, Info} = file:read_file_info(Path, [raw, {time, posix}]),
Info#file_info.mtime.
file_content_hash(Path) ->
- {ok, Data} = file:read_file(Path),
+ {ok, Data} = rabbit_misc:raw_read_file(Path),
erlang:phash2(Data).
directory_path(Config) ->