From: cee1 Date: Wed, 20 Apr 2011 09:59:18 +0000 (+0800) Subject: missing: Fix broken syscall(__NR_fanotify_mark... on o32 mips. X-Git-Tag: v26~28 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=373c23b27f2d886fc023cf5d02fe3bb3eba2e8e9 missing: Fix broken syscall(__NR_fanotify_mark... on o32 mips. 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. --- diff --git a/src/missing.h b/src/missing.h index 35e209fba..f1dbb398e 100644 --- a/src/missing.h +++ b/src/missing.h @@ -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