From dca44d07c585637d8245a46a29be732241fa40bf Mon Sep 17 00:00:00 2001 From: Amit Kapila Date: Wed, 3 Oct 2018 09:54:01 +0530 Subject: MAXALIGN the target address where we store flattened value. The API (EOH_flatten_into) that flattens the expanded value representation expects the target address to be maxaligned. All it's usage adhere to that principle except when serializing datums for parallel query. Fix that usage. Diagnosed-by: Tom Lane Author: Tom Lane and Amit Kapila Backpatch-through: 9.6 Discussion: https://postgr.es/m/11629.1536550032@sss.pgh.pa.us --- src/backend/utils/adt/datum.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'src/backend/utils/adt/datum.c') diff --git a/src/backend/utils/adt/datum.c b/src/backend/utils/adt/datum.c index d02e3c81106..76e99ccf4ee 100644 --- a/src/backend/utils/adt/datum.c +++ b/src/backend/utils/adt/datum.c @@ -334,8 +334,19 @@ datumSerialize(Datum value, bool isnull, bool typByVal, int typLen, } else if (eoh) { - EOH_flatten_into(eoh, (void *) *start_address, header); + char *tmp; + + /* + * EOH_flatten_into expects the target address to be maxaligned, + * so we can't store directly to *start_address. + */ + tmp = (char *) palloc(header); + EOH_flatten_into(eoh, (void *) tmp, header); + memcpy(*start_address, tmp, header); *start_address += header; + + /* be tidy. */ + pfree(tmp); } else { -- cgit v1.2.3