From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:38844) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RvZJZ-0002YO-5a for qemu-devel@nongnu.org; Thu, 09 Feb 2012 14:05:57 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RvZJT-0003dU-Pu for qemu-devel@nongnu.org; Thu, 09 Feb 2012 14:05:52 -0500 Received: from relay1.mentorg.com ([192.94.38.131]:59000) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RvZJT-0003dD-JI for qemu-devel@nongnu.org; Thu, 09 Feb 2012 14:05:47 -0500 Received: from nat-ies.mentorg.com ([192.94.31.2] helo=EU1-MAIL.mgc.mentorg.com) by relay1.mentorg.com with esmtp id 1RvZJS-0007XE-Va from Paul_Brook@mentor.com for qemu-devel@nongnu.org; Thu, 09 Feb 2012 11:05:47 -0800 From: Paul Brook Date: Thu, 9 Feb 2012 19:05:43 +0000 Message-Id: <1328814343-9189-1-git-send-email-paul@codesourcery.com> Subject: [Qemu-devel] [PATCH] fstatat size mismatch List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Paul Brook host_to_target_stat64 is used for both stat64 and newfstatat syscalls. In the latter case we don't actually have a struct stat64. The current TARGET_ABI_BITS test is wrong for some 64-bit ILP32 targets (in particular MIPS N32). Check for TARGET_NR_newfstatat instead. This will all break horribly if both newfstatat and stat64 are defined, so also add a check for that. Signed-off-by: Paul Brook --- linux-user/syscall.c | 12 +++++++++++- 1 files changed, 11 insertions(+), 1 deletions(-) diff --git a/linux-user/syscall.c b/linux-user/syscall.c index ee32089..6e0999b 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -4474,6 +4474,16 @@ static inline abi_long host_to_target_timespec(abi_ulong target_addr, return 0; } +/* The newfstatat syscall uses regular struct stat. However it never + occurs on targets with a struct stat64. This allows us to share + host_to_target_stat64 between newfstatat and fstatat64. */ + +#if defined(TARGET_NR_newfstatat) && (defined(TARGET_NR_fstatat64) \ + || defined(TARGET_NR_stat64) || defined(TARGET_NR_fstat64) \ + || defined(TARGET_NR_lstat64)) +#error mismatched stat syscalls. +#endif + #if defined(TARGET_NR_stat64) || defined(TARGET_NR_newfstatat) static inline abi_long host_to_target_stat64(void *cpu_env, abi_ulong target_addr, @@ -4506,7 +4516,7 @@ static inline abi_long host_to_target_stat64(void *cpu_env, } else #endif { -#if TARGET_ABI_BITS == 64 && !defined(TARGET_ALPHA) +#if defined(TARGET_NR_newfstatat) struct target_stat *target_st; #else struct target_stat64 *target_st; -- 1.7.8.3