From ed3fc80048f1d11f0b77382f5c378bb4c11787fd Mon Sep 17 00:00:00 2001 From: Richard Yao Date: Thu, 19 Jul 2012 18:37:56 -0400 Subject: [PATCH] Fix NULL pointer dereference on PaX/GRSecurity patched Linux 3.3 and later kernels Support for PaX/GRSecurity patched kernels was developed against Linux 3.2. Unfortunately, an autotools check introduced for a Linux 3.3 API fails on PaX/GRSecurity patched kernels. This causes the module to be built against the Linux 3.2 ABI, which results in a NULL pointer dereference at runtime. Signed-off-by: Brian Behlendorf Signed-off-by: Richard Yao Closes #794 Closes #809 --- config/kernel-show-options.m4 | 9 +++++---- configure | 18 ++++++++++-------- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/config/kernel-show-options.m4 b/config/kernel-show-options.m4 index 1bddb0a7ae..67d683c55e 100644 --- a/config/kernel-show-options.m4 +++ b/config/kernel-show-options.m4 @@ -6,11 +6,12 @@ AC_DEFUN([ZFS_AC_KERNEL_SHOW_OPTIONS], [ ZFS_LINUX_TRY_COMPILE([ #include - ],[ - int (*show_options) (struct seq_file *, struct dentry *) = NULL; - struct super_operations sops __attribute__ ((unused)); - sops.show_options = show_options; + int show_options (struct seq_file * x, struct dentry * y) { return 0; }; + static struct super_operations sops __attribute__ ((unused)) = { + .show_options = show_options, + }; + ],[ ],[ AC_MSG_RESULT([yes]) AC_DEFINE(HAVE_SHOW_OPTIONS_WITH_DENTRY, 1, diff --git a/configure b/configure index 245113ea4d..4c1c210c25 100755 --- a/configure +++ b/configure @@ -15280,14 +15280,15 @@ cat >>conftest.$ac_ext <<_ACEOF #include + int show_options (struct seq_file * x, struct dentry * y) { return 0; }; + static struct super_operations sops __attribute__ ((unused)) = { + .show_options = show_options, + }; + int main (void) { - int (*show_options) (struct seq_file *, struct dentry *) = NULL; - struct super_operations sops __attribute__ ((unused)); - - sops.show_options = show_options; ; return 0; @@ -21807,14 +21808,15 @@ cat >>conftest.$ac_ext <<_ACEOF #include + int show_options (struct seq_file * x, struct dentry * y) { return 0; }; + static struct super_operations sops __attribute__ ((unused)) = { + .show_options = show_options, + }; + int main (void) { - int (*show_options) (struct seq_file *, struct dentry *) = NULL; - struct super_operations sops __attribute__ ((unused)); - - sops.show_options = show_options; ; return 0;