Hi,

On 12/14/22 6:48 PM, Robert Haas wrote:
On Wed, Dec 14, 2022 at 12:35 PM Andres Freund <and...@anarazel.de> wrote:
  typedef struct xl_heap_prune

I think this is unsafe on alignment-picky machines. I think it will
cause the offset numbers to be aligned at an odd address.
heap_xlog_prune() doesn't copy the data into aligned memory, so I
think this will result in a misaligned pointer being passed down to
heap_page_prune_execute.

I think the offset numbers are stored separately from the record, even
though it doesn't quite look like that in the above due to the way the
'OFFSET NUMBERS' is embedded in the struct. As they're stored with the
block reference 0, the added boolean shouldn't make a difference
alignment wise?

Or am I misunderstanding your point?

Oh, you're right. So this is another case similar to
xl_btree_reuse_page. In heap_xlog_prune(), we access the offset number
data like this:

                 redirected = (OffsetNumber *)
XLogRecGetBlockData(record, 0, &datalen);
                 end = (OffsetNumber *) ((char *) redirected + datalen);
                 nowdead = redirected + (nredirected * 2);
                 nowunused = nowdead + ndead;
                 nunused = (end - nowunused);
                 heap_page_prune_execute(buffer,

redirected, nredirected,
                                                                 nowdead, ndead,

nowunused, nunused);

This is only safe if the return value of XLogRecGetBlockData is
guaranteed to be properly aligned,

Why, could you please elaborate?

It looks to me that here we are "just" accessing the
members of the xl_heap_prune struct to get the numbers.

Then, the actual data will be read later in heap_page_prune_execute() from the 
buffer/page based on the numbers we got from xl_heap_prune.

Regards,

--
Bertrand Drouvot
PostgreSQL Contributors Team
RDS Open Source Databases
Amazon Web Services: https://aws.amazon.com


Reply via email to