pg_diffix
pg_diffix copied to clipboard
Use offsetof for flexible struct allocation
We are doing allocation of structs with flexible array members wrong. It should be:
palloc( offsetof(MyStruct, last_member) + num_items * sizeof(ArrayMember) );
See https://github.com/postgres/postgres/blob/master/src/include/c.h#L342-L350.
The reason is that padding may give a different array start location compared to sizeof.
typedef struct MyStruct {
double x;
char y;
int z[];
} MyStruct;
int main(void) {
printf("sizeof: %lu\n", sizeof(MyStruct));
printf("offsetof: %lu\n", offsetof(MyStruct, z));
}
The above prints:
sizeof: 16
offsetof: 12
It doesn't look to me that we have a problem: sizeof(MyStruct) is always greater than or equal to offsetof(MyStruct, z), so, in the worst case, we just waste the padding bytes.
You're right. For a moment I saw it the other way around. Nonetheless, it's a good small fix to have.