File 8582-erts-stdib-Fix-ets-update_element-4.patch of Package erlang

From 886fcfe7162b2d6f3b0729aec5c1bf54a805b132 Mon Sep 17 00:00:00 2001
From: Sverker Eriksson <sverker@erlang.org>
Date: Thu, 5 Feb 2026 20:36:31 +0100
Subject: [PATCH] erts,stdib: Fix ets:update_element/4

Reject a too small default tuple without key element
and thereby avoid dangerous out of bound key accesses.

For backward (bug)-compatibility reason we only badarg
if the key does not exist and bad default tuple is actually used.
---
 erts/emulator/beam/erl_db.c          |  8 +++++++-
 lib/stdlib/src/erl_stdlib_errors.erl |  3 ++-
 lib/stdlib/test/ets_SUITE.erl        | 11 +++++++++++
 3 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/erts/emulator/beam/erl_db.c b/erts/emulator/beam/erl_db.c
index 57ea72d026..bc5192a68e 100644
--- a/erts/emulator/beam/erl_db.c
+++ b/erts/emulator/beam/erl_db.c
@@ -1320,7 +1320,13 @@ static BIF_RETTYPE do_update_element(Process *p, DbTable *tb,
     }
 
     if (!tb->common.meth->db_lookup_dbterm(p, tb, key, default_obj, &handle)) {
-	cret = DB_ERROR_BADKEY;
+        if (is_value(default_obj)) {
+            p->fvalue = EXI_DEFAULT;
+            cret = DB_ERROR_UNSPEC;
+        }
+        else {
+            cret = DB_ERROR_BADKEY;
+        }
 	goto bail_out;
     }
 
diff --git a/lib/stdlib/src/erl_stdlib_errors.erl b/lib/stdlib/src/erl_stdlib_errors.erl
index e38cd10d7c..dec78245b9 100644
--- a/lib/stdlib/src/erl_stdlib_errors.erl
+++ b/lib/stdlib/src/erl_stdlib_errors.erl
@@ -808,7 +808,8 @@ format_ets_error(update_element, [_, _, ElementSpec, Default]=Args, Cause) ->
 		    position ->
 			[update_op_range];
 		    _ ->
-			case {is_element_spec_top(ElementSpec), format_tuple(Default)} of
+			case {is_element_spec_top(ElementSpec),
+                              format_default_tuple(Default, Cause)} of
 			    {true, [""]} ->
 				[range];
 			    {true, TupleCause} ->
diff --git a/lib/stdlib/test/ets_SUITE.erl b/lib/stdlib/test/ets_SUITE.erl
index e6d82cf42b..5bcc53c683 100644
--- a/lib/stdlib/test/ets_SUITE.erl
+++ b/lib/stdlib/test/ets_SUITE.erl
@@ -2699,6 +2699,17 @@ update_element_default_opts(Opts) ->
 		    [{key1, key2, b, x}] = ets:lookup(Tab, Key),
 		    true = ets:update_element(Tab, Key, {3, c}, {key1, key2, a, y}),
 		    [{key1, key2, c, x}] = ets:lookup(Tab, Key),
+
+                    BadDefault = list_to_tuple(lists:seq(1, Pos-1)),
+                    badarg = try
+                                 ets:update_element(Tab, key_not_present, {1, x}, BadDefault)
+                             catch
+                                 error:badarg -> badarg
+                             end,
+
+                    %% Ignore bad default object if key exist (for backward bug-compat)
+                    true = ets:update_element(Tab, Key, {3, d}, BadDefault),
+
 		    ets:delete(Tab)
                 end
 	    )
-- 
2.51.0

openSUSE Build Service is sponsored by