Don't use ordinary NULL-terminated strings as Name datums.
authorNoah Misch <noah@leadboat.com>
Wed, 12 Jun 2013 23:49:50 +0000 (19:49 -0400)
committerNoah Misch <noah@leadboat.com>
Wed, 12 Jun 2013 23:49:50 +0000 (19:49 -0400)
Consumers are entitled to read the full 64 bytes pertaining to a Name;
using a shorter NULL-terminated string leads to reading beyond the end
its allocation; a SIGSEGV is possible.  Use the frequent idiom of
copying to a NameData on the stack.  New in 9.3, so no back-patch.

src/backend/commands/alter.c
src/backend/commands/event_trigger.c

index 178c97949dce209c4c6ef3d4560432c5ac3f539e..bb6c1a46606cb2c7c3cdf1c9dc0e9241660d3dab 100644 (file)
@@ -168,6 +168,7 @@ AlterObjectRename_internal(Relation rel, Oid objectId, const char *new_name)
        Datum      *values;
        bool       *nulls;
        bool       *replaces;
+       NameData        nameattrdata;
 
        oldtup = SearchSysCache1(oidCacheId, ObjectIdGetDatum(objectId));
        if (!HeapTupleIsValid(oldtup))
@@ -273,7 +274,8 @@ AlterObjectRename_internal(Relation rel, Oid objectId, const char *new_name)
        values = palloc0(RelationGetNumberOfAttributes(rel) * sizeof(Datum));
        nulls = palloc0(RelationGetNumberOfAttributes(rel) * sizeof(bool));
        replaces = palloc0(RelationGetNumberOfAttributes(rel) * sizeof(bool));
-       values[Anum_name - 1] = PointerGetDatum(new_name);
+       namestrcpy(&nameattrdata, new_name);
+       values[Anum_name - 1] = NameGetDatum(&nameattrdata);
        replaces[Anum_name - 1] = true;
        newtup = heap_modify_tuple(oldtup, RelationGetDescr(rel),
                                                           values, nulls, replaces);
index a0f97e460e61d52c5e117615e6a8b4b2edda1a13..328e2a89524ce6da22d5fd6e647ba1a3a82ec8bd 100644 (file)
@@ -302,6 +302,8 @@ insert_event_trigger_tuple(char *trigname, char *eventname, Oid evtOwner,
        HeapTuple       tuple;
        Datum           values[Natts_pg_trigger];
        bool            nulls[Natts_pg_trigger];
+       NameData        evtnamedata,
+                               evteventdata;
        ObjectAddress myself,
                                referenced;
 
@@ -310,8 +312,10 @@ insert_event_trigger_tuple(char *trigname, char *eventname, Oid evtOwner,
 
        /* Build the new pg_trigger tuple. */
        memset(nulls, false, sizeof(nulls));
-       values[Anum_pg_event_trigger_evtname - 1] = NameGetDatum(trigname);
-       values[Anum_pg_event_trigger_evtevent - 1] = NameGetDatum(eventname);
+       namestrcpy(&evtnamedata, trigname);
+       values[Anum_pg_event_trigger_evtname - 1] = NameGetDatum(&evtnamedata);
+       namestrcpy(&evteventdata, eventname);
+       values[Anum_pg_event_trigger_evtevent - 1] = NameGetDatum(&evteventdata);
        values[Anum_pg_event_trigger_evtowner - 1] = ObjectIdGetDatum(evtOwner);
        values[Anum_pg_event_trigger_evtfoid - 1] = ObjectIdGetDatum(funcoid);
        values[Anum_pg_event_trigger_evtenabled - 1] =