Skip to content

Commit 325feae

Browse files
committed
Check length of enum literals on definition and input to make sure they will fit in a name field and not cause syscache errors.
1 parent ffb2744 commit 325feae

File tree

2 files changed

+24
-2
lines changed

2 files changed

+24
-2
lines changed

src/backend/catalog/pg_enum.c

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*
88
*
99
* IDENTIFICATION
10-
* $PostgreSQL: pgsql/src/backend/catalog/pg_enum.c,v 1.1 2007/04/02 03:49:37 tgl Exp $
10+
* $PostgreSQL: pgsql/src/backend/catalog/pg_enum.c,v 1.2 2007/04/02 22:14:17 adunstan Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -78,6 +78,19 @@ EnumValuesCreate(Oid enumTypeOid, List *vals)
7878
{
7979
char *lab = strVal(lfirst(lc));
8080

81+
/*
82+
* labels are stored in a name field, for easier syscache lookup, so
83+
* check the length to make sure it's within range.
84+
*/
85+
86+
if (strlen(lab) > (NAMEDATALEN - 1))
87+
ereport(ERROR,
88+
(errcode(ERRCODE_INVALID_NAME),
89+
errmsg("invalid enum label \"%s\", must be %d characters or less",
90+
lab,
91+
NAMEDATALEN - 1)));
92+
93+
8194
values[Anum_pg_enum_enumtypid - 1] = ObjectIdGetDatum(enumTypeOid);
8295
namestrcpy(&enumlabel, lab);
8396
values[Anum_pg_enum_enumlabel - 1] = NameGetDatum(&enumlabel);

src/backend/utils/adt/enum.c

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*
88
*
99
* IDENTIFICATION
10-
* $PostgreSQL: pgsql/src/backend/utils/adt/enum.c,v 1.1 2007/04/02 03:49:39 tgl Exp $
10+
* $PostgreSQL: pgsql/src/backend/utils/adt/enum.c,v 1.2 2007/04/02 22:14:17 adunstan Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -45,6 +45,15 @@ cstring_enum(char *name, Oid enumtypoid)
4545
HeapTuple tup;
4646
Oid enumoid;
4747

48+
/* must check length to prevent Assert failure within SearchSysCache */
49+
50+
if (strlen(name) >= NAMEDATALEN)
51+
ereport(ERROR,
52+
(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
53+
errmsg("invalid input value for enum %s: \"%s\"",
54+
format_type_be(enumtypoid),
55+
name)));
56+
4857
tup = SearchSysCache(ENUMTYPOIDNAME,
4958
ObjectIdGetDatum(enumtypoid),
5059
CStringGetDatum(name),

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy