From e921fd9207a6f877813e4089a654ed7a914fe311 Mon Sep 17 00:00:00 2001
From: Laurenz Albe <laurenz.albe@cybertec.at>
Date: Sun, 10 May 2026 19:30:14 +0200
Subject: [PATCH v1] Mark the enum comparison functions as leakproof

The error messages reachable from enum_cmp_internal() don't
reveal anything about the compared values.  Memory allocation
errors from building a cache of the enum values also won't
give away information about the values involved.

Author: Laurenz Albe <laurenz.albe@cybertec.at>
Discussion: https://postgr.es/m/8222d01be22d9d87ba1e7f47e398f4ce81af4aaf.camel%40cybertec.at
---
 src/include/catalog/pg_proc.dat          | 14 +++++++-------
 src/test/regress/expected/opr_sanity.out |  7 +++++++
 2 files changed, 14 insertions(+), 7 deletions(-)

diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat
index fa9ae79082b..ef7e7b58985 100644
--- a/src/include/catalog/pg_proc.dat
+++ b/src/include/catalog/pg_proc.dat
@@ -9768,25 +9768,25 @@
   proname => 'enum_out', provolatile => 's', prorettype => 'cstring',
   proargtypes => 'anyenum', prosrc => 'enum_out' },
 { oid => '3508',
-  proname => 'enum_eq', prorettype => 'bool', proargtypes => 'anyenum anyenum',
+  proname => 'enum_eq', proleakproof => 't', prorettype => 'bool', proargtypes => 'anyenum anyenum',
   prosrc => 'enum_eq' },
 { oid => '3509',
-  proname => 'enum_ne', prorettype => 'bool', proargtypes => 'anyenum anyenum',
+  proname => 'enum_ne', proleakproof => 't', prorettype => 'bool', proargtypes => 'anyenum anyenum',
   prosrc => 'enum_ne' },
 { oid => '3510',
-  proname => 'enum_lt', prorettype => 'bool', proargtypes => 'anyenum anyenum',
+  proname => 'enum_lt', proleakproof => 't', prorettype => 'bool', proargtypes => 'anyenum anyenum',
   prosrc => 'enum_lt' },
 { oid => '3511',
-  proname => 'enum_gt', prorettype => 'bool', proargtypes => 'anyenum anyenum',
+  proname => 'enum_gt', proleakproof => 't', prorettype => 'bool', proargtypes => 'anyenum anyenum',
   prosrc => 'enum_gt' },
 { oid => '3512',
-  proname => 'enum_le', prorettype => 'bool', proargtypes => 'anyenum anyenum',
+  proname => 'enum_le', proleakproof => 't', prorettype => 'bool', proargtypes => 'anyenum anyenum',
   prosrc => 'enum_le' },
 { oid => '3513',
-  proname => 'enum_ge', prorettype => 'bool', proargtypes => 'anyenum anyenum',
+  proname => 'enum_ge', proleakproof => 't', prorettype => 'bool', proargtypes => 'anyenum anyenum',
   prosrc => 'enum_ge' },
 { oid => '3514', descr => 'less-equal-greater',
-  proname => 'enum_cmp', prorettype => 'int4', proargtypes => 'anyenum anyenum',
+  proname => 'enum_cmp', proleakproof => 't', prorettype => 'int4', proargtypes => 'anyenum anyenum',
   prosrc => 'enum_cmp' },
 { oid => '3515', descr => 'hash',
   proname => 'hashenum', prorettype => 'int4', proargtypes => 'anyenum',
diff --git a/src/test/regress/expected/opr_sanity.out b/src/test/regress/expected/opr_sanity.out
index cfdc6b1a17a..0aa48e5de81 100644
--- a/src/test/regress/expected/opr_sanity.out
+++ b/src/test/regress/expected/opr_sanity.out
@@ -855,6 +855,13 @@ sha224(bytea)
 sha256(bytea)
 sha384(bytea)
 sha512(bytea)
+enum_eq(anyenum,anyenum)
+enum_ne(anyenum,anyenum)
+enum_lt(anyenum,anyenum)
+enum_gt(anyenum,anyenum)
+enum_le(anyenum,anyenum)
+enum_ge(anyenum,anyenum)
+enum_cmp(anyenum,anyenum)
 starts_with(text,text)
 macaddr8_eq(macaddr8,macaddr8)
 macaddr8_lt(macaddr8,macaddr8)
-- 
2.54.0

