Use FLEXIBLE_ARRAY_MEMBER in struct varlena.
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 20 Feb 2015 21:51:53 +0000 (16:51 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 20 Feb 2015 21:51:53 +0000 (16:51 -0500)
This forces some minor coding adjustments in tuptoaster.c and inv_api.c,
but the new coding there is cleaner anyway.

Michael Paquier

src/backend/access/heap/tuptoaster.c
src/backend/storage/large_object/inv_api.c
src/include/c.h

index f8c1401d7fa483436aeebecc44b0ca80b913a0c9..deb33720ab7568f60f6d06ea1ee8bed776be4e07 100644 (file)
@@ -1365,11 +1365,13 @@ toast_save_datum(Relation rel, Datum value,
    CommandId   mycid = GetCurrentCommandId(true);
    struct varlena *result;
    struct varatt_external toast_pointer;
-   struct
+   union
    {
        struct varlena hdr;
-       char        data[TOAST_MAX_CHUNK_SIZE]; /* make struct big enough */
-       int32       align_it;   /* ensure struct is aligned well enough */
+       /* this is to make the union big enough for a chunk: */
+       char        data[TOAST_MAX_CHUNK_SIZE + VARHDRSZ];
+       /* ensure union is aligned well enough: */
+       int32       align_it;
    }           chunk_data;
    int32       chunk_size;
    int32       chunk_seq = 0;
index a19c40186f5b295f4de2a4034ef2865bf8aad1ae..ecd5e618f3c25cc257fa503dbcf5014e9bce2088 100644 (file)
@@ -562,11 +562,13 @@ inv_write(LargeObjectDesc *obj_desc, const char *buf, int nbytes)
    bool        neednextpage;
    bytea      *datafield;
    bool        pfreeit;
-   struct
+   union
    {
        bytea       hdr;
-       char        data[LOBLKSIZE];    /* make struct big enough */
-       int32       align_it;   /* ensure struct is aligned well enough */
+       /* this is to make the union big enough for a LO data chunk: */
+       char        data[LOBLKSIZE + VARHDRSZ];
+       /* ensure union is aligned well enough: */
+       int32       align_it;
    }           workbuf;
    char       *workb = VARDATA(&workbuf.hdr);
    HeapTuple   newtup;
@@ -748,11 +750,13 @@ inv_truncate(LargeObjectDesc *obj_desc, int64 len)
    SysScanDesc sd;
    HeapTuple   oldtuple;
    Form_pg_largeobject olddata;
-   struct
+   union
    {
        bytea       hdr;
-       char        data[LOBLKSIZE];    /* make struct big enough */
-       int32       align_it;   /* ensure struct is aligned well enough */
+       /* this is to make the union big enough for a LO data chunk: */
+       char        data[LOBLKSIZE + VARHDRSZ];
+       /* ensure union is aligned well enough: */
+       int32       align_it;
    }           workbuf;
    char       *workb = VARDATA(&workbuf.hdr);
    HeapTuple   newtup;
index 2de86f91416f368ff7cd9260403ef032ae86f9c8..ee615ee687f8249fed037136cfd0cc6027d1ccaa 100644 (file)
@@ -391,7 +391,7 @@ typedef struct
 struct varlena
 {
    char        vl_len_[4];     /* Do not touch this field directly! */
-   char        vl_dat[1];
+   char        vl_dat[FLEXIBLE_ARRAY_MEMBER];  /* Data content is here */
 };
 
 #define VARHDRSZ       ((int32) sizeof(int32))