mirror of https://github.com/postgres/postgres
Check length of enum literals on definition and input to make sure they will fit in a name field and not cause syscache errors.
This commit is contained in:
parent
ffb27446cc
commit
325feaef7f
|
@ -7,7 +7,7 @@
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* 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));
|
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);
|
values[Anum_pg_enum_enumtypid - 1] = ObjectIdGetDatum(enumTypeOid);
|
||||||
namestrcpy(&enumlabel, lab);
|
namestrcpy(&enumlabel, lab);
|
||||||
values[Anum_pg_enum_enumlabel - 1] = NameGetDatum(&enumlabel);
|
values[Anum_pg_enum_enumlabel - 1] = NameGetDatum(&enumlabel);
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* 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;
|
HeapTuple tup;
|
||||||
Oid enumoid;
|
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,
|
tup = SearchSysCache(ENUMTYPOIDNAME,
|
||||||
ObjectIdGetDatum(enumtypoid),
|
ObjectIdGetDatum(enumtypoid),
|
||||||
CStringGetDatum(name),
|
CStringGetDatum(name),
|
||||||
|
|
Loading…
Reference in New Issue