File 0299-Expose-Error-in-public_key-cacerts_get-0-if-Bundle-i.patch of Package erlang
From 7693116468bfc85d607c6339add3a206b2186472 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonatan=20M=C3=A4nnchen?= <jonatan@maennchen.ch>
Date: Thu, 25 May 2023 13:56:20 +0200
Subject: [PATCH] Expose Error in public_key:cacerts_get/0 if Bundle is not
found (#7295)
---
lib/public_key/src/pubkey_os_cacerts.erl | 46 ++++++++++++++++++++++--
1 file changed, 43 insertions(+), 3 deletions(-)
diff --git a/lib/public_key/src/pubkey_os_cacerts.erl b/lib/public_key/src/pubkey_os_cacerts.erl
index 93f0e48353..4d577fd63e 100644
--- a/lib/public_key/src/pubkey_os_cacerts.erl
+++ b/lib/public_key/src/pubkey_os_cacerts.erl
@@ -23,7 +23,7 @@
-module(pubkey_os_cacerts).
-include("public_key.hrl").
--export([load/0, load/1, get/0, clear/0]).
+-export([load/0, load/1, get/0, clear/0, format_error/2]).
-on_load(on_load/0).
-nifs([os_cacerts/0]).
@@ -35,8 +35,16 @@
get() ->
case persistent_term:get(?MODULE, not_loaded) of
not_loaded ->
- ok = load(),
- persistent_term:get(?MODULE);
+ case load() of
+ ok ->
+ persistent_term:get(?MODULE);
+ {error, Reason} ->
+ erlang:error(
+ {failed_load_cacerts, conv_error_reason(Reason)},
+ none,
+ [{error_info, #{cause => Reason, module => ?MODULE}}]
+ )
+ end;
CaCerts ->
CaCerts
end.
@@ -216,3 +224,35 @@ load_nif() ->
end;
Error1 -> Error1
end.
+
+%%%
+%%% Error Handling
+%%%
+
+conv_error_reason(enoent) -> enoent;
+conv_error_reason({enotsup, _OS}) -> enotsup;
+conv_error_reason({eopnotsupp, _Reason}) -> eopnotsupp;
+conv_error_reason({eopnotsupp, _Status, _Acc}) -> eopnotsupp.
+
+-spec format_error(Reason, StackTrace) -> ErrorMap when
+ Reason :: term(),
+ StackTrace :: erlang:stacktrace(),
+ ErrorMap :: #{pos_integer() => unicode:chardata(),
+ general => unicode:chardata(),
+ reason => unicode:chardata()}.
+
+format_error(Reason, [{_M, _F, _As, Info} | _]) ->
+ ErrorInfoMap = proplists:get_value(error_info, Info, #{}),
+ Cause = maps:get(cause, ErrorInfoMap, none),
+ Message = case Cause of
+ enoent ->
+ "operating system CA bundle could not be located";
+ {enotsup, OS} ->
+ io_lib:format("operating system ~p is not supported", [OS]);
+ {eopnotsupp, SubReason} ->
+ io_lib:format("operation failed because of ~p", [SubReason]);
+ {eopnotsupp, Status, _Acc} ->
+ io_lib:format("operation failed with status ~B", [Status])
+ end,
+ #{general => io_lib:format("Failed to load cacerts: ~s", [Message]),
+ reason => io_lib:format("~p: ~p", [?MODULE, Reason])}.
--
2.35.3