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;