chiark / gitweb /
missing: Fix broken syscall(__NR_fanotify_mark... on o32 mips.
authorcee1 <fykcee1@gmail.com>
Wed, 20 Apr 2011 09:59:18 +0000 (17:59 +0800)
committerLennart Poettering <lennart@poettering.net>
Thu, 21 Apr 2011 02:19:22 +0000 (04:19 +0200)
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=%23618562
MIPS o32 ABI enforces that 64bit arguments should be 64bit-aligned, and
the third argument of syscall(__NR_fanotify_mark, ...) is 64bit and not
64bit-aligned on o32 mips platform, thus extra padding is inserted
before it. The syscall function doesn't know the prototype of
fanotify_mark, so the padding will be passed into kernel as valid
argument.

src/missing.h

index 35e209fba4f54ae5cf8c06b45be98f4281a1122e..f1dbb398e07f9e3d1a933319585735a13fdc74a2 100644 (file)
@@ -125,7 +125,18 @@ static inline int fanotify_init(unsigned int flags, unsigned int event_f_flags)
 
 static inline int fanotify_mark(int fanotify_fd, unsigned int flags, uint64_t mask,
                                 int dfd, const char *pathname) {
+#if defined _MIPS_SIM && _MIPS_SIM == _MIPS_SIM_ABI32
+        union {
+                uint64_t _64;
+                uint32_t _32[2];
+        } _mask;
+        _mask._64 = mask;
+
+        return syscall(__NR_fanotify_mark, fanotify_fd, flags,
+                       _mask._32[0], _mask._32[1], dfd, pathname);
+#else
         return syscall(__NR_fanotify_mark, fanotify_fd, flags, mask, dfd, pathname);
+#endif
 }
 
 #ifndef BTRFS_IOCTL_MAGIC