From: Richard Yao Date: Thu, 19 Jul 2012 22:37:56 +0000 (-0400) Subject: Fix NULL pointer dereference on PaX/GRSecurity patched Linux 3.3 and later kernels X-Git-Url: https://git.camperquake.de/gitweb.cgi?a=commitdiff_plain;h=ed3fc80048f1d11f0b77382f5c378bb4c11787fd;p=zfs.git 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 --- diff --git a/config/kernel-show-options.m4 b/config/kernel-show-options.m4 index 1bddb0a..67d683c 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 245113e..4c1c210 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;