Fix portability issue in new jsonbsubs code.
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 1 Feb 2021 07:03:59 +0000 (02:03 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 1 Feb 2021 07:03:59 +0000 (02:03 -0500)
On machines where sizeof(Datum) > sizeof(Oid) (that is, any 64-bit
platform), the previous coding would compute a misaligned
workspace->index pointer if nupper is odd.  Architectures where
misaligned access is a hard no-no would then fail.  This appears
to explain why thorntail is unhappy but other buildfarm members
are not.

src/backend/utils/adt/jsonbsubs.c

index 491e27cc04bd025f63363295d7766096cbdc6af1..cfb923aaa35cdfa0371b3fa3d3500edd349451a1 100644 (file)
@@ -356,7 +356,7 @@ jsonb_subscript_fetch_old(ExprState *state,
 static void
 jsonb_exec_setup(const SubscriptingRef *sbsref,
                 SubscriptingRefState *sbsrefstate,
-                SubscriptExecSteps * methods)
+                SubscriptExecSteps *methods)
 {
    JsonbSubWorkspace *workspace;
    ListCell   *lc;
@@ -368,9 +368,14 @@ jsonb_exec_setup(const SubscriptingRef *sbsref,
                        nupper * (sizeof(Datum) + sizeof(Oid)));
    workspace->expectArray = false;
    ptr = ((char *) workspace) + MAXALIGN(sizeof(JsonbSubWorkspace));
-   workspace->indexOid = (Oid *) ptr;
-   ptr += nupper * sizeof(Oid);
+
+   /*
+    * This coding assumes sizeof(Datum) >= sizeof(Oid), else we might
+    * misalign the indexOid pointer
+    */
    workspace->index = (Datum *) ptr;
+   ptr += nupper * sizeof(Datum);
+   workspace->indexOid = (Oid *) ptr;
 
    sbsrefstate->workspace = workspace;