Use FLEXIBLE_ARRAY_MEMBER in struct RecordIOData.
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 20 Feb 2015 22:03:12 +0000 (17:03 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 20 Feb 2015 22:03:12 +0000 (17:03 -0500)
I (tgl) fixed this last night in rowtypes.c, but I missed that the
code had been copied into a couple of other places.

Michael Paquier

contrib/hstore/hstore_io.c
src/backend/utils/adt/jsonfuncs.c

index 079f6627484e5e8fc55cd90b6808613743654f6c..7d8986708fd7aeb56058326ac7a4b25b09874adf 100644 (file)
@@ -747,7 +747,7 @@ typedef struct RecordIOData
    Oid         record_type;
    int32       record_typmod;
    int         ncolumns;
-   ColumnIOData columns[1];    /* VARIABLE LENGTH ARRAY */
+   ColumnIOData columns[FLEXIBLE_ARRAY_MEMBER];
 } RecordIOData;
 
 PG_FUNCTION_INFO_V1(hstore_from_record);
@@ -805,8 +805,8 @@ hstore_from_record(PG_FUNCTION_ARGS)
    {
        fcinfo->flinfo->fn_extra =
            MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
-                              sizeof(RecordIOData) - sizeof(ColumnIOData)
-                              ncolumns * sizeof(ColumnIOData));
+                              offsetof(RecordIOData, columns) +
+                              ncolumns * sizeof(ColumnIOData));
        my_extra = (RecordIOData *) fcinfo->flinfo->fn_extra;
        my_extra->record_type = InvalidOid;
        my_extra->record_typmod = 0;
@@ -816,8 +816,8 @@ hstore_from_record(PG_FUNCTION_ARGS)
        my_extra->record_typmod != tupTypmod)
    {
        MemSet(my_extra, 0,
-              sizeof(RecordIOData) - sizeof(ColumnIOData)
-              ncolumns * sizeof(ColumnIOData));
+              offsetof(RecordIOData, columns) +
+              ncolumns * sizeof(ColumnIOData));
        my_extra->record_type = tupType;
        my_extra->record_typmod = tupTypmod;
        my_extra->ncolumns = ncolumns;
@@ -990,8 +990,8 @@ hstore_populate_record(PG_FUNCTION_ARGS)
    {
        fcinfo->flinfo->fn_extra =
            MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
-                              sizeof(RecordIOData) - sizeof(ColumnIOData)
-                              ncolumns * sizeof(ColumnIOData));
+                              offsetof(RecordIOData, columns) +
+                              ncolumns * sizeof(ColumnIOData));
        my_extra = (RecordIOData *) fcinfo->flinfo->fn_extra;
        my_extra->record_type = InvalidOid;
        my_extra->record_typmod = 0;
@@ -1001,8 +1001,8 @@ hstore_populate_record(PG_FUNCTION_ARGS)
        my_extra->record_typmod != tupTypmod)
    {
        MemSet(my_extra, 0,
-              sizeof(RecordIOData) - sizeof(ColumnIOData)
-              ncolumns * sizeof(ColumnIOData));
+              offsetof(RecordIOData, columns) +
+              ncolumns * sizeof(ColumnIOData));
        my_extra->record_type = tupType;
        my_extra->record_typmod = tupTypmod;
        my_extra->ncolumns = ncolumns;
index 3688163d9145b37b441e4d55370128a7a460a8a7..a8cdeaa393c23d68c33e9b93e1bebdadb7f10ad2 100644 (file)
@@ -216,7 +216,7 @@ typedef struct RecordIOData
    Oid         record_type;
    int32       record_typmod;
    int         ncolumns;
-   ColumnIOData columns[1];    /* VARIABLE LENGTH ARRAY */
+   ColumnIOData columns[FLEXIBLE_ARRAY_MEMBER];
 } RecordIOData;
 
 /* state for populate_recordset */
@@ -2148,8 +2148,8 @@ populate_record_worker(FunctionCallInfo fcinfo, const char *funcname,
    {
        fcinfo->flinfo->fn_extra =
            MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
-                              sizeof(RecordIOData) - sizeof(ColumnIOData)
-                              ncolumns * sizeof(ColumnIOData));
+                              offsetof(RecordIOData, columns) +
+                              ncolumns * sizeof(ColumnIOData));
        my_extra = (RecordIOData *) fcinfo->flinfo->fn_extra;
        my_extra->record_type = InvalidOid;
        my_extra->record_typmod = 0;
@@ -2161,8 +2161,8 @@ populate_record_worker(FunctionCallInfo fcinfo, const char *funcname,
                            my_extra->record_typmod != tupTypmod))
    {
        MemSet(my_extra, 0,
-              sizeof(RecordIOData) - sizeof(ColumnIOData)
-              ncolumns * sizeof(ColumnIOData));
+              offsetof(RecordIOData, columns) +
+              ncolumns * sizeof(ColumnIOData));
        my_extra->record_type = tupType;
        my_extra->record_typmod = tupTypmod;
        my_extra->ncolumns = ncolumns;
@@ -2653,8 +2653,8 @@ populate_recordset_worker(FunctionCallInfo fcinfo, const char *funcname,
    {
        fcinfo->flinfo->fn_extra =
            MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
-                              sizeof(RecordIOData) - sizeof(ColumnIOData)
-                              ncolumns * sizeof(ColumnIOData));
+                              offsetof(RecordIOData, columns) +
+                              ncolumns * sizeof(ColumnIOData));
        my_extra = (RecordIOData *) fcinfo->flinfo->fn_extra;
        my_extra->record_type = InvalidOid;
        my_extra->record_typmod = 0;
@@ -2664,8 +2664,8 @@ populate_recordset_worker(FunctionCallInfo fcinfo, const char *funcname,
        my_extra->record_typmod != tupTypmod)
    {
        MemSet(my_extra, 0,
-              sizeof(RecordIOData) - sizeof(ColumnIOData)
-              ncolumns * sizeof(ColumnIOData));
+              offsetof(RecordIOData, columns) +
+              ncolumns * sizeof(ColumnIOData));
        my_extra->record_type = tupType;
        my_extra->record_typmod = tupTypmod;
        my_extra->ncolumns = ncolumns;