diff options
Diffstat (limited to 'kernel/module.c')
| -rw-r--r-- | kernel/module.c | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/kernel/module.c b/kernel/module.c index 901cd6ac2f11..5d437bffd8dc 100644 --- a/kernel/module.c +++ b/kernel/module.c | |||
| @@ -1933,8 +1933,15 @@ static struct module *load_module(void __user *umod, | |||
| 1933 | /* Set up license info based on the info section */ | 1933 | /* Set up license info based on the info section */ |
| 1934 | set_license(mod, get_modinfo(sechdrs, infoindex, "license")); | 1934 | set_license(mod, get_modinfo(sechdrs, infoindex, "license")); |
| 1935 | 1935 | ||
| 1936 | /* | ||
| 1937 | * ndiswrapper is under GPL by itself, but loads proprietary modules. | ||
| 1938 | * Don't use add_taint_module(), as it would prevent ndiswrapper from | ||
| 1939 | * using GPL-only symbols it needs. | ||
| 1940 | */ | ||
| 1936 | if (strcmp(mod->name, "ndiswrapper") == 0) | 1941 | if (strcmp(mod->name, "ndiswrapper") == 0) |
| 1937 | add_taint_module(mod, TAINT_PROPRIETARY_MODULE); | 1942 | add_taint(TAINT_PROPRIETARY_MODULE); |
| 1943 | |||
| 1944 | /* driverloader was caught wrongly pretending to be under GPL */ | ||
| 1938 | if (strcmp(mod->name, "driverloader") == 0) | 1945 | if (strcmp(mod->name, "driverloader") == 0) |
| 1939 | add_taint_module(mod, TAINT_PROPRIETARY_MODULE); | 1946 | add_taint_module(mod, TAINT_PROPRIETARY_MODULE); |
| 1940 | 1947 | ||
| @@ -2171,10 +2178,20 @@ sys_init_module(void __user *umod, | |||
| 2171 | wake_up(&module_wq); | 2178 | wake_up(&module_wq); |
| 2172 | return ret; | 2179 | return ret; |
| 2173 | } | 2180 | } |
| 2181 | if (ret > 0) { | ||
| 2182 | printk(KERN_WARNING "%s: '%s'->init suspiciously returned %d, " | ||
| 2183 | "it should follow 0/-E convention\n" | ||
| 2184 | KERN_WARNING "%s: loading module anyway...\n", | ||
| 2185 | __func__, mod->name, ret, | ||
| 2186 | __func__); | ||
| 2187 | dump_stack(); | ||
| 2188 | } | ||
| 2174 | 2189 | ||
| 2175 | /* Now it's a first class citizen! */ | 2190 | /* Now it's a first class citizen! Wake up anyone waiting for it. */ |
| 2176 | mutex_lock(&module_mutex); | ||
| 2177 | mod->state = MODULE_STATE_LIVE; | 2191 | mod->state = MODULE_STATE_LIVE; |
| 2192 | wake_up(&module_wq); | ||
| 2193 | |||
| 2194 | mutex_lock(&module_mutex); | ||
| 2178 | /* Drop initial reference. */ | 2195 | /* Drop initial reference. */ |
| 2179 | module_put(mod); | 2196 | module_put(mod); |
| 2180 | unwind_remove_table(mod->unwind_info, 1); | 2197 | unwind_remove_table(mod->unwind_info, 1); |
| @@ -2183,7 +2200,6 @@ sys_init_module(void __user *umod, | |||
| 2183 | mod->init_size = 0; | 2200 | mod->init_size = 0; |
| 2184 | mod->init_text_size = 0; | 2201 | mod->init_text_size = 0; |
| 2185 | mutex_unlock(&module_mutex); | 2202 | mutex_unlock(&module_mutex); |
| 2186 | wake_up(&module_wq); | ||
| 2187 | 2203 | ||
| 2188 | return 0; | 2204 | return 0; |
| 2189 | } | 2205 | } |
