From 656167d89112171b2b7672676dc413c676a186f5 Mon Sep 17 00:00:00 2001 From: Mike Frysinger Date: Sun, 6 Sep 2009 12:12:12 -0400 Subject: fstatat: fix up behavior on 32/64 bit hosts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The fstatat() syscall is a little funky in that it sometimes changes name between 32 and 64 bit hosts, but it should always operate on a 64bit stat structure. So for the fstatat() function, make sure we convert it from a 64bit kstat to a 32bit stat. Along these lines, we need to restore the __xstat32_conv() function. Reported-by: Timo Teräs Signed-off-by: Mike Frysinger --- libc/sysdeps/linux/common/xstatconv.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'libc/sysdeps/linux/common/xstatconv.c') diff --git a/libc/sysdeps/linux/common/xstatconv.c b/libc/sysdeps/linux/common/xstatconv.c index 2a8245806..deef3929e 100644 --- a/libc/sysdeps/linux/common/xstatconv.c +++ b/libc/sysdeps/linux/common/xstatconv.c @@ -44,6 +44,25 @@ void __xstat_conv(struct kernel_stat *kbuf, struct stat *buf) buf->st_ctim = kbuf->st_ctim; } +void __xstat32_conv(struct kernel_stat64 *kbuf, struct stat *buf) +{ + /* Convert to current kernel version of `struct stat64'. */ + memset(buf, 0x00, sizeof(*buf)); + buf->st_dev = kbuf->st_dev; + buf->st_ino = kbuf->st_ino; + buf->st_mode = kbuf->st_mode; + buf->st_nlink = kbuf->st_nlink; + buf->st_uid = kbuf->st_uid; + buf->st_gid = kbuf->st_gid; + buf->st_rdev = kbuf->st_rdev; + buf->st_size = kbuf->st_size; + buf->st_blksize = kbuf->st_blksize; + buf->st_blocks = kbuf->st_blocks; + buf->st_atim = kbuf->st_atim; + buf->st_mtim = kbuf->st_mtim; + buf->st_ctim = kbuf->st_ctim; +} + #ifdef __UCLIBC_HAS_LFS__ void __xstat64_conv(struct kernel_stat64 *kbuf, struct stat64 *buf) -- cgit v1.2.3