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

openSUSE Build Service is sponsored by