File 0924-fix-erts-t-P-Q-arg-overflow.patch of Package erlang
From 239be88d7e11509a406a33da93cba4666b45a905 Mon Sep 17 00:00:00 2001
From: Marko Mindek <marko.mindek@gmail.com>
Date: Fri, 4 Apr 2025 15:25:35 +0200
Subject: [PATCH 1/2] fix: erts +t, +P, +Q arg overflow
---
erts/emulator/beam/erl_init.c | 26 ++++++++++++++++----------
erts/test/erlexec_SUITE.erl | 18 ++++++++++++++++--
2 files changed, 32 insertions(+), 12 deletions(-)
diff --git a/erts/emulator/beam/erl_init.c b/erts/emulator/beam/erl_init.c
index 51b801b7cd..53409912e2 100644
--- a/erts/emulator/beam/erl_init.c
+++ b/erts/emulator/beam/erl_init.c
@@ -1820,14 +1820,16 @@ erl_start(int argc, char **argv)
if (sys_strcmp(arg, "legacy") == 0)
legacy_proc_tab = 1;
else {
+ long val;
errno = 0;
- proc_tab_sz = strtol(arg, NULL, 10);
+ val = strtol(arg, NULL, 10);
if (errno != 0
- || proc_tab_sz < ERTS_MIN_PROCESSES
- || ERTS_MAX_PROCESSES < proc_tab_sz) {
+ || val < ERTS_MIN_PROCESSES
+ || ERTS_MAX_PROCESSES < val) {
erts_fprintf(stderr, "bad number of processes %s\n", arg);
erts_usage();
}
+ proc_tab_sz=val;
}
break;
@@ -1836,14 +1838,16 @@ erl_start(int argc, char **argv)
if (sys_strcmp(arg, "legacy") == 0)
legacy_port_tab = 1;
else {
+ long val;
errno = 0;
- port_tab_sz = strtol(arg, NULL, 10);
+ val = strtol(arg, NULL, 10);
if (errno != 0
- || port_tab_sz < ERTS_MIN_PORTS
- || ERTS_MAX_PORTS < port_tab_sz) {
+ || val < ERTS_MIN_PORTS
+ || ERTS_MAX_PORTS < val) {
erts_fprintf(stderr, "bad number of ports %s\n", arg);
erts_usage();
}
+ port_tab_sz = val;
port_tab_sz_ignore_files = 1;
}
break;
@@ -2160,15 +2164,17 @@ erl_start(int argc, char **argv)
}
case 't':
/* set atom table size */
- arg = get_arg(argv[i]+2, argv[i+1], &i);
+ long val;
+ arg = get_arg(argv[i]+2, argv[i+1], &i);
errno = 0;
- erts_atom_table_size = strtol(arg, NULL, 10);
+ val = strtol(arg, NULL, 10);
if (errno != 0 ||
- erts_atom_table_size < MIN_ATOM_TABLE_SIZE ||
- erts_atom_table_size > MAX_ATOM_TABLE_SIZE) {
+ val < MIN_ATOM_TABLE_SIZE ||
+ val > MAX_ATOM_TABLE_SIZE) {
erts_fprintf(stderr, "bad atom table size %s\n", arg);
erts_usage();
}
+ erts_atom_table_size=val;
VERBOSE(DEBUG_SYSTEM,
("setting maximum number of atoms to %d\n",
erts_atom_table_size));
diff --git a/erts/test/erlexec_SUITE.erl b/erts/test/erlexec_SUITE.erl
index 37c4739917..60544e5323 100644
--- a/erts/test/erlexec_SUITE.erl
+++ b/erts/test/erlexec_SUITE.erl
@@ -32,7 +32,8 @@
-export([args_file/1, evil_args_file/1, missing_args_file/1, env/1, args_file_env/1,
otp_7461/1, otp_7461_remote/1, argument_separation/1, argument_with_option/1,
- zdbbl_dist_buf_busy_limit/1, long_path_env/1, long_path_env_when_rootdir_not_present/1]).
+ zdbbl_dist_buf_busy_limit/1, long_path_env/1, long_path_env_when_rootdir_not_present/1,
+ argument_too_large/1]).
-include_lib("stdlib/include/assert.hrl").
@@ -43,7 +44,7 @@ suite() ->
all() ->
[args_file, evil_args_file, missing_args_file, env, args_file_env,
otp_7461, argument_separation, argument_with_option, zdbbl_dist_buf_busy_limit,
- long_path_env, long_path_env_when_rootdir_not_present].
+ long_path_env, long_path_env_when_rootdir_not_present, argument_too_large].
init_per_suite(Config) ->
[{suite_erl_flags, save_env()} | Config].
@@ -492,6 +493,19 @@ long_path_env_when_rootdir_not_present(Config) when is_list(Config) ->
?assertEqual(string:length(string:find(Output, LongPath ++ pathsep() ++ LongPath)), (LongPathLength * 2) + string:length(pathsep())),
ok.
+%% https://github.com/erlang/otp/issues/9668
+argument_too_large(_Config) ->
+ {ok,[[PName]]} = init:get_argument(progname),
+ GtInt32 = "4294975488",
+ BadArg = fun(Flag, Arg) ->
+ Cmd = os:cmd(PName ++ " "++Flag++" "++GtInt32++" -s init stop"),
+ ?assertMatch({match,_}, re:run(Cmd, "bad "++Arg++" "++GtInt32))
+ end,
+ Args = [{"+t", "atom table size"},
+ {"+P", "number of processes"},
+ {"+Q", "number of ports"}],
+ [BadArg(Flag, Arg) || {Flag, Arg} <- Args].
+
compare_erl_path(Cmd, BinPath, Path) ->
os:putenv("PATH", Path),
Output = os:cmd(Cmd),
--
2.43.0