From 2764b7273ef7f1e7cd1ad9a28219adbb9a04139f Mon Sep 17 00:00:00 2001 From: Sehrope Sarkuni 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 @@ Sets n'th byte in - binary string to newvalue. + binary string to newvalue, which must be + between 0 and 255. set_byte('\x1234567890'::bytea, 4, 64) 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