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

Linux/Unix编程

开发平台:

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