On 6/24/15 2:11 PM, Robert Haas wrote:
Fixing this is easy, but ISTM that we need to insert some sort of a guard to prevent people from continuing to forget this, because it's apparently quite easy to do. Perhaps add_object_address should Assert(OidIsValid(object_classes[oclass])), plus a (static?) assert someplace checking that OidIsValid(object_classes[MAX_OCLASS - 1])?
I tried doing this and I'm getting a "static_assert expression is not an integral constant expression" error, even when I reduce it to a simple constant comparison. Maybe I'm just doing something dumb...
If I replace the StaticAssert with Assert(OidIsValid(object_classes[MAX_OCLASS - 1])) it works find and initdb will fail if that assert trips.
I've attached the broken StaticAssert version. Also added a warning comment to the enum.
-- Jim Nasby, Data Architect, Blue Treble Consulting, Austin TX Data in Trouble? Get it in Treble! http://BlueTreble.com
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c index c1212e9..7adc216 100644 --- a/src/backend/catalog/dependency.c +++ b/src/backend/catalog/dependency.c @@ -2037,6 +2037,15 @@ add_object_address(ObjectClass oclass, Oid objectId, int32 subId, { ObjectAddress *item; + /* + * Ensure object_classes is properly sized. Can't use OidIsValid here + * because it's not marked as static (nor should it be). + */ + StaticAssertStmt(object_classes[MAX_OCLASS - 1] != 0, + "last OID in object_classes[] is invalid (did you forget to add a new entry to it?)"); + + Assert(OidIsValid(object_classes[oclass])); + /* enlarge array if needed */ if (addrs->numrefs >= addrs->maxrefs) { diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h index 5da18c2..515417d 100644 --- a/src/include/catalog/dependency.h +++ b/src/include/catalog/dependency.h @@ -149,6 +149,8 @@ typedef enum ObjectClass OCLASS_EVENT_TRIGGER, /* pg_event_trigger */ OCLASS_POLICY, /* pg_policy */ OCLASS_TRANSFORM, /* pg_transform */ + + /* New classes need to be added to object_classes[] too. */ MAX_OCLASS /* MUST BE LAST */ } ObjectClass;
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers