summaryrefslogtreecommitdiffstats
path: root/ffi.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2024-10-07 12:42:55 -0700
committerKaz Kylheku <kaz@kylheku.com>2024-10-07 12:42:55 -0700
commit985da46414c246d1dc94e5b6f40899c9159e2d0e (patch)
tree4d5b8f4c2f8dbca2fd3bb71e6795af3662ed1b2c /ffi.c
parent8eeaeb95154d868b9fd201ff9cbf88b1031921cc (diff)
downloadtxr-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.c5
1 files changed, 2 insertions, 3 deletions
diff --git a/ffi.c b/ffi.c
index acea5db0..91845e67 100644
--- a/ffi.c
+++ b/ffi.c
@@ -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;