Fix NULL pointer dereference on PaX/GRSecurity patched Linux 3.3 and later kernels
authorRichard Yao <ryao@cs.stonybrook.edu>
Thu, 19 Jul 2012 22:37:56 +0000 (18:37 -0400)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Fri, 20 Jul 2012 19:31:45 +0000 (12:31 -0700)
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 <behlendorf1@llnl.gov>
Signed-off-by: Richard Yao <ryao@cs.stonybrook.edu>
Closes #794
Closes #809

config/kernel-show-options.m4
configure

index 1bddb0a..67d683c 100644 (file)
@@ -6,11 +6,12 @@ AC_DEFUN([ZFS_AC_KERNEL_SHOW_OPTIONS], [
 
        ZFS_LINUX_TRY_COMPILE([
                #include <linux/fs.h>
-       ],[
-               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,
index 245113e..4c1c210 100755 (executable)
--- a/configure
+++ b/configure
@@ -15280,14 +15280,15 @@ cat >>conftest.$ac_ext <<_ACEOF
 
                #include <linux/fs.h>
 
+               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 <linux/fs.h>
 
+               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;