aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorAlexey Dobriyan <adobriyan@sw.ru>2007-05-08 03:28:39 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-05-08 14:15:08 -0400
commitea07890a680273b25127129fb555aac0d9324bea (patch)
treeb0742aa5dd90792dc10be3563c1181582d0f5d9e /include
parentae84e324709d6320ed8c1fd7b1736fcbaf26df95 (diff)
Fix race between rmmod and cat /proc/kallsyms
module_get_kallsym() leaks "struct module *" outside of module_mutex which is no-no, because module can dissapear right after mutex unlock. Copy all needed information from inside module_mutex into caller-supplied space. [bunk@stusta.de: is_exported() can now become static] Signed-off-by: Alexey Dobriyan <adobriyan@sw.ru> Cc: Rusty Russell <rusty@rustcorp.com.au> Signed-off-by: Adrian Bunk <bunk@stusta.de> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'include')
-rw-r--r--include/linux/module.h21
1 files changed, 7 insertions, 14 deletions
diff --git a/include/linux/module.h b/include/linux/module.h
index 799930216626..58d5a10cdf0d 100644
--- a/include/linux/module.h
+++ b/include/linux/module.h
@@ -370,16 +370,14 @@ struct module *module_text_address(unsigned long addr);
370struct module *__module_text_address(unsigned long addr); 370struct module *__module_text_address(unsigned long addr);
371int is_module_address(unsigned long addr); 371int is_module_address(unsigned long addr);
372 372
373/* Returns module and fills in value, defined and namebuf, or NULL if 373/* Returns 0 and fills in value, defined and namebuf, or -ERANGE if
374 symnum out of range. */ 374 symnum out of range. */
375struct module *module_get_kallsym(unsigned int symnum, unsigned long *value, 375int module_get_kallsym(unsigned int symnum, unsigned long *value, char *type,
376 char *type, char *name); 376 char *name, char *module_name, int *exported);
377 377
378/* Look for this name: can be of form module:name. */ 378/* Look for this name: can be of form module:name. */
379unsigned long module_kallsyms_lookup_name(const char *name); 379unsigned long module_kallsyms_lookup_name(const char *name);
380 380
381int is_exported(const char *name, const struct module *mod);
382
383extern void __module_put_and_exit(struct module *mod, long code) 381extern void __module_put_and_exit(struct module *mod, long code)
384 __attribute__((noreturn)); 382 __attribute__((noreturn));
385#define module_put_and_exit(code) __module_put_and_exit(THIS_MODULE, code); 383#define module_put_and_exit(code) __module_put_and_exit(THIS_MODULE, code);
@@ -527,11 +525,11 @@ static inline const char *module_address_lookup(unsigned long addr,
527 return NULL; 525 return NULL;
528} 526}
529 527
530static inline struct module *module_get_kallsym(unsigned int symnum, 528static inline int module_get_kallsym(unsigned int symnum, unsigned long *value,
531 unsigned long *value, 529 char *type, char *name,
532 char *type, char *name) 530 char *module_name, int *exported)
533{ 531{
534 return NULL; 532 return -ERANGE;
535} 533}
536 534
537static inline unsigned long module_kallsyms_lookup_name(const char *name) 535static inline unsigned long module_kallsyms_lookup_name(const char *name)
@@ -539,11 +537,6 @@ static inline unsigned long module_kallsyms_lookup_name(const char *name)
539 return 0; 537 return 0;
540} 538}
541 539
542static inline int is_exported(const char *name, const struct module *mod)
543{
544 return 0;
545}
546
547static inline int register_module_notifier(struct notifier_block * nb) 540static inline int register_module_notifier(struct notifier_block * nb)
548{ 541{
549 /* no events will happen anyway, so this can always succeed */ 542 /* no events will happen anyway, so this can always succeed */