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

openSUSE Build Service is sponsored by