* [LTP] [PATCH] fix fanotify syscall check on compat kernel
@ 2014-04-16 19:00 Helge Deller
2014-04-17 9:33 ` chrubis
2014-04-17 16:57 ` chrubis
0 siblings, 2 replies; 7+ messages in thread
From: Helge Deller @ 2014-04-16 19:00 UTC (permalink / raw)
To: ltp-list
The fanotify[0-5] testcases use the myfanotify_mark() wrapper for the
fanotify_mark() syscall. But the #define does not take into account, that
the mask field is actually of type _u64 where we need to split the hi
and low word in the syscall on a 32bit arch.
The attached patch converts the #define to a inline function where
the compiler will help to convert the given values to the correct types
(e.g. unsigned long).
Bug found and tested on the parisc/hppa (32bit userspace with 64bit
kernel) arch.
Signed-off-by: Helge Deller <deller@gmx.de>
diff --git a/testcases/kernel/syscalls/fanotify/fanotify.h b/testcases/kernel/syscalls/fanotify/fanotify.h
index a4c2a8f..b13cb7b 100644
--- a/testcases/kernel/syscalls/fanotify/fanotify.h
+++ b/testcases/kernel/syscalls/fanotify/fanotify.h
@@ -28,12 +28,26 @@
#ifndef __FANOTIFY_H__
#define __FANOTIFY_H__
+#include <sys/types.h>
+#include <endian.h>
+#include "config.h"
+#include "linux_syscall_numbers.h"
+
/* fanotify(7) wrappers */
#define myfanotify_init(flags, event_f_flags) \
syscall(__NR_fanotify_init, flags, event_f_flags)
-#define myfanotify_mark(fd, flags, mask, dfd, pathname) \
- syscall(__NR_fanotify_mark, fd, flags, mask, dfd, pathname)
+long myfanotify_mark(int fd, unsigned int flags, unsigned long long mask, int dfd, const char *pathname)
+{
+#if __WORDSIZE == 64
+ return ltp_syscall(__NR_fanotify_mark, fd, flags, mask, dfd, pathname);
+#else
+ return ltp_syscall(__NR_fanotify_mark, fd, flags,
+ __LONG_LONG_PAIR((unsigned long) (mask >> 32),
+ (unsigned long) mask),
+ dfd, (unsigned long) pathname);
+#endif
+}
#endif /* __FANOTIFY_H__ */
------------------------------------------------------------------------------
Learn Graph Databases - Download FREE O'Reilly Book
"Graph Databases" is the definitive new guide to graph databases and their
applications. Written by three acclaimed leaders in the field,
this first edition is now available. Download your free book today!
http://p.sf.net/sfu/NeoTech
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [LTP] [PATCH] fix fanotify syscall check on compat kernel
2014-04-16 19:00 [LTP] [PATCH] fix fanotify syscall check on compat kernel Helge Deller
@ 2014-04-17 9:33 ` chrubis
[not found] ` <trinity-7fc052ce-4544-4fa4-afc0-9b68430ef693-1397729289569@3capp-gmx-bs62>
2014-04-17 16:57 ` chrubis
1 sibling, 1 reply; 7+ messages in thread
From: chrubis @ 2014-04-17 9:33 UTC (permalink / raw)
To: Helge Deller; +Cc: ltp-list, Mike Frysinger
Hi!
> #ifndef __FANOTIFY_H__
> #define __FANOTIFY_H__
>
> +#include <sys/types.h>
> +#include <endian.h>
> +#include "config.h"
> +#include "linux_syscall_numbers.h"
> +
> /* fanotify(7) wrappers */
>
> #define myfanotify_init(flags, event_f_flags) \
> syscall(__NR_fanotify_init, flags, event_f_flags)
>
> -#define myfanotify_mark(fd, flags, mask, dfd, pathname) \
> - syscall(__NR_fanotify_mark, fd, flags, mask, dfd, pathname)
> +long myfanotify_mark(int fd, unsigned int flags, unsigned long long mask, int dfd, const char *pathname)
> +{
> +#if __WORDSIZE == 64
> + return ltp_syscall(__NR_fanotify_mark, fd, flags, mask, dfd, pathname);
> +#else
> + return ltp_syscall(__NR_fanotify_mark, fd, flags,
> + __LONG_LONG_PAIR((unsigned long) (mask >> 32),
> + (unsigned long) mask),
> + dfd, (unsigned long) pathname);
> +#endif
> +}
I think that the x32 ABI should be handled here as well (as in the
fallocate.h). Mike can you confirm?
Also I've been unable to make the testcases work with -m32 on x86_64
both with and without the patch and even when using glibc wrappers from
sys/fallocate.h, in all cases the error is EINVAL which suggets that the
parameters are passed wrongly somewhere on the way.
--
Cyril Hrubis
chrubis@suse.cz
------------------------------------------------------------------------------
Learn Graph Databases - Download FREE O'Reilly Book
"Graph Databases" is the definitive new guide to graph databases and their
applications. Written by three acclaimed leaders in the field,
this first edition is now available. Download your free book today!
http://p.sf.net/sfu/NeoTech
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [LTP] [PATCH] fix fanotify syscall check on compat kernel
[not found] ` <trinity-7fc052ce-4544-4fa4-afc0-9b68430ef693-1397729289569@3capp-gmx-bs62>
@ 2014-04-17 10:16 ` chrubis
2014-04-17 13:27 ` chrubis
1 sibling, 0 replies; 7+ messages in thread
From: chrubis @ 2014-04-17 10:16 UTC (permalink / raw)
To: Helge Deller; +Cc: ltp-list, Mike Frysinger
Hi!
> > I think that the x32 ABI should be handled here as well (as in the
> > fallocate.h). Mike can you confirm?
>
> Yes, I think so.
> I even thought of changing the #if to C-Coding like
> if ((sizeof(void*) == 8)
> call 64bit_syscall
> else
> call 32bit_syscall_wrapper;
That would be still wrong on the x32 ABI where pointers are 32 bit but
syscalls get 64 bit parameters.
> I'm not sure if this can avoid the ifdefs though...
We should probably move the ifdef condition from the fallocate.h header
to some generic top-level header and use it in the syscall wrappers.
Something like:
#define LTP_USE_64_ABI __WORDSIZE == 64 || ....
Then we can use as:
#if LTP_USE_64_ABI
...
#else
...
#endif
> > Also I've been unable to make the testcases work with -m32 on x86_64
> > both with and without the patch and even when using glibc wrappers from
> > sys/fallocate.h, in all cases the error is EINVAL which suggets that the
> > parameters are passed wrongly somewhere on the way.
>
> Does it work on the same kernel with -m64 ?
> In any case, for the tests to work the kernel needs to have been compiled with the
> kernel option CONFIG_FANOTIFY_ACCESS_PERMISSIONS set. In my initial tests this
> option wasn't set and I got EINVAL too.
It does work when compiled natively, i.e. without passing the -m32 to
the compiler commandline.
Something is wrong but I haven't yet found what.
--
Cyril Hrubis
chrubis@suse.cz
------------------------------------------------------------------------------
Learn Graph Databases - Download FREE O'Reilly Book
"Graph Databases" is the definitive new guide to graph databases and their
applications. Written by three acclaimed leaders in the field,
this first edition is now available. Download your free book today!
http://p.sf.net/sfu/NeoTech
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [LTP] [PATCH] fix fanotify syscall check on compat kernel
[not found] ` <trinity-7fc052ce-4544-4fa4-afc0-9b68430ef693-1397729289569@3capp-gmx-bs62>
2014-04-17 10:16 ` chrubis
@ 2014-04-17 13:27 ` chrubis
2014-04-17 15:00 ` chrubis
1 sibling, 1 reply; 7+ messages in thread
From: chrubis @ 2014-04-17 13:27 UTC (permalink / raw)
To: Helge Deller; +Cc: ltp-list, Mike Frysinger
Hi!
> > Also I've been unable to make the testcases work with -m32 on x86_64
> > both with and without the patch and even when using glibc wrappers from
> > sys/fallocate.h, in all cases the error is EINVAL which suggets that the
> > parameters are passed wrongly somewhere on the way.
>
> Does it work on the same kernel with -m64 ?
> In any case, for the tests to work the kernel needs to have been compiled with the
> kernel option CONFIG_FANOTIFY_ACCESS_PERMISSIONS set. In my initial tests this
> option wasn't set and I got EINVAL too.
And it seems to work (-m32 with your patch) on two testing machines with
slightly older kernel. So I guess that the patch is fine and I had just
bad luck with one particular machine.
--
Cyril Hrubis
chrubis@suse.cz
------------------------------------------------------------------------------
Learn Graph Databases - Download FREE O'Reilly Book
"Graph Databases" is the definitive new guide to graph databases and their
applications. Written by three acclaimed leaders in the field,
this first edition is now available. Download your free book today!
http://p.sf.net/sfu/NeoTech
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [LTP] [PATCH] fix fanotify syscall check on compat kernel
2014-04-17 13:27 ` chrubis
@ 2014-04-17 15:00 ` chrubis
0 siblings, 0 replies; 7+ messages in thread
From: chrubis @ 2014-04-17 15:00 UTC (permalink / raw)
To: Helge Deller; +Cc: ltp-list, Mike Frysinger
Hi!
> > > Also I've been unable to make the testcases work with -m32 on x86_64
> > > both with and without the patch and even when using glibc wrappers from
> > > sys/fallocate.h, in all cases the error is EINVAL which suggets that the
> > > parameters are passed wrongly somewhere on the way.
> >
> > Does it work on the same kernel with -m64 ?
> > In any case, for the tests to work the kernel needs to have been compiled with the
> > kernel option CONFIG_FANOTIFY_ACCESS_PERMISSIONS set. In my initial tests this
> > option wasn't set and I got EINVAL too.
>
> And it seems to work (-m32 with your patch) on two testing machines with
> slightly older kernel. So I guess that the patch is fine and I had just
> bad luck with one particular machine.
Found the cause:
commit 91c2e0bcae72a3086c698b5de2b950b885abb0e6
Author: Al Viro <viro@zeniv.linux.org.uk>
Date: Tue Mar 5 20:10:59 2013 -0500
unify compat fanotify_mark(2), switch to COMPAT_SYSCALL_DEFINE
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Which was fixed in:
commit 592f6b842f64e416c7598a1b97c649b34241e22d
Author: Heiko Carstens <heiko.carstens@de.ibm.com>
Date: Mon Jan 27 17:07:19 2014 -0800
compat: fix sys_fanotify_mark
Commit 91c2e0bcae72 ("unify compat fanotify_mark(2), switch to
COMPAT_SYSCALL_DEFINE") added a new unified compat fanotify_mark syscall
to be used by all architectures.
Unfortunately the unified version merges the split mask parameter in a
wrong way: the lower and higher word got swapped.
This was discovered with glibc's tst-fanotify test case.
So kernels between 3.10 and 3.14 are broken.
--
Cyril Hrubis
chrubis@suse.cz
------------------------------------------------------------------------------
Learn Graph Databases - Download FREE O'Reilly Book
"Graph Databases" is the definitive new guide to graph databases and their
applications. Written by three acclaimed leaders in the field,
this first edition is now available. Download your free book today!
http://p.sf.net/sfu/NeoTech
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [LTP] [PATCH] fix fanotify syscall check on compat kernel
2014-04-16 19:00 [LTP] [PATCH] fix fanotify syscall check on compat kernel Helge Deller
2014-04-17 9:33 ` chrubis
@ 2014-04-17 16:57 ` chrubis
[not found] ` <5350E02B.7080104@gmx.de>
1 sibling, 1 reply; 7+ messages in thread
From: chrubis @ 2014-04-17 16:57 UTC (permalink / raw)
To: Helge Deller; +Cc: ltp-list
Hi!
> The fanotify[0-5] testcases use the myfanotify_mark() wrapper for the
> fanotify_mark() syscall. But the #define does not take into account, that
> the mask field is actually of type _u64 where we need to split the hi
> and low word in the syscall on a 32bit arch.
>
> The attached patch converts the #define to a inline function where
> the compiler will help to convert the given values to the correct types
> (e.g. unsigned long).
>
> Bug found and tested on the parisc/hppa (32bit userspace with 64bit
> kernel) arch.
I've pushed slightly modified version of this patch. Please check that
it works fine for you.
--
Cyril Hrubis
chrubis@suse.cz
------------------------------------------------------------------------------
Learn Graph Databases - Download FREE O'Reilly Book
"Graph Databases" is the definitive new guide to graph databases and their
applications. Written by three acclaimed leaders in the field,
this first edition is now available. Download your free book today!
http://p.sf.net/sfu/NeoTech
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [LTP] [PATCH] fix fanotify syscall check on compat kernel
[not found] ` <20140418082553.GA3389@ls3530.fritz.box>
@ 2014-04-22 11:57 ` chrubis
0 siblings, 0 replies; 7+ messages in thread
From: chrubis @ 2014-04-22 11:57 UTC (permalink / raw)
To: Helge Deller; +Cc: ltp-list
Hi!
> Attached patch helps to find the reason when the fanotify03 testcase
> fails. For the test to work correctly, the kernel option
> CONFIG_FANOTIFY_ACCESS_PERMISSIONS needs to be enabled.
Pushed with minor change, thanks.
--
Cyril Hrubis
chrubis@suse.cz
------------------------------------------------------------------------------
Start Your Social Network Today - Download eXo Platform
Build your Enterprise Intranet with eXo Platform Software
Java Based Open Source Intranet - Social, Extensible, Cloud Ready
Get Started Now And Turn Your Intranet Into A Collaboration Platform
http://p.sf.net/sfu/ExoPlatform
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2014-04-22 11:58 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-04-16 19:00 [LTP] [PATCH] fix fanotify syscall check on compat kernel Helge Deller
2014-04-17 9:33 ` chrubis
[not found] ` <trinity-7fc052ce-4544-4fa4-afc0-9b68430ef693-1397729289569@3capp-gmx-bs62>
2014-04-17 10:16 ` chrubis
2014-04-17 13:27 ` chrubis
2014-04-17 15:00 ` chrubis
2014-04-17 16:57 ` chrubis
[not found] ` <5350E02B.7080104@gmx.de>
[not found] ` <20140418082553.GA3389@ls3530.fritz.box>
2014-04-22 11:57 ` chrubis
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox