]> git.hungrycats.org Git - linux/commitdiff
[PATCH] MODULE_PARM "c" support
authorRusty Russell <rusty@rustcorp.com.au>
Mon, 30 Dec 2002 05:04:02 +0000 (21:04 -0800)
committerLinus Torvalds <torvalds@home.transmeta.com>
Mon, 30 Dec 2002 05:04:02 +0000 (21:04 -0800)
Turns out there was an undocumented "c" flag for MODULE_PARM.

This implementation is a little ugly, but it works, and will do for
compatibility (I haven't implemented such a two-dimensional array
primitive, but the whole point of the module_parm et al is that they are
extensible).

kernel/module.c

index c73b19336f1ee738112f19cdfa2de5bbe40f54a1..bc940cfa7d3b56521cf4841c3e0b46c05ee1e9d9 100644 (file)
@@ -569,10 +569,19 @@ static int param_string(const char *name, const char *val,
        return 0;
 }
 
+/* Bounds checking done below */
+static int obsparm_copy_string(const char *val, struct kernel_param *kp)
+{
+       strcpy(kp->arg, val);
+       return 0;
+}
+
 extern int set_obsolete(const char *val, struct kernel_param *kp)
 {
        unsigned int min, max;
-       char *p, *endp;
+       unsigned int size, maxsize;
+       char *endp;
+       const char *p;
        struct obsolete_modparm *obsparm = kp->arg;
 
        if (!val) {
@@ -605,9 +614,30 @@ extern int set_obsolete(const char *val, struct kernel_param *kp)
                                   sizeof(long), param_set_long);
        case 's':
                return param_string(kp->name, val, min, max, obsparm->addr);
+
+       case 'c':
+               /* Undocumented: 1-5c50 means 1-5 strings of up to 49 chars,
+                  and the decl is "char xxx[5][50];" */
+               p = endp+1;
+               maxsize = simple_strtol(p, &endp, 10);
+               /* We check lengths here (yes, this is a hack). */
+               p = val;
+               while (p[size = strcspn(p, ",")]) {
+                       if (size >= maxsize) 
+                               goto oversize;
+                       p += size+1;
+               }
+               if (size >= maxsize) 
+                       goto oversize;
+               return param_array(kp->name, val, min, max, obsparm->addr,
+                                  maxsize, obsparm_copy_string);
        }
        printk(KERN_ERR "Unknown obsolete parameter type %s\n", obsparm->type);
        return -EINVAL;
+ oversize:
+       printk(KERN_ERR
+              "Parameter %s doesn't fit in %u chars.\n", kp->name, maxsize);
+       return -EINVAL;
 }
 
 static int obsolete_params(const char *name,