[PATCH v2 1/5] mips: Do not malloc on getdents64 fallback
Joseph Myers
joseph@codesourcery.com
Mon Nov 2 19:51:39 GMT 2020
On Tue, 8 Oct 2019, Adhemerval Zanella wrote:
> + memcpy (((char *)(dp) + offsetof (struct dirent64, d_ino)),
> + DP_MEMBER (kdp, struct kernel_dirent, d_ino),
> + sizeof ((struct dirent64){0}.d_ino));
> + memcpy (((char *)(dp) + offsetof (struct dirent64, d_off)),
> + DP_MEMBER (kdp, struct kernel_dirent, d_ino),
> + sizeof ((struct dirent64){0}.d_ino));
(This is slightly different from the version of the code that ended up
getting committed.)
GCC mainline now gives a rather cryptic error about this code:
../sysdeps/unix/sysv/linux/mips/mips64/getdents64.c: In function '__getdents64':
../sysdeps/unix/sysv/linux/mips/mips64/getdents64.c:121:7: error: 'memcpy' forming offset [4, 7] is out of the bounds [0, 4] [-Werror=array-bounds]
121 | memcpy (((char *) dp + offsetof (struct dirent64, d_ino)),
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
122 | KDP_MEMBER (kdp, d_ino), sizeof ((struct dirent64){0}.d_ino));
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../sysdeps/unix/sysv/linux/mips/mips64/getdents64.c:123:7: error: 'memcpy' forming offset [4, 7] is out of the bounds [0, 4] [-Werror=array-bounds]
123 | memcpy (((char *) dp + offsetof (struct dirent64, d_off)),
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
124 | KDP_MEMBER (kdp, d_off), sizeof ((struct dirent64){0}.d_off));
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
I think what this error is pointing out is that the field in
kernel_dirent, for non-n64, is 32-bit, while this is using memcpy to copy
64 bits from it into the glibc dirent64, which obviously doesn't work.
--
Joseph S. Myers
joseph@codesourcery.com
More information about the Libc-alpha
mailing list