about summary refs log tree commit diff
path: root/src/dirent/__dirent.h
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2018-07-18 13:25:48 -0400
committerRich Felker <dalias@aerifal.cx>2018-07-18 13:34:34 -0400
commitb3fa0f2b1b8c267c1cbe8c62464e484f3a174a4e (patch)
tree7d5c1d52617b69d62ddf4fbba48c2aaabeb8290a /src/dirent/__dirent.h
parentdf6d9450ea19fd71e52cf5cdb4c85beb73066394 (diff)
downloadmusl-b3fa0f2b1b8c267c1cbe8c62464e484f3a174a4e.tar.gz
musl-b3fa0f2b1b8c267c1cbe8c62464e484f3a174a4e.tar.xz
musl-b3fa0f2b1b8c267c1cbe8c62464e484f3a174a4e.zip
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.
Diffstat (limited to 'src/dirent/__dirent.h')
-rw-r--r--src/dirent/__dirent.h4
1 files changed, 3 insertions, 1 deletions
diff --git a/src/dirent/__dirent.h b/src/dirent/__dirent.h
index 101b0368..828a5f17 100644
--- a/src/dirent/__dirent.h
+++ b/src/dirent/__dirent.h
@@ -1,9 +1,11 @@
 struct __dirstream
 {
-	int fd;
 	off_t tell;
+	int fd;
 	int buf_pos;
 	int buf_end;
 	volatile int lock[1];
+	/* Any changes to this struct must preserve the property:
+	 * offsetof(struct __dirent, buf) % sizeof(off_t) == 0 */
 	char buf[2048];
 };