aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSverker Eriksson <[email protected]>2016-04-14 15:15:48 +0200
committerSverker Eriksson <[email protected]>2016-04-14 15:15:48 +0200
commit965aabe043074edbeca06ee2083c06be731c939b (patch)
treef65e329a6b055fe38a68d63c3a997eeb8f60df0b
parent04e79317308588af47f236469e9d286dccc177ec (diff)
parent588ed7d503f7f607ec91d102f16573ee5d64ea7b (diff)
downloadotp-965aabe043074edbeca06ee2083c06be731c939b.tar.gz
otp-965aabe043074edbeca06ee2083c06be731c939b.tar.bz2
otp-965aabe043074edbeca06ee2083c06be731c939b.zip
Merge branch 'sverker/erts/open_port-improper-args.ERL-127.OTP-13489'
-rw-r--r--erts/emulator/beam/erl_bif_port.c2
-rw-r--r--erts/emulator/test/port_SUITE.erl29
2 files changed, 27 insertions, 4 deletions
diff --git a/erts/emulator/beam/erl_bif_port.c b/erts/emulator/beam/erl_bif_port.c
index 648f33744a..71b6d78094 100644
--- a/erts/emulator/beam/erl_bif_port.c
+++ b/erts/emulator/beam/erl_bif_port.c
@@ -985,6 +985,8 @@ static char **convert_args(Eterm l)
}
n = erts_list_length(l);
+ if (n < 0)
+ return NULL;
/* We require at least one element in argv[0] + NULL at end */
pp = erts_alloc(ERTS_ALC_T_TMP, (n + 2) * sizeof(char **));
pp[i++] = erts_default_arg0;
diff --git a/erts/emulator/test/port_SUITE.erl b/erts/emulator/test/port_SUITE.erl
index 0c43283cad..79abcbde5f 100644
--- a/erts/emulator/test/port_SUITE.erl
+++ b/erts/emulator/test/port_SUITE.erl
@@ -87,6 +87,7 @@
name1/1,
t_binary/1, parallell/1, t_exit/1,
env/1, huge_env/1, bad_env/1, cd/1, exit_status/1,
+ bad_args/1,
tps_16_bytes/1, tps_1K/1, line/1, stderr_to_stdout/1,
otp_3906/1, otp_4389/1, win_massive/1, win_massive_client/1,
mix_up_ports/1, otp_5112/1, otp_5119/1, otp_6224/1,
@@ -115,6 +116,7 @@ all() ->
{group, multiple_packets}, parallell, dying_port,
port_program_with_path, open_input_file_port,
open_output_file_port, name1, env, huge_env, bad_env, cd,
+ bad_args,
exit_status, iter_max_ports, count_fds, t_exit, {group, tps}, line,
stderr_to_stdout, otp_3906, otp_4389, win_massive,
mix_up_ports, otp_5112, otp_5119,
@@ -901,10 +903,11 @@ bad_env(Config) when is_list(Config) ->
ok.
try_bad_env(Env) ->
- try open_port({spawn,"ls"}, [{env,Env}])
- catch
- error:badarg -> ok
- end.
+ badarg = try open_port({spawn,"ls"}, [{env,Env}])
+ catch
+ error:badarg -> badarg
+ end.
+
%% Test that we can handle a very very large environment gracefully.
huge_env(Config) when is_list(Config) ->
@@ -940,6 +943,24 @@ huge_env(Config) when is_list(Config) ->
end.
+%% Test bad 'args' options.
+bad_args(Config) when is_list(Config) ->
+ try_bad_args({args, [self()]}),
+ try_bad_args({args, ["head" | "tail"]}),
+ try_bad_args({args, ["head", "body" | "tail"]}),
+ try_bad_args({args, [<<"head">>, <<"body">> | <<"tail">>]}),
+ try_bad_args({args, not_a_list}),
+ try_bad_args({args, ["string",<<"binary">>, 1472, "string"]}),
+ try_bad_args({args, ["string",<<"binary">>], "element #3"}),
+ ok.
+
+try_bad_args(Args) ->
+ badarg = try open_port({spawn_executable,"ls"}, [Args])
+ catch
+ error:badarg -> badarg
+ end.
+
+
%% 'cd' option
%% (Can perhaps be made smaller by calling the other utility functions