From 877e277b51a765923c1a91199a52295b13128aa9 Mon Sep 17 00:00:00 2001 From: Sebastian Wilhelmi Date: Tue, 3 Oct 2023 17:43:12 +0000 Subject: [PATCH] Buffer needs to be aligned correctly to receive linux_dirent64. --- glib/gspawn.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/glib/gspawn.c b/glib/gspawn.c index 581729733..6f18c80dc 100644 --- a/glib/gspawn.c +++ b/glib/gspawn.c @@ -1441,15 +1441,22 @@ safe_fdwalk (int (*cb)(void *data, int fd), void *data) int dir_fd = open ("/proc/self/fd", O_RDONLY | O_DIRECTORY); if (dir_fd >= 0) { - char buf[4096]; + /* buf needs to be aligned correctly to receive linux_dirent64. + * C11 has _Alignof for this purpose, but for now a + * union serves the same purpose. */ + union + { + char buf[4096]; + struct linux_dirent64 alignment; + } u; int pos, nread; struct linux_dirent64 *de; - while ((nread = syscall (SYS_getdents64, dir_fd, buf, sizeof(buf))) > 0) + while ((nread = syscall (SYS_getdents64, dir_fd, u.buf, sizeof (u.buf))) > 0) { for (pos = 0; pos < nread; pos += de->d_reclen) { - de = (struct linux_dirent64 *)(buf + pos); + de = (struct linux_dirent64 *) (u.buf + pos); fd = filename_to_fd (de->d_name); if (fd < 0 || fd == dir_fd)