diff --git a/src/backend/utils/adt/datum.c b/src/backend/utils/adt/datum.c
index f02a5e77ae..6970e6b90a 100644
--- a/src/backend/utils/adt/datum.c
+++ b/src/backend/utils/adt/datum.c
@@ -338,8 +338,19 @@ datumSerialize(Datum value, bool isnull, bool typByVal, int typLen,
 		}
 		else if (eoh)
 		{
-			EOH_flatten_into(eoh, (void *) *start_address, header);
+			char	*res;
+
+			/*
+			 * EOH_flatten_into expects the target address to be maxaligned so
+			 * can't directly pass start_address.
+			 */
+			res = (char *) palloc(header);
+			EOH_flatten_into(eoh, (void *) res, header);
+			memcpy(*start_address, res, header);
 			*start_address += header;
+
+			/* be tidy. */
+			pfree(res);
 		}
 		else
 		{
