From 2764b7273ef7f1e7cd1ad9a28219adbb9a04139f Mon Sep 17 00:00:00 2001
From: Sehrope Sarkuni <sehrope@jackdb.com>
Date: Sun, 20 Sep 2026 12:46:10 +0000
Subject: [PATCH 1/2] Reject out-of-range newvalue in set_byte()

set_byte() stored only the low byte of newvalue, so 256 became 0 and -1
became 255.  Raise an error for values outside 0..255, as set_bit()
already does for its new bit.
---
 doc/src/sgml/func/func-binarystring.sgml | 3 ++-
 src/backend/utils/adt/bytea.c            | 5 +++++
 src/test/regress/expected/strings.out    | 4 ++++
 src/test/regress/sql/strings.sql         | 2 ++
 4 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/doc/src/sgml/func/func-binarystring.sgml b/doc/src/sgml/func/func-binarystring.sgml
index dc6b7e57ea7..ebbf4dce7c3 100644
--- a/doc/src/sgml/func/func-binarystring.sgml
+++ b/doc/src/sgml/func/func-binarystring.sgml
@@ -486,7 +486,8 @@
        </para>
        <para>
         Sets <link linkend="functions-zerobased-note">n'th</link> byte in
-        binary string to <parameter>newvalue</parameter>.
+        binary string to <parameter>newvalue</parameter>, which must be
+        between 0 and 255.
        </para>
        <para>
         <literal>set_byte('\x1234567890'::bytea, 4, 64)</literal>
diff --git a/src/backend/utils/adt/bytea.c b/src/backend/utils/adt/bytea.c
index f83bbfb9ca0..2eb3cbc7229 100644
--- a/src/backend/utils/adt/bytea.c
+++ b/src/backend/utils/adt/bytea.c
@@ -718,6 +718,11 @@ byteaSetByte(PG_FUNCTION_ARGS)
 				 errmsg("index %d out of valid range, 0..%d",
 						n, len - 1)));
 
+	if (newByte < 0 || newByte > 255)
+		ereport(ERROR,
+				(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+				 errmsg("new byte must be 0..255")));
+
 	/*
 	 * Now set the byte.
 	 */
diff --git a/src/test/regress/expected/strings.out b/src/test/regress/expected/strings.out
index fa29abfd829..ab2b3b99768 100644
--- a/src/test/regress/expected/strings.out
+++ b/src/test/regress/expected/strings.out
@@ -3269,6 +3269,10 @@ SELECT set_byte('\x1234567890abcdef00'::bytea, 7, 11);
 
 SELECT set_byte('\x1234567890abcdef00'::bytea, 99, 11);  -- error
 ERROR:  index 99 out of valid range, 0..8
+SELECT set_byte('\x1234567890abcdef00'::bytea, 0, 256);  -- error
+ERROR:  new byte must be 0..255
+SELECT set_byte('\x1234567890abcdef00'::bytea, 0, -1);  -- error
+ERROR:  new byte must be 0..255
 --
 -- conversions between bytea and integer types
 --
diff --git a/src/test/regress/sql/strings.sql b/src/test/regress/sql/strings.sql
index 7d9c7275a02..d1c9a64264a 100644
--- a/src/test/regress/sql/strings.sql
+++ b/src/test/regress/sql/strings.sql
@@ -1116,6 +1116,8 @@ SELECT get_byte('\x1234567890abcdef00'::bytea, 3);
 SELECT get_byte('\x1234567890abcdef00'::bytea, 99);  -- error
 SELECT set_byte('\x1234567890abcdef00'::bytea, 7, 11);
 SELECT set_byte('\x1234567890abcdef00'::bytea, 99, 11);  -- error
+SELECT set_byte('\x1234567890abcdef00'::bytea, 0, 256);  -- error
+SELECT set_byte('\x1234567890abcdef00'::bytea, 0, -1);  -- error
 
 --
 -- conversions between bytea and integer types
-- 
2.43.0

