exec.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:22k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/fs/exec.c
  3.  *
  4.  *  Copyright (C) 1991, 1992  Linus Torvalds
  5.  */
  6. /*
  7.  * #!-checking implemented by tytso.
  8.  */
  9. /*
  10.  * Demand-loading implemented 01.12.91 - no need to read anything but
  11.  * the header into memory. The inode of the executable is put into
  12.  * "current->executable", and page faults do the actual loading. Clean.
  13.  *
  14.  * Once more I can proudly say that linux stood up to being changed: it
  15.  * was less than 2 hours work to get demand-loading completely implemented.
  16.  *
  17.  * Demand loading changed July 1993 by Eric Youngdale.   Use mmap instead,
  18.  * current->executable is only used by the procfs.  This allows a dispatch
  19.  * table to check for several different types  of binary formats.  We keep
  20.  * trying until we recognize the file or we run out of supported binary
  21.  * formats. 
  22.  */
  23. #include <linux/config.h>
  24. #include <linux/slab.h>
  25. #include <linux/file.h>
  26. #include <linux/mman.h>
  27. #include <linux/a.out.h>
  28. #include <linux/stat.h>
  29. #include <linux/fcntl.h>
  30. #include <linux/smp_lock.h>
  31. #include <linux/init.h>
  32. #include <linux/pagemap.h>
  33. #include <linux/highmem.h>
  34. #include <linux/spinlock.h>
  35. #include <linux/personality.h>
  36. #define __NO_VERSION__
  37. #include <linux/module.h>
  38. #include <asm/uaccess.h>
  39. #include <asm/pgalloc.h>
  40. #include <asm/mmu_context.h>
  41. #ifdef CONFIG_KMOD
  42. #include <linux/kmod.h>
  43. #endif
  44. int core_uses_pid;
  45. static struct linux_binfmt *formats;
  46. static rwlock_t binfmt_lock = RW_LOCK_UNLOCKED;
  47. int register_binfmt(struct linux_binfmt * fmt)
  48. {
  49. struct linux_binfmt ** tmp = &formats;
  50. if (!fmt)
  51. return -EINVAL;
  52. if (fmt->next)
  53. return -EBUSY;
  54. write_lock(&binfmt_lock);
  55. while (*tmp) {
  56. if (fmt == *tmp) {
  57. write_unlock(&binfmt_lock);
  58. return -EBUSY;
  59. }
  60. tmp = &(*tmp)->next;
  61. }
  62. fmt->next = formats;
  63. formats = fmt;
  64. write_unlock(&binfmt_lock);
  65. return 0;
  66. }
  67. int unregister_binfmt(struct linux_binfmt * fmt)
  68. {
  69. struct linux_binfmt ** tmp = &formats;
  70. write_lock(&binfmt_lock);
  71. while (*tmp) {
  72. if (fmt == *tmp) {
  73. *tmp = fmt->next;
  74. write_unlock(&binfmt_lock);
  75. return 0;
  76. }
  77. tmp = &(*tmp)->next;
  78. }
  79. write_unlock(&binfmt_lock);
  80. return -EINVAL;
  81. }
  82. static inline void put_binfmt(struct linux_binfmt * fmt)
  83. {
  84. if (fmt->module)
  85. __MOD_DEC_USE_COUNT(fmt->module);
  86. }
  87. /*
  88.  * Note that a shared library must be both readable and executable due to
  89.  * security reasons.
  90.  *
  91.  * Also note that we take the address to load from from the file itself.
  92.  */
  93. asmlinkage long sys_uselib(const char * library)
  94. {
  95. struct file * file;
  96. struct nameidata nd;
  97. int error;
  98. error = user_path_walk(library, &nd);
  99. if (error)
  100. goto out;
  101. error = -EINVAL;
  102. if (!S_ISREG(nd.dentry->d_inode->i_mode))
  103. goto exit;
  104. error = permission(nd.dentry->d_inode, MAY_READ | MAY_EXEC);
  105. if (error)
  106. goto exit;
  107. file = dentry_open(nd.dentry, nd.mnt, O_RDONLY);
  108. error = PTR_ERR(file);
  109. if (IS_ERR(file))
  110. goto out;
  111. error = -ENOEXEC;
  112. if(file->f_op && file->f_op->read) {
  113. struct linux_binfmt * fmt;
  114. read_lock(&binfmt_lock);
  115. for (fmt = formats ; fmt ; fmt = fmt->next) {
  116. if (!fmt->load_shlib)
  117. continue;
  118. if (!try_inc_mod_count(fmt->module))
  119. continue;
  120. read_unlock(&binfmt_lock);
  121. error = fmt->load_shlib(file);
  122. read_lock(&binfmt_lock);
  123. put_binfmt(fmt);
  124. if (error != -ENOEXEC)
  125. break;
  126. }
  127. read_unlock(&binfmt_lock);
  128. }
  129. fput(file);
  130. out:
  131.    return error;
  132. exit:
  133. path_release(&nd);
  134. goto out;
  135. }
  136. /*
  137.  * count() counts the number of arguments/envelopes
  138.  */
  139. static int count(char ** argv, int max)
  140. {
  141. int i = 0;
  142. if (argv != NULL) {
  143. for (;;) {
  144. char * p;
  145. if (get_user(p, argv))
  146. return -EFAULT;
  147. if (!p)
  148. break;
  149. argv++;
  150. if(++i > max)
  151. return -E2BIG;
  152. }
  153. }
  154. return i;
  155. }
  156. /*
  157.  * 'copy_strings()' copies argument/envelope strings from user
  158.  * memory to free pages in kernel mem. These are in a format ready
  159.  * to be put directly into the top of new user memory.
  160.  */
  161. int copy_strings(int argc,char ** argv, struct linux_binprm *bprm) 
  162. {
  163. while (argc-- > 0) {
  164. char *str;
  165. int len;
  166. unsigned long pos;
  167. if (get_user(str, argv+argc) || !(len = strnlen_user(str, bprm->p)))
  168. return -EFAULT;
  169. if (bprm->p < len) 
  170. return -E2BIG; 
  171. bprm->p -= len;
  172. /* XXX: add architecture specific overflow check here. */ 
  173. pos = bprm->p;
  174. while (len > 0) {
  175. char *kaddr;
  176. int i, new, err;
  177. struct page *page;
  178. int offset, bytes_to_copy;
  179. offset = pos % PAGE_SIZE;
  180. i = pos/PAGE_SIZE;
  181. page = bprm->page[i];
  182. new = 0;
  183. if (!page) {
  184. page = alloc_page(GFP_HIGHUSER);
  185. bprm->page[i] = page;
  186. if (!page)
  187. return -ENOMEM;
  188. new = 1;
  189. }
  190. kaddr = kmap(page);
  191. if (new && offset)
  192. memset(kaddr, 0, offset);
  193. bytes_to_copy = PAGE_SIZE - offset;
  194. if (bytes_to_copy > len) {
  195. bytes_to_copy = len;
  196. if (new)
  197. memset(kaddr+offset+len, 0, PAGE_SIZE-offset-len);
  198. }
  199. err = copy_from_user(kaddr + offset, str, bytes_to_copy);
  200. kunmap(page);
  201. if (err)
  202. return -EFAULT; 
  203. pos += bytes_to_copy;
  204. str += bytes_to_copy;
  205. len -= bytes_to_copy;
  206. }
  207. }
  208. return 0;
  209. }
  210. /*
  211.  * Like copy_strings, but get argv and its values from kernel memory.
  212.  */
  213. int copy_strings_kernel(int argc,char ** argv, struct linux_binprm *bprm)
  214. {
  215. int r;
  216. mm_segment_t oldfs = get_fs();
  217. set_fs(KERNEL_DS); 
  218. r = copy_strings(argc, argv, bprm);
  219. set_fs(oldfs);
  220. return r; 
  221. }
  222. /*
  223.  * This routine is used to map in a page into an address space: needed by
  224.  * execve() for the initial stack and environment pages.
  225.  *
  226.  * tsk->mmap_sem is held for writing.
  227.  */
  228. void put_dirty_page(struct task_struct * tsk, struct page *page, unsigned long address)
  229. {
  230. pgd_t * pgd;
  231. pmd_t * pmd;
  232. pte_t * pte;
  233. if (page_count(page) != 1)
  234. printk(KERN_ERR "mem_map disagrees with %p at %08lxn", page, address);
  235. pgd = pgd_offset(tsk->mm, address);
  236. spin_lock(&tsk->mm->page_table_lock);
  237. pmd = pmd_alloc(tsk->mm, pgd, address);
  238. if (!pmd)
  239. goto out;
  240. pte = pte_alloc(tsk->mm, pmd, address);
  241. if (!pte)
  242. goto out;
  243. if (!pte_none(*pte))
  244. goto out;
  245. lru_cache_add(page);
  246. flush_dcache_page(page);
  247. flush_page_to_ram(page);
  248. set_pte(pte, pte_mkdirty(pte_mkwrite(mk_pte(page, PAGE_COPY))));
  249. tsk->mm->rss++;
  250. spin_unlock(&tsk->mm->page_table_lock);
  251. /* no need for flush_tlb */
  252. memc_update_addr(tsk->mm, *pte, address);
  253. return;
  254. out:
  255. spin_unlock(&tsk->mm->page_table_lock);
  256. __free_page(page);
  257. force_sig(SIGKILL, tsk);
  258. return;
  259. }
  260. int setup_arg_pages(struct linux_binprm *bprm)
  261. {
  262. unsigned long stack_base;
  263. struct vm_area_struct *mpnt;
  264. int i;
  265. stack_base = STACK_TOP - MAX_ARG_PAGES*PAGE_SIZE;
  266. bprm->p += stack_base;
  267. if (bprm->loader)
  268. bprm->loader += stack_base;
  269. bprm->exec += stack_base;
  270. mpnt = kmem_cache_alloc(vm_area_cachep, SLAB_KERNEL);
  271. if (!mpnt) 
  272. return -ENOMEM; 
  273. down_write(&current->mm->mmap_sem);
  274. {
  275. mpnt->vm_mm = current->mm;
  276. mpnt->vm_start = PAGE_MASK & (unsigned long) bprm->p;
  277. mpnt->vm_end = STACK_TOP;
  278. mpnt->vm_page_prot = PAGE_COPY;
  279. mpnt->vm_flags = VM_STACK_FLAGS;
  280. mpnt->vm_ops = NULL;
  281. mpnt->vm_pgoff = 0;
  282. mpnt->vm_file = NULL;
  283. mpnt->vm_private_data = (void *) 0;
  284. insert_vm_struct(current->mm, mpnt);
  285. current->mm->total_vm = (mpnt->vm_end - mpnt->vm_start) >> PAGE_SHIFT;
  286. for (i = 0 ; i < MAX_ARG_PAGES ; i++) {
  287. struct page *page = bprm->page[i];
  288. if (page) {
  289. bprm->page[i] = NULL;
  290. put_dirty_page(current,page,stack_base);
  291. }
  292. stack_base += PAGE_SIZE;
  293. }
  294. up_write(&current->mm->mmap_sem);
  295. return 0;
  296. }
  297. struct file *open_exec(const char *name)
  298. {
  299. struct nameidata nd;
  300. struct inode *inode;
  301. struct file *file;
  302. int err = 0;
  303. if (path_init(name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, &nd))
  304. err = path_walk(name, &nd);
  305. file = ERR_PTR(err);
  306. if (!err) {
  307. inode = nd.dentry->d_inode;
  308. file = ERR_PTR(-EACCES);
  309. if (!(nd.mnt->mnt_flags & MNT_NOEXEC) &&
  310.     S_ISREG(inode->i_mode)) {
  311. int err = permission(inode, MAY_EXEC);
  312. if (!err && !(inode->i_mode & 0111))
  313. err = -EACCES;
  314. file = ERR_PTR(err);
  315. if (!err) {
  316. file = dentry_open(nd.dentry, nd.mnt, O_RDONLY);
  317. if (!IS_ERR(file)) {
  318. err = deny_write_access(file);
  319. if (err) {
  320. fput(file);
  321. file = ERR_PTR(err);
  322. }
  323. }
  324. out:
  325. return file;
  326. }
  327. }
  328. path_release(&nd);
  329. }
  330. goto out;
  331. }
  332. int kernel_read(struct file *file, unsigned long offset,
  333. char * addr, unsigned long count)
  334. {
  335. mm_segment_t old_fs;
  336. loff_t pos = offset;
  337. int result = -ENOSYS;
  338. if (!file->f_op->read)
  339. goto fail;
  340. old_fs = get_fs();
  341. set_fs(get_ds());
  342. result = file->f_op->read(file, addr, count, &pos);
  343. set_fs(old_fs);
  344. fail:
  345. return result;
  346. }
  347. static int exec_mmap(void)
  348. {
  349. struct mm_struct * mm, * old_mm;
  350. old_mm = current->mm;
  351. if (old_mm && atomic_read(&old_mm->mm_users) == 1) {
  352. mm_release();
  353. exit_mmap(old_mm);
  354. return 0;
  355. }
  356. mm = mm_alloc();
  357. if (mm) {
  358. struct mm_struct *active_mm;
  359. if (init_new_context(current, mm)) {
  360. mmdrop(mm);
  361. return -ENOMEM;
  362. }
  363. /* Add it to the list of mm's */
  364. spin_lock(&mmlist_lock);
  365. list_add(&mm->mmlist, &init_mm.mmlist);
  366. mmlist_nr++;
  367. spin_unlock(&mmlist_lock);
  368. task_lock(current);
  369. active_mm = current->active_mm;
  370. current->mm = mm;
  371. current->active_mm = mm;
  372. task_unlock(current);
  373. activate_mm(active_mm, mm);
  374. mm_release();
  375. if (old_mm) {
  376. if (active_mm != old_mm) BUG();
  377. mmput(old_mm);
  378. return 0;
  379. }
  380. mmdrop(active_mm);
  381. return 0;
  382. }
  383. return -ENOMEM;
  384. }
  385. /*
  386.  * This function makes sure the current process has its own signal table,
  387.  * so that flush_signal_handlers can later reset the handlers without
  388.  * disturbing other processes.  (Other processes might share the signal
  389.  * table via the CLONE_SIGNAL option to clone().)
  390.  */
  391.  
  392. static inline int make_private_signals(void)
  393. {
  394. struct signal_struct * newsig;
  395. if (atomic_read(&current->sig->count) <= 1)
  396. return 0;
  397. newsig = kmem_cache_alloc(sigact_cachep, GFP_KERNEL);
  398. if (newsig == NULL)
  399. return -ENOMEM;
  400. spin_lock_init(&newsig->siglock);
  401. atomic_set(&newsig->count, 1);
  402. memcpy(newsig->action, current->sig->action, sizeof(newsig->action));
  403. spin_lock_irq(&current->sigmask_lock);
  404. current->sig = newsig;
  405. spin_unlock_irq(&current->sigmask_lock);
  406. return 0;
  407. }
  408. /*
  409.  * If make_private_signals() made a copy of the signal table, decrement the
  410.  * refcount of the original table, and free it if necessary.
  411.  * We don't do that in make_private_signals() so that we can back off
  412.  * in flush_old_exec() if an error occurs after calling make_private_signals().
  413.  */
  414. static inline void release_old_signals(struct signal_struct * oldsig)
  415. {
  416. if (current->sig == oldsig)
  417. return;
  418. if (atomic_dec_and_test(&oldsig->count))
  419. kmem_cache_free(sigact_cachep, oldsig);
  420. }
  421. /*
  422.  * These functions flushes out all traces of the currently running executable
  423.  * so that a new one can be started
  424.  */
  425. static inline void flush_old_files(struct files_struct * files)
  426. {
  427. long j = -1;
  428. write_lock(&files->file_lock);
  429. for (;;) {
  430. unsigned long set, i;
  431. j++;
  432. i = j * __NFDBITS;
  433. if (i >= files->max_fds || i >= files->max_fdset)
  434. break;
  435. set = files->close_on_exec->fds_bits[j];
  436. if (!set)
  437. continue;
  438. files->close_on_exec->fds_bits[j] = 0;
  439. write_unlock(&files->file_lock);
  440. for ( ; set ; i++,set >>= 1) {
  441. if (set & 1) {
  442. sys_close(i);
  443. }
  444. }
  445. write_lock(&files->file_lock);
  446. }
  447. write_unlock(&files->file_lock);
  448. }
  449. /*
  450.  * An execve() will automatically "de-thread" the process.
  451.  * Note: we don't have to hold the tasklist_lock to test
  452.  * whether we migth need to do this. If we're not part of
  453.  * a thread group, there is no way we can become one
  454.  * dynamically. And if we are, we only need to protect the
  455.  * unlink - even if we race with the last other thread exit,
  456.  * at worst the list_del_init() might end up being a no-op.
  457.  */
  458. static inline void de_thread(struct task_struct *tsk)
  459. {
  460. if (!list_empty(&tsk->thread_group)) {
  461. write_lock_irq(&tasklist_lock);
  462. list_del_init(&tsk->thread_group);
  463. write_unlock_irq(&tasklist_lock);
  464. }
  465. /* Minor oddity: this might stay the same. */
  466. tsk->tgid = tsk->pid;
  467. }
  468. int flush_old_exec(struct linux_binprm * bprm)
  469. {
  470. char * name;
  471. int i, ch, retval;
  472. struct signal_struct * oldsig;
  473. /*
  474.  * Make sure we have a private signal table
  475.  */
  476. oldsig = current->sig;
  477. retval = make_private_signals();
  478. if (retval) goto flush_failed;
  479. /* 
  480.  * Release all of the old mmap stuff
  481.  */
  482. retval = exec_mmap();
  483. if (retval) goto mmap_failed;
  484. /* This is the point of no return */
  485. release_old_signals(oldsig);
  486. current->sas_ss_sp = current->sas_ss_size = 0;
  487. if (current->euid == current->uid && current->egid == current->gid)
  488. current->mm->dumpable = 1;
  489. name = bprm->filename;
  490. for (i=0; (ch = *(name++)) != '';) {
  491. if (ch == '/')
  492. i = 0;
  493. else
  494. if (i < 15)
  495. current->comm[i++] = ch;
  496. }
  497. current->comm[i] = '';
  498. flush_thread();
  499. de_thread(current);
  500. if (bprm->e_uid != current->euid || bprm->e_gid != current->egid || 
  501.     permission(bprm->file->f_dentry->d_inode,MAY_READ))
  502. current->mm->dumpable = 0;
  503. /* An exec changes our domain. We are no longer part of the thread
  504.    group */
  505.    
  506. current->self_exec_id++;
  507. flush_signal_handlers(current);
  508. flush_old_files(current->files);
  509. return 0;
  510. mmap_failed:
  511. flush_failed:
  512. spin_lock_irq(&current->sigmask_lock);
  513. if (current->sig != oldsig) {
  514. kmem_cache_free(sigact_cachep, current->sig);
  515. current->sig = oldsig;
  516. }
  517. spin_unlock_irq(&current->sigmask_lock);
  518. return retval;
  519. }
  520. /*
  521.  * We mustn't allow tracing of suid binaries, unless
  522.  * the tracer has the capability to trace anything..
  523.  */
  524. static inline int must_not_trace_exec(struct task_struct * p)
  525. {
  526. return (p->ptrace & PT_PTRACED) && !(p->ptrace & PT_PTRACE_CAP);
  527. }
  528. /* 
  529.  * Fill the binprm structure from the inode. 
  530.  * Check permissions, then read the first 128 (BINPRM_BUF_SIZE) bytes
  531.  */
  532. int prepare_binprm(struct linux_binprm *bprm)
  533. {
  534. int mode;
  535. struct inode * inode = bprm->file->f_dentry->d_inode;
  536. mode = inode->i_mode;
  537. /*
  538.  * Check execute perms again - if the caller has CAP_DAC_OVERRIDE,
  539.  * vfs_permission lets a non-executable through
  540.  */
  541. if (!(mode & 0111)) /* with at least _one_ execute bit set */
  542. return -EACCES;
  543. if (bprm->file->f_op == NULL)
  544. return -EACCES;
  545. bprm->e_uid = current->euid;
  546. bprm->e_gid = current->egid;
  547. if(!(bprm->file->f_vfsmnt->mnt_flags & MNT_NOSUID)) {
  548. /* Set-uid? */
  549. if (mode & S_ISUID)
  550. bprm->e_uid = inode->i_uid;
  551. /* Set-gid? */
  552. /*
  553.  * If setgid is set but no group execute bit then this
  554.  * is a candidate for mandatory locking, not a setgid
  555.  * executable.
  556.  */
  557. if ((mode & (S_ISGID | S_IXGRP)) == (S_ISGID | S_IXGRP))
  558. bprm->e_gid = inode->i_gid;
  559. }
  560. /* We don't have VFS support for capabilities yet */
  561. cap_clear(bprm->cap_inheritable);
  562. cap_clear(bprm->cap_permitted);
  563. cap_clear(bprm->cap_effective);
  564. /*  To support inheritance of root-permissions and suid-root
  565.          *  executables under compatibility mode, we raise all three
  566.          *  capability sets for the file.
  567.          *
  568.          *  If only the real uid is 0, we only raise the inheritable
  569.          *  and permitted sets of the executable file.
  570.          */
  571. if (!issecure(SECURE_NOROOT)) {
  572. if (bprm->e_uid == 0 || current->uid == 0) {
  573. cap_set_full(bprm->cap_inheritable);
  574. cap_set_full(bprm->cap_permitted);
  575. }
  576. if (bprm->e_uid == 0) 
  577. cap_set_full(bprm->cap_effective);
  578. }
  579. memset(bprm->buf,0,BINPRM_BUF_SIZE);
  580. return kernel_read(bprm->file,0,bprm->buf,BINPRM_BUF_SIZE);
  581. }
  582. /*
  583.  * This function is used to produce the new IDs and capabilities
  584.  * from the old ones and the file's capabilities.
  585.  *
  586.  * The formula used for evolving capabilities is:
  587.  *
  588.  *       pI' = pI
  589.  * (***) pP' = (fP & X) | (fI & pI)
  590.  *       pE' = pP' & fE          [NB. fE is 0 or ~0]
  591.  *
  592.  * I=Inheritable, P=Permitted, E=Effective // p=process, f=file
  593.  * ' indicates post-exec(), and X is the global 'cap_bset'.
  594.  *
  595.  */
  596. void compute_creds(struct linux_binprm *bprm) 
  597. {
  598. kernel_cap_t new_permitted, working;
  599. int do_unlock = 0;
  600. new_permitted = cap_intersect(bprm->cap_permitted, cap_bset);
  601. working = cap_intersect(bprm->cap_inheritable,
  602. current->cap_inheritable);
  603. new_permitted = cap_combine(new_permitted, working);
  604. if (bprm->e_uid != current->uid || bprm->e_gid != current->gid ||
  605.     !cap_issubset(new_permitted, current->cap_permitted)) {
  606.                 current->mm->dumpable = 0;
  607. lock_kernel();
  608. if (must_not_trace_exec(current)
  609.     || atomic_read(&current->fs->count) > 1
  610.     || atomic_read(&current->files->count) > 1
  611.     || atomic_read(&current->sig->count) > 1) {
  612. if(!capable(CAP_SETUID)) {
  613. bprm->e_uid = current->uid;
  614. bprm->e_gid = current->gid;
  615. }
  616. if(!capable(CAP_SETPCAP)) {
  617. new_permitted = cap_intersect(new_permitted,
  618. current->cap_permitted);
  619. }
  620. }
  621. do_unlock = 1;
  622. }
  623. /* For init, we want to retain the capabilities set
  624.          * in the init_task struct. Thus we skip the usual
  625.          * capability rules */
  626. if (current->pid != 1) {
  627. current->cap_permitted = new_permitted;
  628. current->cap_effective =
  629. cap_intersect(new_permitted, bprm->cap_effective);
  630. }
  631.         /* AUD: Audit candidate if current->cap_effective is set */
  632.         current->suid = current->euid = current->fsuid = bprm->e_uid;
  633.         current->sgid = current->egid = current->fsgid = bprm->e_gid;
  634. if(do_unlock)
  635. unlock_kernel();
  636. current->keep_capabilities = 0;
  637. }
  638. void remove_arg_zero(struct linux_binprm *bprm)
  639. {
  640. if (bprm->argc) {
  641. unsigned long offset;
  642. char * kaddr;
  643. struct page *page;
  644. offset = bprm->p % PAGE_SIZE;
  645. goto inside;
  646. while (bprm->p++, *(kaddr+offset++)) {
  647. if (offset != PAGE_SIZE)
  648. continue;
  649. offset = 0;
  650. kunmap(page);
  651. inside:
  652. page = bprm->page[bprm->p/PAGE_SIZE];
  653. kaddr = kmap(page);
  654. }
  655. kunmap(page);
  656. bprm->argc--;
  657. }
  658. }
  659. /*
  660.  * cycle the list of binary formats handler, until one recognizes the image
  661.  */
  662. int search_binary_handler(struct linux_binprm *bprm,struct pt_regs *regs)
  663. {
  664. int try,retval=0;
  665. struct linux_binfmt *fmt;
  666. #ifdef __alpha__
  667. /* handle /sbin/loader.. */
  668. {
  669.     struct exec * eh = (struct exec *) bprm->buf;
  670.     if (!bprm->loader && eh->fh.f_magic == 0x183 &&
  671. (eh->fh.f_flags & 0x3000) == 0x3000)
  672.     {
  673. struct file * file;
  674. unsigned long loader;
  675. allow_write_access(bprm->file);
  676. fput(bprm->file);
  677. bprm->file = NULL;
  678.         loader = PAGE_SIZE*MAX_ARG_PAGES-sizeof(void *);
  679. file = open_exec("/sbin/loader");
  680. retval = PTR_ERR(file);
  681. if (IS_ERR(file))
  682. return retval;
  683. /* Remember if the application is TASO.  */
  684. bprm->sh_bang = eh->ah.entry < 0x100000000;
  685. bprm->file = file;
  686. bprm->loader = loader;
  687. retval = prepare_binprm(bprm);
  688. if (retval<0)
  689. return retval;
  690. /* should call search_binary_handler recursively here,
  691.    but it does not matter */
  692.     }
  693. }
  694. #endif
  695. /* kernel module loader fixup */
  696. /* so we don't try to load run modprobe in kernel space. */
  697. set_fs(USER_DS);
  698. for (try=0; try<2; try++) {
  699. read_lock(&binfmt_lock);
  700. for (fmt = formats ; fmt ; fmt = fmt->next) {
  701. int (*fn)(struct linux_binprm *, struct pt_regs *) = fmt->load_binary;
  702. if (!fn)
  703. continue;
  704. if (!try_inc_mod_count(fmt->module))
  705. continue;
  706. read_unlock(&binfmt_lock);
  707. retval = fn(bprm, regs);
  708. if (retval >= 0) {
  709. put_binfmt(fmt);
  710. allow_write_access(bprm->file);
  711. if (bprm->file)
  712. fput(bprm->file);
  713. bprm->file = NULL;
  714. current->did_exec = 1;
  715. return retval;
  716. }
  717. read_lock(&binfmt_lock);
  718. put_binfmt(fmt);
  719. if (retval != -ENOEXEC)
  720. break;
  721. if (!bprm->file) {
  722. read_unlock(&binfmt_lock);
  723. return retval;
  724. }
  725. }
  726. read_unlock(&binfmt_lock);
  727. if (retval != -ENOEXEC) {
  728. break;
  729. #ifdef CONFIG_KMOD
  730. }else{
  731. #define printable(c) (((c)=='t') || ((c)=='n') || (0x20<=(c) && (c)<=0x7e))
  732. char modname[20];
  733. if (printable(bprm->buf[0]) &&
  734.     printable(bprm->buf[1]) &&
  735.     printable(bprm->buf[2]) &&
  736.     printable(bprm->buf[3]))
  737. break; /* -ENOEXEC */
  738. sprintf(modname, "binfmt-%04x", *(unsigned short *)(&bprm->buf[2]));
  739. request_module(modname);
  740. #endif
  741. }
  742. }
  743. return retval;
  744. }
  745. /*
  746.  * sys_execve() executes a new program.
  747.  */
  748. int do_execve(char * filename, char ** argv, char ** envp, struct pt_regs * regs)
  749. {
  750. struct linux_binprm bprm;
  751. struct file *file;
  752. int retval;
  753. int i;
  754. file = open_exec(filename);
  755. retval = PTR_ERR(file);
  756. if (IS_ERR(file))
  757. return retval;
  758. bprm.p = PAGE_SIZE*MAX_ARG_PAGES-sizeof(void *);
  759. memset(bprm.page, 0, MAX_ARG_PAGES*sizeof(bprm.page[0])); 
  760. bprm.file = file;
  761. bprm.filename = filename;
  762. bprm.sh_bang = 0;
  763. bprm.loader = 0;
  764. bprm.exec = 0;
  765. if ((bprm.argc = count(argv, bprm.p / sizeof(void *))) < 0) {
  766. allow_write_access(file);
  767. fput(file);
  768. return bprm.argc;
  769. }
  770. if ((bprm.envc = count(envp, bprm.p / sizeof(void *))) < 0) {
  771. allow_write_access(file);
  772. fput(file);
  773. return bprm.envc;
  774. }
  775. retval = prepare_binprm(&bprm);
  776. if (retval < 0) 
  777. goto out; 
  778. retval = copy_strings_kernel(1, &bprm.filename, &bprm);
  779. if (retval < 0) 
  780. goto out; 
  781. bprm.exec = bprm.p;
  782. retval = copy_strings(bprm.envc, envp, &bprm);
  783. if (retval < 0) 
  784. goto out; 
  785. retval = copy_strings(bprm.argc, argv, &bprm);
  786. if (retval < 0) 
  787. goto out; 
  788. retval = search_binary_handler(&bprm,regs);
  789. if (retval >= 0)
  790. /* execve success */
  791. return retval;
  792. out:
  793. /* Something went wrong, return the inode and free the argument pages*/
  794. allow_write_access(bprm.file);
  795. if (bprm.file)
  796. fput(bprm.file);
  797. for (i = 0 ; i < MAX_ARG_PAGES ; i++) {
  798. struct page * page = bprm.page[i];
  799. if (page)
  800. __free_page(page);
  801. }
  802. return retval;
  803. }
  804. void set_binfmt(struct linux_binfmt *new)
  805. {
  806. struct linux_binfmt *old = current->binfmt;
  807. if (new && new->module)
  808. __MOD_INC_USE_COUNT(new->module);
  809. current->binfmt = new;
  810. if (old && old->module)
  811. __MOD_DEC_USE_COUNT(old->module);
  812. }
  813. int do_coredump(long signr, struct pt_regs * regs)
  814. {
  815. struct linux_binfmt * binfmt;
  816. char corename[6+sizeof(current->comm)+10];
  817. struct file * file;
  818. struct inode * inode;
  819. int retval = 0;
  820. lock_kernel();
  821. binfmt = current->binfmt;
  822. if (!binfmt || !binfmt->core_dump)
  823. goto fail;
  824. if (!current->mm->dumpable)
  825. goto fail;
  826. current->mm->dumpable = 0;
  827. if (current->rlim[RLIMIT_CORE].rlim_cur < binfmt->min_coredump)
  828. goto fail;
  829. memcpy(corename,"core.", 5);
  830. corename[4] = '';
  831.   if (core_uses_pid || atomic_read(&current->mm->mm_users) != 1)
  832.   sprintf(&corename[4], ".%d", current->pid);
  833. file = filp_open(corename, O_CREAT | 2 | O_NOFOLLOW, 0600);
  834. if (IS_ERR(file))
  835. goto fail;
  836. inode = file->f_dentry->d_inode;
  837. if (inode->i_nlink > 1)
  838. goto close_fail; /* multiple links - don't dump */
  839. if (d_unhashed(file->f_dentry))
  840. goto close_fail;
  841. if (!S_ISREG(inode->i_mode))
  842. goto close_fail;
  843. if (!file->f_op)
  844. goto close_fail;
  845. if (!file->f_op->write)
  846. goto close_fail;
  847. if (do_truncate(file->f_dentry, 0) != 0)
  848. goto close_fail;
  849. retval = binfmt->core_dump(signr, regs, file);
  850. close_fail:
  851. filp_close(file, NULL);
  852. fail:
  853. unlock_kernel();
  854. return retval;
  855. }