File 1698-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
@@ -31,7 +31,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,
-         zdbbl_dist_buf_busy_limit/1]).
+         zdbbl_dist_buf_busy_limit/1,
+         argument_too_large/1]).
 
 -include_lib("common_test/include/ct.hrl").
 
@@ -51,7 +52,8 @@ suite() ->
 
 all() -> 
     [args_file, evil_args_file, missing_args_file, env, args_file_env,
-     otp_7461, argument_separation, zdbbl_dist_buf_busy_limit].
+     otp_7461, argument_separation, zdbbl_dist_buf_busy_limit,
+     argument_too_large].
 
 %% Test that plain first argument does not
 %% destroy -home switch [OTP-8209] or interact with environments
@@ -374,7 +376,19 @@ zdbbl_dist_buf_busy_limit(Config) when i
     LimB = rpc:call(SName,erlang,system_info,[dist_buf_busy_limit]),
     ok = cleanup_node(SNameS, 10),
     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].
 
 %%
 %% Utils
-- 
2.43.0

openSUSE Build Service is sponsored by