Commit 09619fdb authored by Rusty Russell's avatar Rusty Russell Committed by Linus Torvalds

[PATCH] MODULE_PARM "c" support

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).
parent 5e32ae7e
...@@ -569,10 +569,19 @@ static int param_string(const char *name, const char *val, ...@@ -569,10 +569,19 @@ static int param_string(const char *name, const char *val,
return 0; 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) extern int set_obsolete(const char *val, struct kernel_param *kp)
{ {
unsigned int min, max; unsigned int min, max;
char *p, *endp; unsigned int size, maxsize;
char *endp;
const char *p;
struct obsolete_modparm *obsparm = kp->arg; struct obsolete_modparm *obsparm = kp->arg;
if (!val) { if (!val) {
...@@ -605,9 +614,30 @@ extern int set_obsolete(const char *val, struct kernel_param *kp) ...@@ -605,9 +614,30 @@ extern int set_obsolete(const char *val, struct kernel_param *kp)
sizeof(long), param_set_long); sizeof(long), param_set_long);
case 's': case 's':
return param_string(kp->name, val, min, max, obsparm->addr); 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); printk(KERN_ERR "Unknown obsolete parameter type %s\n", obsparm->type);
return -EINVAL; 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, static int obsolete_params(const char *name,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment