Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge git://github.com/rustyrussell/linux

* git://github.com/rustyrussell/linux:
params: make dashes and underscores in parameter names truly equal
kmod: prevent kmod_loop_msg overflow in __request_module()

+39 -10
+20
include/linux/moduleparam.h
··· 262 262 .str = &__param_string_##name, 0, perm); \ 263 263 __MODULE_PARM_TYPE(name, "string") 264 264 265 + /** 266 + * parameq - checks if two parameter names match 267 + * @name1: parameter name 1 268 + * @name2: parameter name 2 269 + * 270 + * Returns true if the two parameter names are equal. 271 + * Dashes (-) are considered equal to underscores (_). 272 + */ 273 + extern bool parameq(const char *name1, const char *name2); 274 + 275 + /** 276 + * parameqn - checks if two parameter names match 277 + * @name1: parameter name 1 278 + * @name2: parameter name 2 279 + * @n: the length to compare 280 + * 281 + * Similar to parameq(), except it compares @n characters. 282 + */ 283 + extern bool parameqn(const char *name1, const char *name2, size_t n); 284 + 265 285 /* Called on module insert or kernel boot */ 266 286 extern int parse_args(const char *name, 267 287 char *args,
+2 -2
init/main.c
··· 163 163 p = __setup_start; 164 164 do { 165 165 int n = strlen(p->str); 166 - if (!strncmp(line, p->str, n)) { 166 + if (parameqn(line, p->str, n)) { 167 167 if (p->early) { 168 168 /* Already done in parse_early_param? 169 169 * (Needs exact match on param part). ··· 392 392 const struct obs_kernel_param *p; 393 393 394 394 for (p = __setup_start; p < __setup_end; p++) { 395 - if ((p->early && strcmp(param, p->str) == 0) || 395 + if ((p->early && parameq(param, p->str)) || 396 396 (strcmp(param, "console") == 0 && 397 397 strcmp(p->str, "earlycon") == 0) 398 398 ) {
+3 -1
kernel/kmod.c
··· 114 114 atomic_inc(&kmod_concurrent); 115 115 if (atomic_read(&kmod_concurrent) > max_modprobes) { 116 116 /* We may be blaming an innocent here, but unlikely */ 117 - if (kmod_loop_msg++ < 5) 117 + if (kmod_loop_msg < 5) { 118 118 printk(KERN_ERR 119 119 "request_module: runaway loop modprobe %s\n", 120 120 module_name); 121 + kmod_loop_msg++; 122 + } 121 123 atomic_dec(&kmod_concurrent); 122 124 return -ENOMEM; 123 125 }
+14 -7
kernel/params.c
··· 67 67 } 68 68 } 69 69 70 - static inline char dash2underscore(char c) 70 + static char dash2underscore(char c) 71 71 { 72 72 if (c == '-') 73 73 return '_'; 74 74 return c; 75 75 } 76 76 77 - static inline int parameq(const char *input, const char *paramname) 77 + bool parameqn(const char *a, const char *b, size_t n) 78 78 { 79 - unsigned int i; 80 - for (i = 0; dash2underscore(input[i]) == paramname[i]; i++) 81 - if (input[i] == '\0') 82 - return 1; 83 - return 0; 79 + size_t i; 80 + 81 + for (i = 0; i < n; i++) { 82 + if (dash2underscore(a[i]) != dash2underscore(b[i])) 83 + return false; 84 + } 85 + return true; 86 + } 87 + 88 + bool parameq(const char *a, const char *b) 89 + { 90 + return parameqn(a, b, strlen(a)+1); 84 91 } 85 92 86 93 static int parse_one(char *param,