]> git.neil.brown.name Git - history.git/commitdiff
Merge
authorLinus Torvalds <torvalds@home.transmeta.com>
Mon, 30 Dec 2002 05:29:39 +0000 (21:29 -0800)
committerLinus Torvalds <torvalds@home.transmeta.com>
Mon, 30 Dec 2002 05:29:39 +0000 (21:29 -0800)
1  2 
kernel/module.c

diff --cc kernel/module.c
index c33aac2d23b96bb5931d9a5905b4eb497cbddbad,bc940cfa7d3b56521cf4841c3e0b46c05ee1e9d9..6d2e66e9bf3772f78492c2489d85fa714d4d0e7c
@@@ -569,6 -555,27 +569,13 @@@ static int param_set_byte(const char *v
        return 0;
  }
  
 -static int param_string(const char *name, const char *val,
 -                      unsigned int min, unsigned int max,
 -                      char *dest)
 -{
 -      if (strlen(val) < min || strlen(val) > max) {
 -              printk(KERN_ERR
 -                     "Parameter %s length must be %u-%u characters\n",
 -                     name, min, max);
 -              return -EINVAL;
 -      }
 -      strcpy(dest, 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;
                return param_array(kp->name, val, min, max, obsparm->addr,
                                   sizeof(long), param_set_long);
        case 's':
 -              return param_string(kp->name, val, min, max, obsparm->addr);
 +              return param_array(kp->name, val, min, max, obsparm->addr,
 +                                 sizeof(char *), param_set_charp);
+       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;