From 325feaef7f46e609973360b4102c1acfc4924d72 Mon Sep 17 00:00:00 2001 From: Andrew Dunstan 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 696c1f06d4..6a09886435 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 288894ec3f..635d232912 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),