diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2024-10-07 12:42:55 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2024-10-07 12:42:55 -0700 |
commit | 985da46414c246d1dc94e5b6f40899c9159e2d0e (patch) | |
tree | 4d5b8f4c2f8dbca2fd3bb71e6795af3662ed1b2c /ffi.c | |
parent | 8eeaeb95154d868b9fd201ff9cbf88b1031921cc (diff) | |
download | txr-985da46414c246d1dc94e5b6f40899c9159e2d0e.tar.gz txr-985da46414c246d1dc94e5b6f40899c9159e2d0e.tar.bz2 txr-985da46414c246d1dc94e5b6f40899c9159e2d0e.zip |
ffi: bug: flexible structure size calculation.
* ffi.c (make_ffi_type_struct): We must calculate the size
of a flexible structure the way GCC does it. We cannot simply
truncate it at the offset of the member. Rather, the size
is calculated in the usual way. The alignment of the array is
taken into account for the purpose of determining what is the
most aligned member of the structure, and then padding is
added, if required. Thus, the size may exceed the offset of
that member.
Diffstat (limited to 'ffi.c')
-rw-r--r-- | ffi.c | 5 |
1 files changed, 2 insertions, 3 deletions
@@ -3916,13 +3916,12 @@ static val make_ffi_type_struct(val syntax, val lisp_type, tft->out = ffi_struct_out; if (flexp) { - tft->size = offs; tft->alloc = ffi_flex_alloc; tft->dynsize = ffi_flex_dynsize; - } else { - tft->size = (offs + most_align - 1) & ~(most_align - 1); } + tft->size = (offs + most_align - 1) & ~(most_align - 1); + tft->align = most_align; return obj; |