A new user interface for you! Read more...

File 0400-stdlib-Let-dets-open_file-crash-when-given-raw-file-.patch of Package erlang

From 4734964a6290c32fc20095d46140053e193379f5 Mon Sep 17 00:00:00 2001
From: Hans Bolinder <hasse@erlang.org>
Date: Tue, 21 Aug 2018 08:10:50 +0200
Subject: [PATCH] stdlib: Let dets:open_file() crash when given raw file name

See also ERL-55 and OTP-13229.
---
 lib/stdlib/src/dets.erl        | 23 ++++++++++++++---------
 lib/stdlib/test/dets_SUITE.erl | 15 +++++++++++++++
 2 files changed, 29 insertions(+), 9 deletions(-)

diff --git a/lib/stdlib/src/dets.erl b/lib/stdlib/src/dets.erl
index e016d5a80e..0488c2bef2 100644
--- a/lib/stdlib/src/dets.erl
+++ b/lib/stdlib/src/dets.erl
@@ -616,12 +616,18 @@ next(Tab, Key) ->
 %% Assuming that a file already exists, open it with the
 %% parameters as already specified in the file itself.
 %% Return a ref leading to the file.
-open_file(File) ->
-    case dets_server:open_file(to_list(File)) of
-        badarg -> % Should not happen.
-            erlang:error(dets_process_died, [File]);
-        Reply -> 
-            einval(Reply, [File])
+open_file(File0) ->
+    File = to_list(File0),
+    case is_list(File) of
+        true ->
+            case dets_server:open_file(File) of
+                badarg -> % Should not happen.
+                    erlang:error(dets_process_died, [File]);
+                Reply ->
+                    einval(Reply, [File])
+            end;
+        false ->
+	    erlang:error(badarg, [File0])
     end.
 
 -spec open_file(Name, Args) -> {'ok', Name} | {'error', Reason} when
@@ -1088,6 +1094,7 @@ defaults(Tab, Args) ->
                            debug = false},
     Fun = fun repl/2,
     Defaults = lists:foldl(Fun, Defaults0, Args),
+    true = is_list(Defaults#open_args.file),
     is_comp_min_max(Defaults).
 
 to_list(T) when is_atom(T) -> atom_to_list(T);
@@ -1112,9 +1119,7 @@ repl({delayed_write, {Delay,Size} = C}, Defs)
     Defs#open_args{delayed_write = C};
 repl({estimated_no_objects, I}, Defs)  ->
     repl({min_no_slots, I}, Defs);
-repl({file, File}, Defs) when is_list(File) ->
-    Defs#open_args{file = File};
-repl({file, File}, Defs) when is_atom(File) ->
+repl({file, File}, Defs) ->
     Defs#open_args{file = to_list(File)};
 repl({keypos, P}, Defs) when is_integer(P), P > 0 ->
     Defs#open_args{keypos =P};
diff --git a/lib/stdlib/test/dets_SUITE.erl b/lib/stdlib/test/dets_SUITE.erl
index fe324391af..65977a764a 100644
--- a/lib/stdlib/test/dets_SUITE.erl
+++ b/lib/stdlib/test/dets_SUITE.erl
@@ -3417,6 +3417,7 @@ otp_11709(Config) when is_list(Config) ->
     ok.
 
 %% OTP-13229. open_file() exits with badarg when given binary file name.
+%% Also OTP-15253.
 otp_13229(_Config) ->
     F = <<"binfile.tab">>,
     try dets:open_file(name, [{file, F}]) of
@@ -3425,6 +3426,20 @@ otp_13229(_Config) ->
     catch
         error:badarg ->
             ok
+    end,
+    try dets:open_file(F, []) of % OTP-15253
+        R2 ->
+            exit({open_succeeded, R2})
+    catch
+        error:badarg ->
+            ok
+    end,
+    try dets:open_file(F) of
+        R3 ->
+            exit({open_succeeded, R3})
+    catch
+        error:badarg ->
+            ok
     end.
 
 %% OTP-13260. Race when opening a table.
-- 
2.16.4