From 325feaef7f46e609973360b4102c1acfc4924d72 Mon Sep 17 00:00:00 2001
From: Andrew Dunstan <andrew@dunslane.net>
Date: Mon, 2 Apr 2007 22:14:17 +0000
Subject: [PATCH] Check length of enum literals on definition and input to make
 sure they will fit in a name field and not cause syscache errors.

---
 src/backend/catalog/pg_enum.c | 15 ++++++++++++++-
 src/backend/utils/adt/enum.c  | 11 ++++++++++-
 2 files changed, 24 insertions(+), 2 deletions(-)

diff --git a/src/backend/catalog/pg_enum.c b/src/backend/catalog/pg_enum.c
index 696c1f06d44..6a098864351 100644
--- a/src/backend/catalog/pg_enum.c
+++ b/src/backend/catalog/pg_enum.c
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/catalog/pg_enum.c,v 1.1 2007/04/02 03:49:37 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/catalog/pg_enum.c,v 1.2 2007/04/02 22:14:17 adunstan Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -78,6 +78,19 @@ EnumValuesCreate(Oid enumTypeOid, List *vals)
 	{
 		char *lab = strVal(lfirst(lc));
 
+		/* 
+		 * labels are stored in a name field, for easier syscache lookup, so
+		 * check the length to make sure it's within range.
+		 */
+
+		if (strlen(lab) > (NAMEDATALEN - 1))
+			ereport(ERROR,
+					(errcode(ERRCODE_INVALID_NAME),
+					 errmsg("invalid enum label \"%s\", must be %d characters or less",
+							lab,
+							NAMEDATALEN - 1)));
+
+
 		values[Anum_pg_enum_enumtypid - 1] = ObjectIdGetDatum(enumTypeOid);
 		namestrcpy(&enumlabel, lab);
 		values[Anum_pg_enum_enumlabel - 1] = NameGetDatum(&enumlabel);
diff --git a/src/backend/utils/adt/enum.c b/src/backend/utils/adt/enum.c
index 288894ec3fb..635d232912e 100644
--- a/src/backend/utils/adt/enum.c
+++ b/src/backend/utils/adt/enum.c
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *    $PostgreSQL: pgsql/src/backend/utils/adt/enum.c,v 1.1 2007/04/02 03:49:39 tgl Exp $
+ *    $PostgreSQL: pgsql/src/backend/utils/adt/enum.c,v 1.2 2007/04/02 22:14:17 adunstan Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -45,6 +45,15 @@ cstring_enum(char *name, Oid enumtypoid)
 	HeapTuple tup;
 	Oid enumoid;
 
+	/* must check length to prevent Assert failure within SearchSysCache */
+
+	if (strlen(name) >= NAMEDATALEN)
+        ereport(ERROR,
+                (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+                 errmsg("invalid input value for enum %s: \"%s\"",
+						format_type_be(enumtypoid),
+                        name)));
+
 	tup = SearchSysCache(ENUMTYPOIDNAME,
 						 ObjectIdGetDatum(enumtypoid),
 						 CStringGetDatum(name),
-- 
GitLab