module_param: check type correctness for module_param_array
Rusty Russell [Thu, 12 Jan 2012 23:02:16 +0000 (09:02 +1030)]
module_param_array(), unlike its non-array cousins, didn't check the type
of the variable.  Fixing this found two bugs.

Cc: Luca Risolia <luca.risolia@studio.unibo.it>
Cc: Mauro Carvalho Chehab <mchehab@infradead.org>
Cc: Eric Piel <eric.piel@tremplin-utc.net>
Cc: linux-media@vger.kernel.org
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>

drivers/media/video/et61x251/et61x251_core.c
drivers/media/video/sn9c102/sn9c102_core.c
drivers/mfd/janz-cmodio.c
drivers/misc/lis3lv02d/lis3lv02d.c
include/linux/moduleparam.h

index 40f214a..5539f09 100644 (file)
@@ -76,8 +76,8 @@ MODULE_PARM_DESC(video_nr,
                 "\none and for every other camera."
                 "\n");
 
-static short force_munmap[] = {[0 ... ET61X251_MAX_DEVICES-1] =
-                              ET61X251_FORCE_MUNMAP};
+static bool force_munmap[] = {[0 ... ET61X251_MAX_DEVICES-1] =
+                             ET61X251_FORCE_MUNMAP};
 module_param_array(force_munmap, bool, NULL, 0444);
 MODULE_PARM_DESC(force_munmap,
                 "\n<0|1[,...]> Force the application to unmap previously"
index 7025be1..c2882fa 100644 (file)
@@ -75,8 +75,8 @@ MODULE_PARM_DESC(video_nr,
                 "\none and for every other camera."
                 "\n");
 
-static short force_munmap[] = {[0 ... SN9C102_MAX_DEVICES-1] =
-                              SN9C102_FORCE_MUNMAP};
+static bool force_munmap[] = {[0 ... SN9C102_MAX_DEVICES-1] =
+                             SN9C102_FORCE_MUNMAP};
 module_param_array(force_munmap, bool, NULL, 0444);
 MODULE_PARM_DESC(force_munmap,
                 " <0|1[,...]>"
index 5c2a06a..a9223ed 100644 (file)
@@ -33,7 +33,7 @@
 
 /* Module Parameters */
 static unsigned int num_modules = CMODIO_MAX_MODULES;
-static unsigned char *modules[CMODIO_MAX_MODULES] = {
+static char *modules[CMODIO_MAX_MODULES] = {
        "empty", "empty", "empty", "empty",
 };
 
index 29d12a7..a981e2a 100644 (file)
@@ -111,6 +111,8 @@ static struct kernel_param_ops param_ops_axis = {
        .get = param_get_int,
 };
 
+#define param_check_axis(name, p) param_check_int(name, p)
+
 module_param_array_named(axes, lis3_dev.ac.as_array, axis, NULL, 0644);
 MODULE_PARM_DESC(axes, "Axis-mapping for x,y,z directions");
 
index 7939f63..794d4b0 100644 (file)
@@ -395,6 +395,7 @@ extern int param_get_invbool(char *buffer, const struct kernel_param *kp);
  * module_param_named() for why this might be necessary.
  */
 #define module_param_array_named(name, array, type, nump, perm)                \
+       param_check_##type(name, &(array)[0]);                          \
        static const struct kparam_array __param_arr_##name             \
        = { .max = ARRAY_SIZE(array), .num = nump,                      \
            .ops = &param_ops_##type,                                   \