From b3fa0f2b1b8c267c1cbe8c62464e484f3a174a4e Mon Sep 17 00:00:00 2001 From: Rich Felker Date: Wed, 18 Jul 2018 13:25:48 -0400 Subject: fix regression in alignment of dirent structs produced by readdir commit 32482f61da7650ff10741bd5aedd66bbc3ea165b reduced the number of int members before the dirent buf from 4 to 3, thereby misaligning it mod sizeof(off_t), producing invalid accesses on any arch where alignof(off_t)==sizeof(off_t). rather than re-adding wasted padding, reorder the struct to meet the requirement and add a comment and static assertion to prevent this from getting broken again. --- src/dirent/readdir.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'src/dirent/readdir.c') diff --git a/src/dirent/readdir.c b/src/dirent/readdir.c index 2cf0632c..dc5f3edb 100644 --- a/src/dirent/readdir.c +++ b/src/dirent/readdir.c @@ -1,9 +1,13 @@ #include #include +#include #include "__dirent.h" #include "syscall.h" #include "libc.h" +typedef char dirstream_buf_alignment_check[1-2*(int)( + offsetof(struct __dirstream, buf) % sizeof(off_t))]; + int __getdents(int, struct dirent *, size_t); struct dirent *readdir(DIR *dir) -- cgit v1.2.1