File 0676-stdlib-Improve-error-handling-in-uri_string-normaliz.patch of Package erlang

From 5bc1f3643c9b0288c2c5f5c2d4d953228cb336f5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?P=C3=A9ter=20Dimitrov?= <peterdmv@erlang.org>
Date: Fri, 10 Jan 2020 11:59:36 +0100
Subject: [PATCH] stdlib: Improve error handling in uri_string:normalize/2

---
 lib/stdlib/src/uri_string.erl        | 25 +++++++++++++++++--------
 lib/stdlib/test/uri_string_SUITE.erl | 12 ++++++++++++
 2 files changed, 29 insertions(+), 8 deletions(-)

diff --git a/lib/stdlib/src/uri_string.erl b/lib/stdlib/src/uri_string.erl
index 18ee8375c7..315e5700eb 100644
--- a/lib/stdlib/src/uri_string.erl
+++ b/lib/stdlib/src/uri_string.erl
@@ -297,10 +297,7 @@
       NormalizedURI :: uri_string()
                      | error().
 normalize(URIMap) ->
-    try normalize(URIMap, [])
-    catch
-        throw:{error, Atom, RestData} -> {error, Atom, RestData}
-    end.
+    normalize(URIMap, []).
 
 
 -spec normalize(URI, Options) -> NormalizedURI when
@@ -309,20 +306,32 @@ normalize(URIMap) ->
       NormalizedURI :: uri_string() | uri_map()
                      | error().
 normalize(URIMap, []) when is_map(URIMap) ->
-    recompose(normalize_map(URIMap));
+    try recompose(normalize_map(URIMap))
+    catch
+        throw:{error, Atom, RestData} -> {error, Atom, RestData}
+    end;
 normalize(URIMap, [return_map]) when is_map(URIMap) ->
-    normalize_map(URIMap);
+    try normalize_map(URIMap)
+    catch
+        throw:{error, Atom, RestData} -> {error, Atom, RestData}
+    end;
 normalize(URIString, []) ->
     case parse(URIString) of
         Value when is_map(Value) ->
-            recompose(normalize_map(Value));
+            try recompose(normalize_map(Value))
+            catch
+                throw:{error, Atom, RestData} -> {error, Atom, RestData}
+            end;
         Error ->
             Error
     end;
 normalize(URIString, [return_map]) ->
     case parse(URIString) of
         Value when is_map(Value) ->
-            normalize_map(Value);
+            try normalize_map(Value)
+            catch
+                throw:{error, Atom, RestData} -> {error, Atom, RestData}
+            end;
         Error ->
             Error
     end.
diff --git a/lib/stdlib/test/uri_string_SUITE.erl b/lib/stdlib/test/uri_string_SUITE.erl
index 55ba75bd5f..0829fcd915 100644
--- a/lib/stdlib/test/uri_string_SUITE.erl
+++ b/lib/stdlib/test/uri_string_SUITE.erl
@@ -29,6 +29,7 @@
          normalize_pct_encoded_userinfo/1,
          normalize_pct_encoded_query/1,
          normalize_pct_encoded_fragment/1,
+         normalize_pct_encoded_negative/1,
          parse_binary_fragment/1, parse_binary_host/1, parse_binary_host_ipv4/1,
          parse_binary_host_ipv6/1,
          parse_binary_path/1, parse_binary_pct_encoded_fragment/1, parse_binary_pct_encoded_query/1,
@@ -86,6 +87,7 @@ all() ->
      normalize_pct_encoded_userinfo,
      normalize_pct_encoded_query,
      normalize_pct_encoded_fragment,
+     normalize_pct_encoded_negative,
      parse_binary_scheme,
      parse_binary_userinfo,
      parse_binary_pct_encoded_userinfo,
@@ -1139,6 +1141,16 @@ normalize_pct_encoded_fragment(_Config) ->
     #{host := "example.com", path := "/", fragment := "合気道"} =
         uri_string:normalize("//example.com/#%E5%90%88%E6%B0%97%E9%81%93", [return_map]).
 
+normalize_pct_encoded_negative(_Config) ->
+    {error,invalid_utf8,<<0,0,0,246>>} =
+        uri_string:normalize(#{host => "%00%00%00%F6",path => []}, [return_map]),
+    {error,invalid_utf8,<<0,0,0,246>>} =
+        uri_string:normalize(#{host => "%00%00%00%F6",path => []}, []),
+    {error,invalid_utf8,<<0,0,0,246>>} =
+        uri_string:normalize("//%00%00%00%F6", [return_map]),
+    {error,invalid_utf8,<<0,0,0,246>>} =
+        uri_string:normalize("//%00%00%00%F6", []).
+
 interop_query_utf8(_Config) ->
     Q = uri_string:compose_query([{"foo bar","1"}, {"合", "2"}]),
     Uri = uri_string:recompose(#{path => "/", query => Q}),
-- 
2.16.4

openSUSE Build Service is sponsored by