module.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:29k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. #include <linux/config.h>
  2. #include <linux/mm.h>
  3. #include <linux/module.h>
  4. #include <asm/module.h>
  5. #include <asm/uaccess.h>
  6. #include <linux/vmalloc.h>
  7. #include <linux/smp_lock.h>
  8. #include <asm/pgalloc.h>
  9. #include <linux/init.h>
  10. #include <linux/slab.h>
  11. #include <linux/kmod.h>
  12. #include <linux/seq_file.h>
  13. /*
  14.  * Originally by Anonymous (as far as I know...)
  15.  * Linux version by Bas Laarhoven <bas@vimec.nl>
  16.  * 0.99.14 version by Jon Tombs <jon@gtex02.us.es>,
  17.  * Heavily modified by Bjorn Ekwall <bj0rn@blox.se> May 1994 (C)
  18.  * Rewritten by Richard Henderson <rth@tamu.edu> Dec 1996
  19.  * Add MOD_INITIALIZING Keith Owens <kaos@ocs.com.au> Nov 1999
  20.  * Add kallsyms support, Keith Owens <kaos@ocs.com.au> Apr 2000
  21.  * Add asm/module support, IA64 has special requirements.  Keith Owens <kaos@ocs.com.au> Sep 2000
  22.  * Fix assorted bugs in module verification.  Keith Owens <kaos@ocs.com.au> Sep 2000
  23.  * Fix sys_init_module race, Andrew Morton <andrewm@uow.edu.au> Oct 2000
  24.  *     http://www.uwsg.iu.edu/hypermail/linux/kernel/0008.3/0379.html
  25.  * Replace xxx_module_symbol with inter_module_xxx.  Keith Owens <kaos@ocs.com.au> Oct 2000
  26.  * Add a module list lock for kernel fault race fixing. Alan Cox <alan@redhat.com>
  27.  *
  28.  * This source is covered by the GNU GPL, the same as all kernel sources.
  29.  */
  30. #if defined(CONFIG_MODULES) || defined(CONFIG_KALLSYMS)
  31. extern struct module_symbol __start___ksymtab[];
  32. extern struct module_symbol __stop___ksymtab[];
  33. extern const struct exception_table_entry __start___ex_table[];
  34. extern const struct exception_table_entry __stop___ex_table[];
  35. extern const char __start___kallsyms[] __attribute__ ((weak));
  36. extern const char __stop___kallsyms[] __attribute__ ((weak));
  37. struct module kernel_module =
  38. {
  39. size_of_struct: sizeof(struct module),
  40. name:  "",
  41. uc:   {ATOMIC_INIT(1)},
  42. flags: MOD_RUNNING,
  43. syms: __start___ksymtab,
  44. ex_table_start: __start___ex_table,
  45. ex_table_end: __stop___ex_table,
  46. kallsyms_start: __start___kallsyms,
  47. kallsyms_end: __stop___kallsyms,
  48. };
  49. struct module *module_list = &kernel_module;
  50. #endif /* defined(CONFIG_MODULES) || defined(CONFIG_KALLSYMS) */
  51. /* inter_module functions are always available, even when the kernel is
  52.  * compiled without modules.  Consumers of inter_module_xxx routines
  53.  * will always work, even when both are built into the kernel, this
  54.  * approach removes lots of #ifdefs in mainline code.
  55.  */
  56. static struct list_head ime_list = LIST_HEAD_INIT(ime_list);
  57. static spinlock_t ime_lock = SPIN_LOCK_UNLOCKED;
  58. static int kmalloc_failed;
  59. /*
  60.  * This lock prevents modifications that might race the kernel fault
  61.  * fixups. It does not prevent reader walks that the modules code
  62.  * does. The kernel lock does that.
  63.  *
  64.  * Since vmalloc fault fixups occur in any context this lock is taken
  65.  * irqsave at all times.
  66.  */
  67.  
  68. spinlock_t modlist_lock = SPIN_LOCK_UNLOCKED;
  69. /**
  70.  * inter_module_register - register a new set of inter module data.
  71.  * @im_name: an arbitrary string to identify the data, must be unique
  72.  * @owner: module that is registering the data, always use THIS_MODULE
  73.  * @userdata: pointer to arbitrary userdata to be registered
  74.  *
  75.  * Description: Check that the im_name has not already been registered,
  76.  * complain if it has.  For new data, add it to the inter_module_entry
  77.  * list.
  78.  */
  79. void inter_module_register(const char *im_name, struct module *owner, const void *userdata)
  80. {
  81. struct list_head *tmp;
  82. struct inter_module_entry *ime, *ime_new;
  83. if (!(ime_new = kmalloc(sizeof(*ime), GFP_KERNEL))) {
  84. /* Overloaded kernel, not fatal */
  85. printk(KERN_ERR
  86. "Aiee, inter_module_register: cannot kmalloc entry for '%s'n",
  87. im_name);
  88. kmalloc_failed = 1;
  89. return;
  90. }
  91. memset(ime_new, 0, sizeof(*ime_new));
  92. ime_new->im_name = im_name;
  93. ime_new->owner = owner;
  94. ime_new->userdata = userdata;
  95. spin_lock(&ime_lock);
  96. list_for_each(tmp, &ime_list) {
  97. ime = list_entry(tmp, struct inter_module_entry, list);
  98. if (strcmp(ime->im_name, im_name) == 0) {
  99. spin_unlock(&ime_lock);
  100. kfree(ime_new);
  101. /* Program logic error, fatal */
  102. printk(KERN_ERR "inter_module_register: duplicate im_name '%s'", im_name);
  103. BUG();
  104. }
  105. }
  106. list_add(&(ime_new->list), &ime_list);
  107. spin_unlock(&ime_lock);
  108. }
  109. /**
  110.  * inter_module_unregister - unregister a set of inter module data.
  111.  * @im_name: an arbitrary string to identify the data, must be unique
  112.  *
  113.  * Description: Check that the im_name has been registered, complain if
  114.  * it has not.  For existing data, remove it from the
  115.  * inter_module_entry list.
  116.  */
  117. void inter_module_unregister(const char *im_name)
  118. {
  119. struct list_head *tmp;
  120. struct inter_module_entry *ime;
  121. spin_lock(&ime_lock);
  122. list_for_each(tmp, &ime_list) {
  123. ime = list_entry(tmp, struct inter_module_entry, list);
  124. if (strcmp(ime->im_name, im_name) == 0) {
  125. list_del(&(ime->list));
  126. spin_unlock(&ime_lock);
  127. kfree(ime);
  128. return;
  129. }
  130. }
  131. spin_unlock(&ime_lock);
  132. if (kmalloc_failed) {
  133. printk(KERN_ERR
  134. "inter_module_unregister: no entry for '%s', "
  135. "probably caused by previous kmalloc failuren",
  136. im_name);
  137. return;
  138. }
  139. else {
  140. /* Program logic error, fatal */
  141. printk(KERN_ERR "inter_module_unregister: no entry for '%s'", im_name);
  142. BUG();
  143. }
  144. }
  145. /**
  146.  * inter_module_get - return arbitrary userdata from another module.
  147.  * @im_name: an arbitrary string to identify the data, must be unique
  148.  *
  149.  * Description: If the im_name has not been registered, return NULL.
  150.  * Try to increment the use count on the owning module, if that fails
  151.  * then return NULL.  Otherwise return the userdata.
  152.  */
  153. const void *inter_module_get(const char *im_name)
  154. {
  155. struct list_head *tmp;
  156. struct inter_module_entry *ime;
  157. const void *result = NULL;
  158. spin_lock(&ime_lock);
  159. list_for_each(tmp, &ime_list) {
  160. ime = list_entry(tmp, struct inter_module_entry, list);
  161. if (strcmp(ime->im_name, im_name) == 0) {
  162. if (try_inc_mod_count(ime->owner))
  163. result = ime->userdata;
  164. break;
  165. }
  166. }
  167. spin_unlock(&ime_lock);
  168. return(result);
  169. }
  170. /**
  171.  * inter_module_get_request - im get with automatic request_module.
  172.  * @im_name: an arbitrary string to identify the data, must be unique
  173.  * @modname: module that is expected to register im_name
  174.  *
  175.  * Description: If inter_module_get fails, do request_module then retry.
  176.  */
  177. const void *inter_module_get_request(const char *im_name, const char *modname)
  178. {
  179. const void *result = inter_module_get(im_name);
  180. if (!result) {
  181. request_module(modname);
  182. result = inter_module_get(im_name);
  183. }
  184. return(result);
  185. }
  186. /**
  187.  * inter_module_put - release use of data from another module.
  188.  * @im_name: an arbitrary string to identify the data, must be unique
  189.  *
  190.  * Description: If the im_name has not been registered, complain,
  191.  * otherwise decrement the use count on the owning module.
  192.  */
  193. void inter_module_put(const char *im_name)
  194. {
  195. struct list_head *tmp;
  196. struct inter_module_entry *ime;
  197. spin_lock(&ime_lock);
  198. list_for_each(tmp, &ime_list) {
  199. ime = list_entry(tmp, struct inter_module_entry, list);
  200. if (strcmp(ime->im_name, im_name) == 0) {
  201. if (ime->owner)
  202. __MOD_DEC_USE_COUNT(ime->owner);
  203. spin_unlock(&ime_lock);
  204. return;
  205. }
  206. }
  207. spin_unlock(&ime_lock);
  208. printk(KERN_ERR "inter_module_put: no entry for '%s'", im_name);
  209. BUG();
  210. }
  211. #if defined(CONFIG_MODULES) /* The rest of the source */
  212. static long get_mod_name(const char *user_name, char **buf);
  213. static void put_mod_name(char *buf);
  214. struct module *find_module(const char *name);
  215. void free_module(struct module *, int tag_freed);
  216. /*
  217.  * Called at boot time
  218.  */
  219. void __init init_modules(void)
  220. {
  221. kernel_module.nsyms = __stop___ksymtab - __start___ksymtab;
  222. arch_init_modules(&kernel_module);
  223. }
  224. /*
  225.  * Copy the name of a module from user space.
  226.  */
  227. static inline long
  228. get_mod_name(const char *user_name, char **buf)
  229. {
  230. unsigned long page;
  231. long retval;
  232. page = __get_free_page(GFP_KERNEL);
  233. if (!page)
  234. return -ENOMEM;
  235. retval = strncpy_from_user((char *)page, user_name, PAGE_SIZE);
  236. if (retval > 0) {
  237. if (retval < PAGE_SIZE) {
  238. *buf = (char *)page;
  239. return retval;
  240. }
  241. retval = -ENAMETOOLONG;
  242. } else if (!retval)
  243. retval = -EINVAL;
  244. free_page(page);
  245. return retval;
  246. }
  247. static inline void
  248. put_mod_name(char *buf)
  249. {
  250. free_page((unsigned long)buf);
  251. }
  252. /*
  253.  * Allocate space for a module.
  254.  */
  255. asmlinkage unsigned long
  256. sys_create_module(const char *name_user, size_t size)
  257. {
  258. char *name;
  259. long namelen, error;
  260. struct module *mod;
  261. unsigned long flags;
  262. if (!capable(CAP_SYS_MODULE))
  263. return -EPERM;
  264. lock_kernel();
  265. if ((namelen = get_mod_name(name_user, &name)) < 0) {
  266. error = namelen;
  267. goto err0;
  268. }
  269. if (size < sizeof(struct module)+namelen) {
  270. error = -EINVAL;
  271. goto err1;
  272. }
  273. if (find_module(name) != NULL) {
  274. error = -EEXIST;
  275. goto err1;
  276. }
  277. if ((mod = (struct module *)module_map(size)) == NULL) {
  278. error = -ENOMEM;
  279. goto err1;
  280. }
  281. memset(mod, 0, sizeof(*mod));
  282. mod->size_of_struct = sizeof(*mod);
  283. mod->name = (char *)(mod + 1);
  284. mod->size = size;
  285. memcpy((char*)(mod+1), name, namelen+1);
  286. put_mod_name(name);
  287. spin_lock_irqsave(&modlist_lock, flags);
  288. mod->next = module_list;
  289. module_list = mod; /* link it in */
  290. spin_unlock_irqrestore(&modlist_lock, flags);
  291. error = (long) mod;
  292. goto err0;
  293. err1:
  294. put_mod_name(name);
  295. err0:
  296. unlock_kernel();
  297. return error;
  298. }
  299. /*
  300.  * Initialize a module.
  301.  */
  302. asmlinkage long
  303. sys_init_module(const char *name_user, struct module *mod_user)
  304. {
  305. struct module mod_tmp, *mod;
  306. char *name, *n_name, *name_tmp = NULL;
  307. long namelen, n_namelen, i, error;
  308. unsigned long mod_user_size;
  309. struct module_ref *dep;
  310. if (!capable(CAP_SYS_MODULE))
  311. return -EPERM;
  312. lock_kernel();
  313. if ((namelen = get_mod_name(name_user, &name)) < 0) {
  314. error = namelen;
  315. goto err0;
  316. }
  317. if ((mod = find_module(name)) == NULL) {
  318. error = -ENOENT;
  319. goto err1;
  320. }
  321. /* Check module header size.  We allow a bit of slop over the
  322.    size we are familiar with to cope with a version of insmod
  323.    for a newer kernel.  But don't over do it. */
  324. if ((error = get_user(mod_user_size, &mod_user->size_of_struct)) != 0)
  325. goto err1;
  326. if (mod_user_size < (unsigned long)&((struct module *)0L)->persist_start
  327.     || mod_user_size > sizeof(struct module) + 16*sizeof(void*)) {
  328. printk(KERN_ERR "init_module: Invalid module header size.n"
  329.        KERN_ERR "A new version of the modutils is likely "
  330. "needed.n");
  331. error = -EINVAL;
  332. goto err1;
  333. }
  334. /* Hold the current contents while we play with the user's idea
  335.    of righteousness.  */
  336. mod_tmp = *mod;
  337. name_tmp = kmalloc(strlen(mod->name) + 1, GFP_KERNEL); /* Where's kstrdup()? */
  338. if (name_tmp == NULL) {
  339. error = -ENOMEM;
  340. goto err1;
  341. }
  342. strcpy(name_tmp, mod->name);
  343. error = copy_from_user(mod, mod_user, mod_user_size);
  344. if (error) {
  345. error = -EFAULT;
  346. goto err2;
  347. }
  348. /* Sanity check the size of the module.  */
  349. error = -EINVAL;
  350. if (mod->size > mod_tmp.size) {
  351. printk(KERN_ERR "init_module: Size of initialized module "
  352. "exceeds size of created module.n");
  353. goto err2;
  354. }
  355. /* Make sure all interesting pointers are sane.  */
  356. if (!mod_bound(mod->name, namelen, mod)) {
  357. printk(KERN_ERR "init_module: mod->name out of bounds.n");
  358. goto err2;
  359. }
  360. if (mod->nsyms && !mod_bound(mod->syms, mod->nsyms, mod)) {
  361. printk(KERN_ERR "init_module: mod->syms out of bounds.n");
  362. goto err2;
  363. }
  364. if (mod->ndeps && !mod_bound(mod->deps, mod->ndeps, mod)) {
  365. printk(KERN_ERR "init_module: mod->deps out of bounds.n");
  366. goto err2;
  367. }
  368. if (mod->init && !mod_bound(mod->init, 0, mod)) {
  369. printk(KERN_ERR "init_module: mod->init out of bounds.n");
  370. goto err2;
  371. }
  372. if (mod->cleanup && !mod_bound(mod->cleanup, 0, mod)) {
  373. printk(KERN_ERR "init_module: mod->cleanup out of bounds.n");
  374. goto err2;
  375. }
  376. if (mod->ex_table_start > mod->ex_table_end
  377.     || (mod->ex_table_start &&
  378. !((unsigned long)mod->ex_table_start >= ((unsigned long)mod + mod->size_of_struct)
  379.   && ((unsigned long)mod->ex_table_end
  380.       < (unsigned long)mod + mod->size)))
  381.     || (((unsigned long)mod->ex_table_start
  382.  - (unsigned long)mod->ex_table_end)
  383. % sizeof(struct exception_table_entry))) {
  384. printk(KERN_ERR "init_module: mod->ex_table_* invalid.n");
  385. goto err2;
  386. }
  387. if (mod->flags & ~MOD_AUTOCLEAN) {
  388. printk(KERN_ERR "init_module: mod->flags invalid.n");
  389. goto err2;
  390. }
  391. if (mod_member_present(mod, can_unload)
  392.     && mod->can_unload && !mod_bound(mod->can_unload, 0, mod)) {
  393. printk(KERN_ERR "init_module: mod->can_unload out of bounds.n");
  394. goto err2;
  395. }
  396. if (mod_member_present(mod, kallsyms_end)) {
  397.     if (mod->kallsyms_end &&
  398. (!mod_bound(mod->kallsyms_start, 0, mod) ||
  399.  !mod_bound(mod->kallsyms_end, 0, mod))) {
  400. printk(KERN_ERR "init_module: mod->kallsyms out of bounds.n");
  401. goto err2;
  402.     }
  403.     if (mod->kallsyms_start > mod->kallsyms_end) {
  404. printk(KERN_ERR "init_module: mod->kallsyms invalid.n");
  405. goto err2;
  406.     }
  407. }
  408. if (mod_member_present(mod, archdata_end)) {
  409.     if (mod->archdata_end &&
  410. (!mod_bound(mod->archdata_start, 0, mod) ||
  411.  !mod_bound(mod->archdata_end, 0, mod))) {
  412. printk(KERN_ERR "init_module: mod->archdata out of bounds.n");
  413. goto err2;
  414.     }
  415.     if (mod->archdata_start > mod->archdata_end) {
  416. printk(KERN_ERR "init_module: mod->archdata invalid.n");
  417. goto err2;
  418.     }
  419. }
  420. if (mod_member_present(mod, kernel_data) && mod->kernel_data) {
  421.     printk(KERN_ERR "init_module: mod->kernel_data must be zero.n");
  422.     goto err2;
  423. }
  424. /* Check that the user isn't doing something silly with the name.  */
  425. if ((n_namelen = get_mod_name(mod->name - (unsigned long)mod
  426.       + (unsigned long)mod_user,
  427.       &n_name)) < 0) {
  428. printk(KERN_ERR "init_module: get_mod_name failure.n");
  429. error = n_namelen;
  430. goto err2;
  431. }
  432. if (namelen != n_namelen || strcmp(n_name, mod_tmp.name) != 0) {
  433. printk(KERN_ERR "init_module: changed module name to "
  434. "`%s' from `%s'n",
  435.        n_name, mod_tmp.name);
  436. goto err3;
  437. }
  438. /* Ok, that's about all the sanity we can stomach; copy the rest.  */
  439. if (copy_from_user((char *)mod+mod_user_size,
  440.    (char *)mod_user+mod_user_size,
  441.    mod->size-mod_user_size)) {
  442. error = -EFAULT;
  443. goto err3;
  444. }
  445. if (module_arch_init(mod))
  446. goto err3;
  447. /* On some machines it is necessary to do something here
  448.    to make the I and D caches consistent.  */
  449. flush_icache_range((unsigned long)mod, (unsigned long)mod + mod->size);
  450. mod->next = mod_tmp.next;
  451. mod->refs = NULL;
  452. /* Sanity check the module's dependents */
  453. for (i = 0, dep = mod->deps; i < mod->ndeps; ++i, ++dep) {
  454. struct module *o, *d = dep->dep;
  455. /* Make sure the indicated dependencies are really modules.  */
  456. if (d == mod) {
  457. printk(KERN_ERR "init_module: self-referential "
  458. "dependency in mod->deps.n");
  459. goto err3;
  460. }
  461. /* Scan the current modules for this dependency */
  462. for (o = module_list; o != &kernel_module && o != d; o = o->next)
  463. ;
  464. if (o != d) {
  465. printk(KERN_ERR "init_module: found dependency that is "
  466. "(no longer?) a module.n");
  467. goto err3;
  468. }
  469. }
  470. /* Update module references.  */
  471. for (i = 0, dep = mod->deps; i < mod->ndeps; ++i, ++dep) {
  472. struct module *d = dep->dep;
  473. dep->ref = mod;
  474. dep->next_ref = d->refs;
  475. d->refs = dep;
  476. /* Being referenced by a dependent module counts as a
  477.    use as far as kmod is concerned.  */
  478. d->flags |= MOD_USED_ONCE;
  479. }
  480. /* Free our temporary memory.  */
  481. put_mod_name(n_name);
  482. put_mod_name(name);
  483. /* Initialize the module.  */
  484. atomic_set(&mod->uc.usecount,1);
  485. mod->flags |= MOD_INITIALIZING;
  486. if (mod->init && (error = mod->init()) != 0) {
  487. atomic_set(&mod->uc.usecount,0);
  488. mod->flags &= ~MOD_INITIALIZING;
  489. if (error > 0) /* Buggy module */
  490. error = -EBUSY;
  491. goto err0;
  492. }
  493. atomic_dec(&mod->uc.usecount);
  494. /* And set it running.  */
  495. mod->flags = (mod->flags | MOD_RUNNING) & ~MOD_INITIALIZING;
  496. error = 0;
  497. goto err0;
  498. err3:
  499. put_mod_name(n_name);
  500. err2:
  501. *mod = mod_tmp;
  502. strcpy((char *)mod->name, name_tmp); /* We know there is room for this */
  503. err1:
  504. put_mod_name(name);
  505. err0:
  506. unlock_kernel();
  507. kfree(name_tmp);
  508. return error;
  509. }
  510. static spinlock_t unload_lock = SPIN_LOCK_UNLOCKED;
  511. int try_inc_mod_count(struct module *mod)
  512. {
  513. int res = 1;
  514. if (mod) {
  515. spin_lock(&unload_lock);
  516. if (mod->flags & MOD_DELETED)
  517. res = 0;
  518. else
  519. __MOD_INC_USE_COUNT(mod);
  520. spin_unlock(&unload_lock);
  521. }
  522. return res;
  523. }
  524. asmlinkage long
  525. sys_delete_module(const char *name_user)
  526. {
  527. struct module *mod, *next;
  528. char *name;
  529. long error;
  530. int something_changed;
  531. if (!capable(CAP_SYS_MODULE))
  532. return -EPERM;
  533. lock_kernel();
  534. if (name_user) {
  535. if ((error = get_mod_name(name_user, &name)) < 0)
  536. goto out;
  537. error = -ENOENT;
  538. if ((mod = find_module(name)) == NULL) {
  539. put_mod_name(name);
  540. goto out;
  541. }
  542. put_mod_name(name);
  543. error = -EBUSY;
  544. if (mod->refs != NULL)
  545. goto out;
  546. spin_lock(&unload_lock);
  547. if (!__MOD_IN_USE(mod)) {
  548. mod->flags |= MOD_DELETED;
  549. spin_unlock(&unload_lock);
  550. free_module(mod, 0);
  551. error = 0;
  552. } else {
  553. spin_unlock(&unload_lock);
  554. }
  555. goto out;
  556. }
  557. /* Do automatic reaping */
  558. restart:
  559. something_changed = 0;
  560. for (mod = module_list; mod != &kernel_module; mod = next) {
  561. next = mod->next;
  562. spin_lock(&unload_lock);
  563. if (mod->refs == NULL
  564.     && (mod->flags & MOD_AUTOCLEAN)
  565.     && (mod->flags & MOD_RUNNING)
  566.     && !(mod->flags & MOD_DELETED)
  567.     && (mod->flags & MOD_USED_ONCE)
  568.     && !__MOD_IN_USE(mod)) {
  569. if ((mod->flags & MOD_VISITED)
  570.     && !(mod->flags & MOD_JUST_FREED)) {
  571. spin_unlock(&unload_lock);
  572. mod->flags &= ~MOD_VISITED;
  573. } else {
  574. mod->flags |= MOD_DELETED;
  575. spin_unlock(&unload_lock);
  576. free_module(mod, 1);
  577. something_changed = 1;
  578. }
  579. } else {
  580. spin_unlock(&unload_lock);
  581. }
  582. }
  583. if (something_changed)
  584. goto restart;
  585. for (mod = module_list; mod != &kernel_module; mod = mod->next)
  586. mod->flags &= ~MOD_JUST_FREED;
  587. error = 0;
  588. out:
  589. unlock_kernel();
  590. return error;
  591. }
  592. /* Query various bits about modules.  */
  593. static int
  594. qm_modules(char *buf, size_t bufsize, size_t *ret)
  595. {
  596. struct module *mod;
  597. size_t nmod, space, len;
  598. nmod = space = 0;
  599. for (mod=module_list; mod != &kernel_module; mod=mod->next, ++nmod) {
  600. len = strlen(mod->name)+1;
  601. if (len > bufsize)
  602. goto calc_space_needed;
  603. if (copy_to_user(buf, mod->name, len))
  604. return -EFAULT;
  605. buf += len;
  606. bufsize -= len;
  607. space += len;
  608. }
  609. if (put_user(nmod, ret))
  610. return -EFAULT;
  611. else
  612. return 0;
  613. calc_space_needed:
  614. space += len;
  615. while ((mod = mod->next) != &kernel_module)
  616. space += strlen(mod->name)+1;
  617. if (put_user(space, ret))
  618. return -EFAULT;
  619. else
  620. return -ENOSPC;
  621. }
  622. static int
  623. qm_deps(struct module *mod, char *buf, size_t bufsize, size_t *ret)
  624. {
  625. size_t i, space, len;
  626. if (mod == &kernel_module)
  627. return -EINVAL;
  628. if (!MOD_CAN_QUERY(mod))
  629. if (put_user(0, ret))
  630. return -EFAULT;
  631. else
  632. return 0;
  633. space = 0;
  634. for (i = 0; i < mod->ndeps; ++i) {
  635. const char *dep_name = mod->deps[i].dep->name;
  636. len = strlen(dep_name)+1;
  637. if (len > bufsize)
  638. goto calc_space_needed;
  639. if (copy_to_user(buf, dep_name, len))
  640. return -EFAULT;
  641. buf += len;
  642. bufsize -= len;
  643. space += len;
  644. }
  645. if (put_user(i, ret))
  646. return -EFAULT;
  647. else
  648. return 0;
  649. calc_space_needed:
  650. space += len;
  651. while (++i < mod->ndeps)
  652. space += strlen(mod->deps[i].dep->name)+1;
  653. if (put_user(space, ret))
  654. return -EFAULT;
  655. else
  656. return -ENOSPC;
  657. }
  658. static int
  659. qm_refs(struct module *mod, char *buf, size_t bufsize, size_t *ret)
  660. {
  661. size_t nrefs, space, len;
  662. struct module_ref *ref;
  663. if (mod == &kernel_module)
  664. return -EINVAL;
  665. if (!MOD_CAN_QUERY(mod))
  666. if (put_user(0, ret))
  667. return -EFAULT;
  668. else
  669. return 0;
  670. space = 0;
  671. for (nrefs = 0, ref = mod->refs; ref ; ++nrefs, ref = ref->next_ref) {
  672. const char *ref_name = ref->ref->name;
  673. len = strlen(ref_name)+1;
  674. if (len > bufsize)
  675. goto calc_space_needed;
  676. if (copy_to_user(buf, ref_name, len))
  677. return -EFAULT;
  678. buf += len;
  679. bufsize -= len;
  680. space += len;
  681. }
  682. if (put_user(nrefs, ret))
  683. return -EFAULT;
  684. else
  685. return 0;
  686. calc_space_needed:
  687. space += len;
  688. while ((ref = ref->next_ref) != NULL)
  689. space += strlen(ref->ref->name)+1;
  690. if (put_user(space, ret))
  691. return -EFAULT;
  692. else
  693. return -ENOSPC;
  694. }
  695. static int
  696. qm_symbols(struct module *mod, char *buf, size_t bufsize, size_t *ret)
  697. {
  698. size_t i, space, len;
  699. struct module_symbol *s;
  700. char *strings;
  701. unsigned long *vals;
  702. if (!MOD_CAN_QUERY(mod))
  703. if (put_user(0, ret))
  704. return -EFAULT;
  705. else
  706. return 0;
  707. space = mod->nsyms * 2*sizeof(void *);
  708. i = len = 0;
  709. s = mod->syms;
  710. if (space > bufsize)
  711. goto calc_space_needed;
  712. if (!access_ok(VERIFY_WRITE, buf, space))
  713. return -EFAULT;
  714. bufsize -= space;
  715. vals = (unsigned long *)buf;
  716. strings = buf+space;
  717. for (; i < mod->nsyms ; ++i, ++s, vals += 2) {
  718. len = strlen(s->name)+1;
  719. if (len > bufsize)
  720. goto calc_space_needed;
  721. if (copy_to_user(strings, s->name, len)
  722.     || __put_user(s->value, vals+0)
  723.     || __put_user(space, vals+1))
  724. return -EFAULT;
  725. strings += len;
  726. bufsize -= len;
  727. space += len;
  728. }
  729. if (put_user(i, ret))
  730. return -EFAULT;
  731. else
  732. return 0;
  733. calc_space_needed:
  734. for (; i < mod->nsyms; ++i, ++s)
  735. space += strlen(s->name)+1;
  736. if (put_user(space, ret))
  737. return -EFAULT;
  738. else
  739. return -ENOSPC;
  740. }
  741. static int
  742. qm_info(struct module *mod, char *buf, size_t bufsize, size_t *ret)
  743. {
  744. int error = 0;
  745. if (mod == &kernel_module)
  746. return -EINVAL;
  747. if (sizeof(struct module_info) <= bufsize) {
  748. struct module_info info;
  749. info.addr = (unsigned long)mod;
  750. info.size = mod->size;
  751. info.flags = mod->flags;
  752. /* usecount is one too high here - report appropriately to
  753.    compensate for locking */
  754. info.usecount = (mod_member_present(mod, can_unload)
  755.  && mod->can_unload ? -1 : atomic_read(&mod->uc.usecount)-1);
  756. if (copy_to_user(buf, &info, sizeof(struct module_info)))
  757. return -EFAULT;
  758. } else
  759. error = -ENOSPC;
  760. if (put_user(sizeof(struct module_info), ret))
  761. return -EFAULT;
  762. return error;
  763. }
  764. asmlinkage long
  765. sys_query_module(const char *name_user, int which, char *buf, size_t bufsize,
  766.  size_t *ret)
  767. {
  768. struct module *mod;
  769. int err;
  770. lock_kernel();
  771. if (name_user == NULL)
  772. mod = &kernel_module;
  773. else {
  774. long namelen;
  775. char *name;
  776. if ((namelen = get_mod_name(name_user, &name)) < 0) {
  777. err = namelen;
  778. goto out;
  779. }
  780. err = -ENOENT;
  781. if ((mod = find_module(name)) == NULL) {
  782. put_mod_name(name);
  783. goto out;
  784. }
  785. put_mod_name(name);
  786. }
  787. /* __MOD_ touches the flags. We must avoid that */
  788. atomic_inc(&mod->uc.usecount);
  789. switch (which)
  790. {
  791. case 0:
  792. err = 0;
  793. break;
  794. case QM_MODULES:
  795. err = qm_modules(buf, bufsize, ret);
  796. break;
  797. case QM_DEPS:
  798. err = qm_deps(mod, buf, bufsize, ret);
  799. break;
  800. case QM_REFS:
  801. err = qm_refs(mod, buf, bufsize, ret);
  802. break;
  803. case QM_SYMBOLS:
  804. err = qm_symbols(mod, buf, bufsize, ret);
  805. break;
  806. case QM_INFO:
  807. err = qm_info(mod, buf, bufsize, ret);
  808. break;
  809. default:
  810. err = -EINVAL;
  811. break;
  812. }
  813. atomic_dec(&mod->uc.usecount);
  814. out:
  815. unlock_kernel();
  816. return err;
  817. }
  818. /*
  819.  * Copy the kernel symbol table to user space.  If the argument is
  820.  * NULL, just return the size of the table.
  821.  *
  822.  * This call is obsolete.  New programs should use query_module+QM_SYMBOLS
  823.  * which does not arbitrarily limit the length of symbols.
  824.  */
  825. asmlinkage long
  826. sys_get_kernel_syms(struct kernel_sym *table)
  827. {
  828. struct module *mod;
  829. int i;
  830. struct kernel_sym ksym;
  831. lock_kernel();
  832. for (mod = module_list, i = 0; mod; mod = mod->next) {
  833. /* include the count for the module name! */
  834. i += mod->nsyms + 1;
  835. }
  836. if (table == NULL)
  837. goto out;
  838. /* So that we don't give the user our stack content */
  839. memset (&ksym, 0, sizeof (ksym));
  840. for (mod = module_list, i = 0; mod; mod = mod->next) {
  841. struct module_symbol *msym;
  842. unsigned int j;
  843. if (!MOD_CAN_QUERY(mod))
  844. continue;
  845. /* magic: write module info as a pseudo symbol */
  846. ksym.value = (unsigned long)mod;
  847. ksym.name[0] = '#';
  848. strncpy(ksym.name+1, mod->name, sizeof(ksym.name)-1);
  849. ksym.name[sizeof(ksym.name)-1] = '';
  850. if (copy_to_user(table, &ksym, sizeof(ksym)) != 0)
  851. goto out;
  852. ++i, ++table;
  853. if (mod->nsyms == 0)
  854. continue;
  855. for (j = 0, msym = mod->syms; j < mod->nsyms; ++j, ++msym) {
  856. ksym.value = msym->value;
  857. strncpy(ksym.name, msym->name, sizeof(ksym.name));
  858. ksym.name[sizeof(ksym.name)-1] = '';
  859. if (copy_to_user(table, &ksym, sizeof(ksym)) != 0)
  860. goto out;
  861. ++i, ++table;
  862. }
  863. }
  864. out:
  865. unlock_kernel();
  866. return i;
  867. }
  868. /*
  869.  * Look for a module by name, ignoring modules marked for deletion.
  870.  */
  871. struct module *
  872. find_module(const char *name)
  873. {
  874. struct module *mod;
  875. for (mod = module_list; mod ; mod = mod->next) {
  876. if (mod->flags & MOD_DELETED)
  877. continue;
  878. if (!strcmp(mod->name, name))
  879. break;
  880. }
  881. return mod;
  882. }
  883. /*
  884.  * Free the given module.
  885.  */
  886. void
  887. free_module(struct module *mod, int tag_freed)
  888. {
  889. struct module_ref *dep;
  890. unsigned i;
  891. unsigned long flags;
  892. /* Let the module clean up.  */
  893. if (mod->flags & MOD_RUNNING)
  894. {
  895. if(mod->cleanup)
  896. mod->cleanup();
  897. mod->flags &= ~MOD_RUNNING;
  898. }
  899. /* Remove the module from the dependency lists.  */
  900. for (i = 0, dep = mod->deps; i < mod->ndeps; ++i, ++dep) {
  901. struct module_ref **pp;
  902. for (pp = &dep->dep->refs; *pp != dep; pp = &(*pp)->next_ref)
  903. continue;
  904. *pp = dep->next_ref;
  905. if (tag_freed && dep->dep->refs == NULL)
  906. dep->dep->flags |= MOD_JUST_FREED;
  907. }
  908. /* And from the main module list.  */
  909. spin_lock_irqsave(&modlist_lock, flags);
  910. if (mod == module_list) {
  911. module_list = mod->next;
  912. } else {
  913. struct module *p;
  914. for (p = module_list; p->next != mod; p = p->next)
  915. continue;
  916. p->next = mod->next;
  917. }
  918. spin_unlock_irqrestore(&modlist_lock, flags);
  919. /* And free the memory.  */
  920. module_unmap(mod);
  921. }
  922. /*
  923.  * Called by the /proc file system to return a current list of modules.
  924.  */
  925. int get_module_list(char *p)
  926. {
  927. size_t left = PAGE_SIZE;
  928. struct module *mod;
  929. char tmpstr[64];
  930. struct module_ref *ref;
  931. for (mod = module_list; mod != &kernel_module; mod = mod->next) {
  932. long len;
  933. const char *q;
  934. #define safe_copy_str(str, len)
  935. do {
  936. if (left < len)
  937. goto fini;
  938. memcpy(p, str, len); p += len, left -= len;
  939. } while (0)
  940. #define safe_copy_cstr(str) safe_copy_str(str, sizeof(str)-1)
  941. len = strlen(mod->name);
  942. safe_copy_str(mod->name, len);
  943. if ((len = 20 - len) > 0) {
  944. if (left < len)
  945. goto fini;
  946. memset(p, ' ', len);
  947. p += len;
  948. left -= len;
  949. }
  950. len = sprintf(tmpstr, "%8lu", mod->size);
  951. safe_copy_str(tmpstr, len);
  952. if (mod->flags & MOD_RUNNING) {
  953. len = sprintf(tmpstr, "%4ld",
  954.       (mod_member_present(mod, can_unload)
  955.        && mod->can_unload
  956.        ? -1L : (long)atomic_read(&mod->uc.usecount)));
  957. safe_copy_str(tmpstr, len);
  958. }
  959. if (mod->flags & MOD_DELETED)
  960. safe_copy_cstr(" (deleted)");
  961. else if (mod->flags & MOD_RUNNING) {
  962. if (mod->flags & MOD_AUTOCLEAN)
  963. safe_copy_cstr(" (autoclean)");
  964. if (!(mod->flags & MOD_USED_ONCE))
  965. safe_copy_cstr(" (unused)");
  966. }
  967. else if (mod->flags & MOD_INITIALIZING)
  968. safe_copy_cstr(" (initializing)");
  969. else
  970. safe_copy_cstr(" (uninitialized)");
  971. if ((ref = mod->refs) != NULL) {
  972. safe_copy_cstr(" [");
  973. while (1) {
  974. q = ref->ref->name;
  975. len = strlen(q);
  976. safe_copy_str(q, len);
  977. if ((ref = ref->next_ref) != NULL)
  978. safe_copy_cstr(" ");
  979. else
  980. break;
  981. }
  982. safe_copy_cstr("]");
  983. }
  984. safe_copy_cstr("n");
  985. #undef safe_copy_str
  986. #undef safe_copy_cstr
  987. }
  988. fini:
  989. return PAGE_SIZE - left;
  990. }
  991. /*
  992.  * Called by the /proc file system to return a current list of ksyms.
  993.  */
  994. struct mod_sym {
  995. struct module *mod;
  996. int index;
  997. };
  998. /* iterator */
  999. static void *s_start(struct seq_file *m, loff_t *pos)
  1000. {
  1001. struct mod_sym *p = kmalloc(sizeof(*p), GFP_KERNEL);
  1002. struct module *v;
  1003. loff_t n = *pos;
  1004. if (!p)
  1005. return ERR_PTR(-ENOMEM);
  1006. lock_kernel();
  1007. for (v = module_list, n = *pos; v; n -= v->nsyms, v = v->next) {
  1008. if (n < v->nsyms) {
  1009. p->mod = v;
  1010. p->index = n;
  1011. return p;
  1012. }
  1013. }
  1014. unlock_kernel();
  1015. kfree(p);
  1016. return NULL;
  1017. }
  1018. static void *s_next(struct seq_file *m, void *p, loff_t *pos)
  1019. {
  1020. struct mod_sym *v = p;
  1021. (*pos)++;
  1022. if (++v->index >= v->mod->nsyms) {
  1023. do {
  1024. v->mod = v->mod->next;
  1025. if (!v->mod) {
  1026. unlock_kernel();
  1027. kfree(p);
  1028. return NULL;
  1029. }
  1030. } while (!v->mod->nsyms);
  1031. v->index = 0;
  1032. }
  1033. return p;
  1034. }
  1035. static void s_stop(struct seq_file *m, void *p)
  1036. {
  1037. if (p && !IS_ERR(p)) {
  1038. unlock_kernel();
  1039. kfree(p);
  1040. }
  1041. }
  1042. static int s_show(struct seq_file *m, void *p)
  1043. {
  1044. struct mod_sym *v = p;
  1045. struct module_symbol *sym;
  1046. if (!MOD_CAN_QUERY(v->mod))
  1047. return 0;
  1048. sym = &v->mod->syms[v->index];
  1049. if (*v->mod->name)
  1050. seq_printf(m, "%0*lx %st[%s]n", (int)(2*sizeof(void*)),
  1051.        sym->value, sym->name, v->mod->name);
  1052. else
  1053. seq_printf(m, "%0*lx %sn", (int)(2*sizeof(void*)),
  1054.        sym->value, sym->name);
  1055. return 0;
  1056. }
  1057. struct seq_operations ksyms_op = {
  1058. start: s_start,
  1059. next: s_next,
  1060. stop: s_stop,
  1061. show: s_show
  1062. };
  1063. #else /* CONFIG_MODULES */
  1064. /* Dummy syscalls for people who don't want modules */
  1065. asmlinkage unsigned long
  1066. sys_create_module(const char *name_user, size_t size)
  1067. {
  1068. return -ENOSYS;
  1069. }
  1070. asmlinkage long
  1071. sys_init_module(const char *name_user, struct module *mod_user)
  1072. {
  1073. return -ENOSYS;
  1074. }
  1075. asmlinkage long
  1076. sys_delete_module(const char *name_user)
  1077. {
  1078. return -ENOSYS;
  1079. }
  1080. asmlinkage long
  1081. sys_query_module(const char *name_user, int which, char *buf, size_t bufsize,
  1082.  size_t *ret)
  1083. {
  1084. /* Let the program know about the new interface.  Not that
  1085.    it'll do them much good.  */
  1086. if (which == 0)
  1087. return 0;
  1088. return -ENOSYS;
  1089. }
  1090. asmlinkage long
  1091. sys_get_kernel_syms(struct kernel_sym *table)
  1092. {
  1093. return -ENOSYS;
  1094. }
  1095. int try_inc_mod_count(struct module *mod)
  1096. {
  1097. return 1;
  1098. }
  1099. #endif /* CONFIG_MODULES */