aarch64 strace decoding of 32-bit arm statfs64...

enh enh at google.com
Tue Mar 17 22:20:56 UTC 2015


i think we've regressed with aarch64 strace decoding arm statfs again.
i don't think AARCH64 should have been included in this patch.

commit d50949d21c2b07daadc26c7302163dc6066d4a75
Author: Dmitry V. Levin <ldv at altlinux.org>
Date:   Mon Mar 2 21:34:02 2015 +0000

    aarch64, x32: fix decoding of compat personality statfs64/fstatfs64

    * statfs.c (struct compat_statfs64) [AARCH64 || X32]: Apply the same
    attributes as on X86_64.

diff --git a/statfs.c b/statfs.c
index 6101209..6f5e4d3 100644
--- a/statfs.c
+++ b/statfs.c
@@ -121,7 +121,7 @@ struct compat_statfs64 {
        uint32_t f_flags;
        uint32_t f_spare[4];
 }
-#if defined(X86_64) || defined(IA64)
+#if defined AARCH64 || defined X86_64 || defined X32 || defined IA64
   __attribute__ ((packed, aligned(4)))
 #endif
 ;



compare with the previous patch to fix this:


commit 391c0d8cc5d78b20025355025ba43f0c9897126d
Author: Elliott Hughes <enh at google.com>
Date:   Thu Apr 3 17:50:14 2014 -0700

    aarch64: Fix decoding of arm struct stat64

    We need to handle this situation more like x86-64.  32-bit arm and i386
    actually have a common struct stat64, except the arm one must not be
    packed.  Additionally, on aarch64 the 32-bit personality is personality 0.

    Signed-off-by: Elliott Hughes <enh at google.com>

diff --git a/file.c b/file.c
index 03fbfaa..d82f4d1 100644
--- a/file.c
+++ b/file.c
@@ -181,14 +181,6 @@ struct __old_kernel_stat {
 #undef st_mtime
 #undef st_ctime

-#if defined(__BIONIC__) && defined(__LP64__)
-/* Bionic's "libc" struct stat and struct stat64 are identical.
- * LP64 bionic doesn't have a "kernel" stat64, so for LP64 we need to use the
- * kernel stat.
- */
-#define stat64 stat
-#endif /* defined(__BIONIC__) && defined(__LP64__) */
-
 #include <fcntl.h>
 #ifdef HAVE_SYS_VFS_H
 # include <sys/vfs.h>
@@ -1030,12 +1022,16 @@ printstat(struct tcb *tcp, long addr)
 # define printstat printstat64
 #endif

-#if !defined HAVE_STAT64 && defined X86_64
+#if !defined HAVE_STAT64 && (defined AARCH64 || defined X86_64)
 /*
  * Linux x86_64 has unified `struct stat' but its i386 biarch needs
  * `struct stat64'.  Its <asm-i386/stat.h> definition expects 32-bit `long'.
  * <linux/include/asm-x86_64/ia32.h> is not in the public includes set.
  * __GNUC__ is needed for the required __attribute__ below.
+ *
+ * Similarly, aarch64 has a unified `struct stat' but its arm personality
+ * needs `struct stat64' (which also expects a 32-bit `long' but which
+ * shouldn't be packed).
  */
 struct stat64 {
        unsigned long long      st_dev;
@@ -1057,9 +1053,15 @@ struct stat64 {
        unsigned int    st_ctime;
        unsigned int    st_ctime_nsec;
        unsigned long long      st_ino;
-} __attribute__((packed));
+}
+# if defined X86_64
+   __attribute__((packed))
+#  define STAT64_SIZE  96
+#else
+#  define STAT64_SIZE  104
+# endif
+;
 # define HAVE_STAT64   1
-# define STAT64_SIZE   96
 #endif

 #ifdef HAVE_STAT64
@@ -1098,6 +1100,12 @@ printstat64(struct tcb *tcp, long addr)
 # endif
 #endif /* SPARC[64] */

+#if defined AARCH64
+       if (current_personality != 0) {
+               printstat(tcp, addr);
+               return;
+       }
+#endif
 #if defined X86_64
        if (current_personality != 1) {
                printstat(tcp, addr);





just removing AARCH64 from the list works for me:

diff --git a/statfs.c b/statfs.c
index 6f5e4d3..5ab959c 100644
--- a/statfs.c
+++ b/statfs.c
@@ -121,7 +121,7 @@ struct compat_statfs64 {
  uint32_t f_flags;
  uint32_t f_spare[4];
 }
-#if defined AARCH64 || defined X86_64 || defined X32 || defined IA64
+#if defined X86_64 || defined X32 || defined IA64
   __attribute__ ((packed, aligned(4)))
 #endif
 ;




More information about the Strace-devel mailing list