Check length of enum literals on definition and input to make sure they will fit...
authorAndrew Dunstan
Mon, 2 Apr 2007 22:14:17 +0000 (22:14 +0000)
committerAndrew Dunstan
Mon, 2 Apr 2007 22:14:17 +0000 (22:14 +0000)
src/backend/catalog/pg_enum.c
src/backend/utils/adt/enum.c

index 696c1f06d44d35392e250cbe88c988fef1b1f035..6a09886435133edd36da650088be5c8bb132e665 100644 (file)
@@ -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);
index 288894ec3fb13069996ab30bd0cf5635d3408753..635d232912ec6861eed5a91b2b23559d3f18eac2 100644 (file)
@@ -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),