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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * Conversion between 32-bit and 64-bit native system calls.
  3.  *
  4.  * Copyright (C) 2000 Silicon Graphics, Inc.
  5.  * Written by Ulf Carlsson (ulfc@engr.sgi.com)
  6.  * sys32_execve from ia64/ia32 code, Feb 2000, Kanoj Sarcar (kanoj@sgi.com)
  7.  */
  8. #include <linux/config.h>
  9. #include <linux/mm.h>
  10. #include <linux/errno.h>
  11. #include <linux/file.h>
  12. #include <linux/smp_lock.h>
  13. #include <linux/highuid.h>
  14. #include <linux/dirent.h>
  15. #include <linux/resource.h>
  16. #include <linux/filter.h>
  17. #include <linux/highmem.h>
  18. #include <linux/time.h>
  19. #include <linux/poll.h>
  20. #include <linux/slab.h>
  21. #include <linux/skbuff.h>
  22. #include <linux/filter.h>
  23. #include <linux/shm.h>
  24. #include <linux/sem.h>
  25. #include <linux/msg.h>
  26. #include <linux/icmpv6.h>
  27. #include <linux/sysctl.h>
  28. #include <linux/utime.h>
  29. #include <linux/utsname.h>
  30. #include <linux/personality.h>
  31. #include <linux/timex.h>
  32. #include <linux/dnotify.h>
  33. #include <linux/module.h>
  34. #include <net/sock.h>
  35. #include <asm/uaccess.h>
  36. #include <asm/mman.h>
  37. #include <asm/ipc.h>
  38. /* Use this to get at 32-bit user passed pointers. */
  39. /* A() macro should be used for places where you e.g.
  40.    have some internal variable u32 and just want to get
  41.    rid of a compiler warning. AA() has to be used in
  42.    places where you want to convert a function argument
  43.    to 32bit pointer or when you e.g. access pt_regs
  44.    structure and want to consider 32bit registers only.
  45.  */
  46. #define A(__x) ((unsigned long)(__x))
  47. #define AA(__x) ((unsigned long)((int)__x))
  48. #ifdef __MIPSEB__
  49. #define merge_64(r1,r2) ((((r1) & 0xffffffffUL) << 32) + ((r2) & 0xffffffffUL))
  50. #endif
  51. #ifdef __MIPSEL__
  52. #define merge_64(r1,r2) ((((r2) & 0xffffffffUL) << 32) + ((r1) & 0xffffffffUL))
  53. #endif
  54. /*
  55.  * Revalidate the inode. This is required for proper NFS attribute caching.
  56.  */
  57. static __inline__ int
  58. do_revalidate(struct dentry *dentry)
  59. {
  60. struct inode * inode = dentry->d_inode;
  61. if (inode->i_op && inode->i_op->revalidate)
  62. return inode->i_op->revalidate(dentry);
  63. return 0;
  64. }
  65. static int cp_new_stat32(struct inode * inode, struct stat32 * statbuf)
  66. {
  67. struct stat32 tmp;
  68. unsigned int blocks, indirect;
  69. memset(&tmp, 0, sizeof(tmp));
  70. tmp.st_dev = kdev_t_to_nr(inode->i_dev);
  71. tmp.st_ino = inode->i_ino;
  72. tmp.st_mode = inode->i_mode;
  73. tmp.st_nlink = inode->i_nlink;
  74. SET_STAT_UID(tmp, inode->i_uid);
  75. SET_STAT_GID(tmp, inode->i_gid);
  76. tmp.st_rdev = kdev_t_to_nr(inode->i_rdev);
  77. tmp.st_size = inode->i_size;
  78. tmp.st_atime = inode->i_atime;
  79. tmp.st_mtime = inode->i_mtime;
  80. tmp.st_ctime = inode->i_ctime;
  81. /*
  82.  * st_blocks and st_blksize are approximated with a simple algorithm if
  83.  * they aren't supported directly by the filesystem. The minix and msdos
  84.  * filesystems don't keep track of blocks, so they would either have to
  85.  * be counted explicitly (by delving into the file itself), or by using
  86.  * this simple algorithm to get a reasonable (although not 100%
  87.  * accurate) value.
  88.  */
  89. /*
  90.  * Use minix fs values for the number of direct and indirect blocks.
  91.  * The count is now exact for the minix fs except that it counts zero
  92.  * blocks.  Everything is in units of BLOCK_SIZE until the assignment
  93.  * to tmp.st_blksize.
  94.  */
  95. #define D_B   7
  96. #define I_B   (BLOCK_SIZE / sizeof(unsigned short))
  97. if (!inode->i_blksize) {
  98. blocks = (tmp.st_size + BLOCK_SIZE - 1) / BLOCK_SIZE;
  99. if (blocks > D_B) {
  100. indirect = (blocks - D_B + I_B - 1) / I_B;
  101. blocks += indirect;
  102. if (indirect > 1) {
  103. indirect = (indirect - 1 + I_B - 1) / I_B;
  104. blocks += indirect;
  105. if (indirect > 1)
  106. blocks++;
  107. }
  108. }
  109. tmp.st_blocks = (BLOCK_SIZE / 512) * blocks;
  110. tmp.st_blksize = BLOCK_SIZE;
  111. } else {
  112. tmp.st_blocks = inode->i_blocks;
  113. tmp.st_blksize = inode->i_blksize;
  114. }
  115. return copy_to_user(statbuf,&tmp,sizeof(tmp)) ? -EFAULT : 0;
  116. }
  117. asmlinkage int sys32_newstat(char * filename, struct stat32 *statbuf)
  118. {
  119. struct nameidata nd;
  120. int error;
  121. error = user_path_walk(filename, &nd);
  122. if (!error) {
  123. error = do_revalidate(nd.dentry);
  124. if (!error)
  125. error = cp_new_stat32(nd.dentry->d_inode, statbuf);
  126. path_release(&nd);
  127. }
  128. return error;
  129. }
  130. asmlinkage int sys32_newlstat(char * filename, struct stat32 *statbuf)
  131. {
  132. struct nameidata nd;
  133. int error;
  134. error = user_path_walk_link(filename, &nd);
  135. if (!error) {
  136. error = do_revalidate(nd.dentry);
  137. if (!error)
  138. error = cp_new_stat32(nd.dentry->d_inode, statbuf);
  139. path_release(&nd);
  140. }
  141. return error;
  142. }
  143. asmlinkage long sys32_newfstat(unsigned int fd, struct stat32 * statbuf)
  144. {
  145. struct file * f;
  146. int err = -EBADF;
  147. f = fget(fd);
  148. if (f) {
  149. struct dentry * dentry = f->f_dentry;
  150. err = do_revalidate(dentry);
  151. if (!err)
  152. err = cp_new_stat32(dentry->d_inode, statbuf);
  153. fput(f);
  154. }
  155. return err;
  156. }
  157. asmlinkage int sys_mmap2(void) {return 0;}
  158. asmlinkage long sys_truncate(const char * path, unsigned long length);
  159. asmlinkage int sys_truncate64(const char *path, unsigned int high,
  160.       unsigned int low)
  161. {
  162. if ((int)high < 0)
  163. return -EINVAL;
  164. return sys_truncate(path, ((long) high << 32) | low);
  165. }
  166. asmlinkage long sys_ftruncate(unsigned int fd, unsigned long length);
  167. asmlinkage int sys_ftruncate64(unsigned int fd, unsigned int high,
  168.        unsigned int low)
  169. {
  170. if ((int)high < 0)
  171. return -EINVAL;
  172. return sys_ftruncate(fd, ((long) high << 32) | low);
  173. }
  174. extern asmlinkage int sys_utime(char * filename, struct utimbuf * times);
  175. struct utimbuf32 {
  176. __kernel_time_t32 actime, modtime;
  177. };
  178. asmlinkage int sys32_utime(char * filename, struct utimbuf32 *times)
  179. {
  180. struct utimbuf t;
  181. mm_segment_t old_fs;
  182. int ret;
  183. char *filenam;
  184. if (!times)
  185. return sys_utime(filename, NULL);
  186. if (get_user (t.actime, &times->actime) ||
  187.     __get_user (t.modtime, &times->modtime))
  188. return -EFAULT;
  189. filenam = getname (filename);
  190. ret = PTR_ERR(filenam);
  191. if (!IS_ERR(filenam)) {
  192. old_fs = get_fs();
  193. set_fs (KERNEL_DS);
  194. ret = sys_utime(filenam, &t);
  195. set_fs (old_fs);
  196. putname (filenam);
  197. }
  198. return ret;
  199. }
  200. #if 0
  201. /*
  202.  * count32() counts the number of arguments/envelopes
  203.  */
  204. static int count32(u32 * argv, int max)
  205. {
  206. int i = 0;
  207. if (argv != NULL) {
  208. for (;;) {
  209. u32 p;
  210. /* egcs is stupid */
  211. if (!access_ok(VERIFY_READ, argv, sizeof (u32)))
  212. return -EFAULT;
  213. __get_user(p,argv);
  214. if (!p)
  215. break;
  216. argv++;
  217. if(++i > max)
  218. return -E2BIG;
  219. }
  220. }
  221. return i;
  222. }
  223. /*
  224.  * 'copy_strings32()' copies argument/envelope strings from user
  225.  * memory to free pages in kernel mem. These are in a format ready
  226.  * to be put directly into the top of new user memory.
  227.  */
  228. int copy_strings32(int argc, u32 * argv, struct linux_binprm *bprm)
  229. {
  230. while (argc-- > 0) {
  231. u32 str;
  232. int len;
  233. unsigned long pos;
  234. if (get_user(str, argv+argc) || !str ||
  235.      !(len = strnlen_user((char *)A(str), bprm->p)))
  236. return -EFAULT;
  237. if (bprm->p < len)
  238. return -E2BIG;
  239. bprm->p -= len;
  240. /* XXX: add architecture specific overflow check here. */
  241. pos = bprm->p;
  242. while (len > 0) {
  243. char *kaddr;
  244. int i, new, err;
  245. struct page *page;
  246. int offset, bytes_to_copy;
  247. offset = pos % PAGE_SIZE;
  248. i = pos/PAGE_SIZE;
  249. page = bprm->page[i];
  250. new = 0;
  251. if (!page) {
  252. page = alloc_page(GFP_HIGHUSER);
  253. bprm->page[i] = page;
  254. if (!page)
  255. return -ENOMEM;
  256. new = 1;
  257. }
  258. kaddr = kmap(page);
  259. if (new && offset)
  260. memset(kaddr, 0, offset);
  261. bytes_to_copy = PAGE_SIZE - offset;
  262. if (bytes_to_copy > len) {
  263. bytes_to_copy = len;
  264. if (new)
  265. memset(kaddr+offset+len, 0,
  266.        PAGE_SIZE-offset-len);
  267. }
  268. err = copy_from_user(kaddr + offset, (char *)A(str),
  269.                      bytes_to_copy);
  270. flush_page_to_ram(page);
  271. kunmap(page);
  272. if (err)
  273. return -EFAULT;
  274. pos += bytes_to_copy;
  275. str += bytes_to_copy;
  276. len -= bytes_to_copy;
  277. }
  278. }
  279. return 0;
  280. }
  281. /*
  282.  * sys_execve32() executes a new program.
  283.  */
  284. int do_execve32(char * filename, u32 * argv, u32 * envp, struct pt_regs * regs)
  285. {
  286. struct linux_binprm bprm;
  287. struct dentry * dentry;
  288. int retval;
  289. int i;
  290. bprm.p = PAGE_SIZE*MAX_ARG_PAGES-sizeof(void *);
  291. memset(bprm.page, 0, MAX_ARG_PAGES*sizeof(bprm.page[0]));
  292. dentry = open_namei(filename, 0, 0);
  293. retval = PTR_ERR(dentry);
  294. if (IS_ERR(dentry))
  295. return retval;
  296. bprm.dentry = dentry;
  297. bprm.filename = filename;
  298. bprm.sh_bang = 0;
  299. bprm.loader = 0;
  300. bprm.exec = 0;
  301. if ((bprm.argc = count32(argv, bprm.p / sizeof(u32))) < 0) {
  302. dput(dentry);
  303. return bprm.argc;
  304. }
  305. if ((bprm.envc = count32(envp, bprm.p / sizeof(u32))) < 0) {
  306. dput(dentry);
  307. return bprm.envc;
  308. }
  309. retval = prepare_binprm(&bprm);
  310. if (retval < 0)
  311. goto out;
  312. retval = copy_strings_kernel(1, &bprm.filename, &bprm);
  313. if (retval < 0)
  314. goto out;
  315. bprm.exec = bprm.p;
  316. retval = copy_strings32(bprm.envc, envp, &bprm);
  317. if (retval < 0)
  318. goto out;
  319. retval = copy_strings32(bprm.argc, argv, &bprm);
  320. if (retval < 0)
  321. goto out;
  322. retval = search_binary_handler(&bprm,regs);
  323. if (retval >= 0)
  324. /* execve success */
  325. return retval;
  326. out:
  327. /* Something went wrong, return the inode and free the argument pages*/
  328. if (bprm.dentry)
  329. dput(bprm.dentry);
  330. /* Assumes that free_page() can take a NULL argument. */
  331. /* I hope this is ok for all architectures */
  332. for (i = 0 ; i < MAX_ARG_PAGES ; i++)
  333. if (bprm.page[i])
  334. __free_page(bprm.page[i]);
  335. return retval;
  336. }
  337. /*
  338.  * sys_execve() executes a new program.
  339.  */
  340. asmlinkage int sys32_execve(abi64_no_regargs, struct pt_regs regs)
  341. {
  342. int error;
  343. char * filename;
  344. filename = getname((char *) (long)regs.regs[4]);
  345. printk("Executing: %sn", filename);
  346. error = PTR_ERR(filename);
  347. if (IS_ERR(filename))
  348. goto out;
  349. error = do_execve32(filename, (u32 *) (long)regs.regs[5],
  350.                   (u32 *) (long)regs.regs[6], &regs);
  351. putname(filename);
  352. out:
  353. return error;
  354. }
  355. #else
  356. static int nargs(unsigned int arg, char **ap)
  357. {
  358. char *ptr;
  359. int n, ret;
  360. if (!arg)
  361. return 0;
  362. n = 0;
  363. do {
  364. /* egcs is stupid */
  365. if (!access_ok(VERIFY_READ, arg, sizeof (unsigned int)))
  366. return -EFAULT;
  367. if (IS_ERR(ret = __get_user((long)ptr,(int *)A(arg))))
  368. return ret;
  369. if (ap) /* no access_ok needed, we allocated */
  370. if (IS_ERR(ret = __put_user(ptr, ap++)))
  371. return ret;
  372. arg += sizeof(unsigned int);
  373. n++;
  374. } while (ptr);
  375. return n - 1;
  376. }
  377. asmlinkage int
  378. sys32_execve(abi64_no_regargs, struct pt_regs regs)
  379. {
  380. extern asmlinkage int sys_execve(abi64_no_regargs, struct pt_regs regs);
  381. extern asmlinkage long sys_munmap(unsigned long addr, size_t len);
  382. unsigned int argv = (unsigned int)regs.regs[5];
  383. unsigned int envp = (unsigned int)regs.regs[6];
  384. char **av, **ae;
  385. int na, ne, r, len;
  386. char * filename;
  387. na = nargs(argv, NULL);
  388. if (IS_ERR(na))
  389. return(na);
  390. ne = nargs(envp, NULL);
  391. if (IS_ERR(ne))
  392. return(ne);
  393. len = (na + ne + 2) * sizeof(*av);
  394. /*
  395.  *  kmalloc won't work because the `sys_exec' code will attempt
  396.  *  to do a `get_user' on the arg list and `get_user' will fail
  397.  *  on a kernel address (simplifies `get_user').  Instead we
  398.  *  do an mmap to get a user address.  Note that since a successful
  399.  *  `execve' frees all current memory we only have to do an
  400.  *  `munmap' if the `execve' failes.
  401.  */
  402. down_write(&current->mm->mmap_sem);
  403. av = (char **) do_mmap_pgoff(0, 0, len, PROT_READ | PROT_WRITE,
  404.      MAP_PRIVATE | MAP_ANONYMOUS, 0);
  405. up_write(&current->mm->mmap_sem);
  406. if (IS_ERR(av))
  407. return (long) av;
  408. ae = av + na + 1;
  409. if (IS_ERR(r = __put_user(0, (av + na))))
  410. goto out;
  411. if (IS_ERR(r = __put_user(0, (ae + ne))))
  412. goto out;
  413. if (IS_ERR(r = nargs(argv, av)))
  414. goto out;
  415. if (IS_ERR(r = nargs(envp, ae)))
  416. goto out;
  417. filename = getname((char *) (long)regs.regs[4]);
  418. r = PTR_ERR(filename);
  419. if (IS_ERR(filename))
  420. goto out;
  421. r = do_execve(filename, av, ae, &regs);
  422. putname(filename);
  423. if (IS_ERR(r))
  424. out:
  425. sys_munmap((unsigned long)av, len);
  426. return(r);
  427. }
  428. #endif
  429. struct dirent32 {
  430. unsigned int d_ino;
  431. unsigned int d_off;
  432. unsigned short d_reclen;
  433. char d_name[NAME_MAX + 1];
  434. };
  435. static void
  436. xlate_dirent(void *dirent64, void *dirent32, long n)
  437. {
  438. long off;
  439. struct dirent *dirp;
  440. struct dirent32 *dirp32;
  441. off = 0;
  442. while (off < n) {
  443. dirp = (struct dirent *)(dirent64 + off);
  444. dirp32 = (struct dirent32 *)(dirent32 + off);
  445. off += dirp->d_reclen;
  446. dirp32->d_ino = dirp->d_ino;
  447. dirp32->d_off = (unsigned int)dirp->d_off;
  448. dirp32->d_reclen = dirp->d_reclen;
  449. strncpy(dirp32->d_name, dirp->d_name, dirp->d_reclen - ((3 * 4) + 2));
  450. }
  451. return;
  452. }
  453. asmlinkage long sys_getdents(unsigned int fd, void * dirent, unsigned int count);
  454. asmlinkage long
  455. sys32_getdents(unsigned int fd, void * dirent32, unsigned int count)
  456. {
  457. long n;
  458. void *dirent64;
  459. dirent64 = (void *)((unsigned long)(dirent32 + (sizeof(long) - 1)) & ~(sizeof(long) - 1));
  460. if ((n = sys_getdents(fd, dirent64, count - (dirent64 - dirent32))) < 0)
  461. return(n);
  462. xlate_dirent(dirent64, dirent32, n);
  463. return(n);
  464. }
  465. asmlinkage int old_readdir(unsigned int fd, void * dirent, unsigned int count);
  466. asmlinkage int
  467. sys32_readdir(unsigned int fd, void * dirent32, unsigned int count)
  468. {
  469. int n;
  470. struct dirent dirent64;
  471. if ((n = old_readdir(fd, &dirent64, count)) < 0)
  472. return(n);
  473. xlate_dirent(&dirent64, dirent32, dirent64.d_reclen);
  474. return(n);
  475. }
  476. struct timeval32
  477. {
  478.     int tv_sec, tv_usec;
  479. };
  480. struct itimerval32
  481. {
  482.     struct timeval32 it_interval;
  483.     struct timeval32 it_value;
  484. };
  485. struct rusage32 {
  486.         struct timeval32 ru_utime;
  487.         struct timeval32 ru_stime;
  488.         int    ru_maxrss;
  489.         int    ru_ixrss;
  490.         int    ru_idrss;
  491.         int    ru_isrss;
  492.         int    ru_minflt;
  493.         int    ru_majflt;
  494.         int    ru_nswap;
  495.         int    ru_inblock;
  496.         int    ru_oublock;
  497.         int    ru_msgsnd;
  498.         int    ru_msgrcv;
  499.         int    ru_nsignals;
  500.         int    ru_nvcsw;
  501.         int    ru_nivcsw;
  502. };
  503. static int
  504. put_rusage (struct rusage32 *ru, struct rusage *r)
  505. {
  506. int err;
  507. err = put_user (r->ru_utime.tv_sec, &ru->ru_utime.tv_sec);
  508. err |= __put_user (r->ru_utime.tv_usec, &ru->ru_utime.tv_usec);
  509. err |= __put_user (r->ru_stime.tv_sec, &ru->ru_stime.tv_sec);
  510. err |= __put_user (r->ru_stime.tv_usec, &ru->ru_stime.tv_usec);
  511. err |= __put_user (r->ru_maxrss, &ru->ru_maxrss);
  512. err |= __put_user (r->ru_ixrss, &ru->ru_ixrss);
  513. err |= __put_user (r->ru_idrss, &ru->ru_idrss);
  514. err |= __put_user (r->ru_isrss, &ru->ru_isrss);
  515. err |= __put_user (r->ru_minflt, &ru->ru_minflt);
  516. err |= __put_user (r->ru_majflt, &ru->ru_majflt);
  517. err |= __put_user (r->ru_nswap, &ru->ru_nswap);
  518. err |= __put_user (r->ru_inblock, &ru->ru_inblock);
  519. err |= __put_user (r->ru_oublock, &ru->ru_oublock);
  520. err |= __put_user (r->ru_msgsnd, &ru->ru_msgsnd);
  521. err |= __put_user (r->ru_msgrcv, &ru->ru_msgrcv);
  522. err |= __put_user (r->ru_nsignals, &ru->ru_nsignals);
  523. err |= __put_user (r->ru_nvcsw, &ru->ru_nvcsw);
  524. err |= __put_user (r->ru_nivcsw, &ru->ru_nivcsw);
  525. return err;
  526. }
  527. asmlinkage int
  528. sys32_wait4(__kernel_pid_t32 pid, unsigned int * stat_addr, int options,
  529.     struct rusage32 * ru)
  530. {
  531. if (!ru)
  532. return sys_wait4(pid, stat_addr, options, NULL);
  533. else {
  534. struct rusage r;
  535. int ret;
  536. unsigned int status;
  537. mm_segment_t old_fs = get_fs();
  538. set_fs(KERNEL_DS);
  539. ret = sys_wait4(pid, stat_addr ? &status : NULL, options, &r);
  540. set_fs(old_fs);
  541. if (put_rusage (ru, &r)) return -EFAULT;
  542. if (stat_addr && put_user (status, stat_addr))
  543. return -EFAULT;
  544. return ret;
  545. }
  546. }
  547. asmlinkage int
  548. sys32_waitpid(__kernel_pid_t32 pid, unsigned int *stat_addr, int options)
  549. {
  550. return sys32_wait4(pid, stat_addr, options, NULL);
  551. }
  552. #define RLIM_INFINITY32 0x7fffffff
  553. #define RESOURCE32(x) ((x > RLIM_INFINITY32) ? RLIM_INFINITY32 : x)
  554. struct rlimit32 {
  555. int rlim_cur;
  556. int rlim_max;
  557. };
  558. extern asmlinkage int sys_old_getrlimit(unsigned int resource, struct rlimit *rlim);
  559. asmlinkage int
  560. sys32_getrlimit(unsigned int resource, struct rlimit32 *rlim)
  561. {
  562. struct rlimit r;
  563. int ret;
  564. mm_segment_t old_fs = get_fs ();
  565. set_fs (KERNEL_DS);
  566. ret = sys_old_getrlimit(resource, &r);
  567. set_fs (old_fs);
  568. if (!ret) {
  569. ret = put_user (RESOURCE32(r.rlim_cur), &rlim->rlim_cur);
  570. ret |= __put_user (RESOURCE32(r.rlim_max), &rlim->rlim_max);
  571. }
  572. return ret;
  573. }
  574. extern asmlinkage int sys_setrlimit(unsigned int resource, struct rlimit *rlim);
  575. asmlinkage int
  576. sys32_setrlimit(unsigned int resource, struct rlimit32 *rlim)
  577. {
  578. struct rlimit r;
  579. int ret;
  580. mm_segment_t old_fs = get_fs ();
  581. if (resource >= RLIM_NLIMITS) return -EINVAL;
  582. if (get_user (r.rlim_cur, &rlim->rlim_cur) ||
  583.     __get_user (r.rlim_max, &rlim->rlim_max))
  584. return -EFAULT;
  585. if (r.rlim_cur == RLIM_INFINITY32)
  586. r.rlim_cur = RLIM_INFINITY;
  587. if (r.rlim_max == RLIM_INFINITY32)
  588. r.rlim_max = RLIM_INFINITY;
  589. set_fs (KERNEL_DS);
  590. ret = sys_setrlimit(resource, &r);
  591. set_fs (old_fs);
  592. return ret;
  593. }
  594. struct statfs32 {
  595. int f_type;
  596. int f_bsize;
  597. int f_frsize;
  598. int f_blocks;
  599. int f_bfree;
  600. int f_files;
  601. int f_ffree;
  602. int f_bavail;
  603. __kernel_fsid_t32 f_fsid;
  604. int f_namelen;
  605. int f_spare[6];
  606. };
  607. static inline int
  608. put_statfs (struct statfs32 *ubuf, struct statfs *kbuf)
  609. {
  610. int err;
  611. err = put_user (kbuf->f_type, &ubuf->f_type);
  612. err |= __put_user (kbuf->f_bsize, &ubuf->f_bsize);
  613. err |= __put_user (kbuf->f_blocks, &ubuf->f_blocks);
  614. err |= __put_user (kbuf->f_bfree, &ubuf->f_bfree);
  615. err |= __put_user (kbuf->f_bavail, &ubuf->f_bavail);
  616. err |= __put_user (kbuf->f_files, &ubuf->f_files);
  617. err |= __put_user (kbuf->f_ffree, &ubuf->f_ffree);
  618. err |= __put_user (kbuf->f_namelen, &ubuf->f_namelen);
  619. err |= __put_user (kbuf->f_fsid.val[0], &ubuf->f_fsid.val[0]);
  620. err |= __put_user (kbuf->f_fsid.val[1], &ubuf->f_fsid.val[1]);
  621. return err;
  622. }
  623. extern asmlinkage int sys_statfs(const char * path, struct statfs * buf);
  624. asmlinkage int
  625. sys32_statfs(const char * path, struct statfs32 *buf)
  626. {
  627. int ret;
  628. struct statfs s;
  629. mm_segment_t old_fs = get_fs();
  630. set_fs (KERNEL_DS);
  631. ret = sys_statfs((const char *)path, &s);
  632. set_fs (old_fs);
  633. if (put_statfs(buf, &s))
  634. return -EFAULT;
  635. return ret;
  636. }
  637. extern asmlinkage int sys_fstatfs(unsigned int fd, struct statfs * buf);
  638. asmlinkage int
  639. sys32_fstatfs(unsigned int fd, struct statfs32 *buf)
  640. {
  641. int ret;
  642. struct statfs s;
  643. mm_segment_t old_fs = get_fs();
  644. set_fs (KERNEL_DS);
  645. ret = sys_fstatfs(fd, &s);
  646. set_fs (old_fs);
  647. if (put_statfs(buf, &s))
  648. return -EFAULT;
  649. return ret;
  650. }
  651. extern asmlinkage int
  652. sys_getrusage(int who, struct rusage *ru);
  653. asmlinkage int
  654. sys32_getrusage(int who, struct rusage32 *ru)
  655. {
  656. struct rusage r;
  657. int ret;
  658. mm_segment_t old_fs = get_fs();
  659. set_fs (KERNEL_DS);
  660. ret = sys_getrusage(who, &r);
  661. set_fs (old_fs);
  662. if (put_rusage (ru, &r))
  663. return -EFAULT;
  664. return ret;
  665. }
  666. static inline long
  667. get_tv32(struct timeval *o, struct timeval32 *i)
  668. {
  669. return (!access_ok(VERIFY_READ, i, sizeof(*i)) ||
  670. (__get_user(o->tv_sec, &i->tv_sec) |
  671.  __get_user(o->tv_usec, &i->tv_usec)));
  672. }
  673. static inline long
  674. get_it32(struct itimerval *o, struct itimerval32 *i)
  675. {
  676. return (!access_ok(VERIFY_READ, i, sizeof(*i)) ||
  677. (__get_user(o->it_interval.tv_sec, &i->it_interval.tv_sec) |
  678.  __get_user(o->it_interval.tv_usec, &i->it_interval.tv_usec) |
  679.  __get_user(o->it_value.tv_sec, &i->it_value.tv_sec) |
  680.  __get_user(o->it_value.tv_usec, &i->it_value.tv_usec)));
  681. }
  682. static inline long
  683. put_tv32(struct timeval32 *o, struct timeval *i)
  684. {
  685. return (!access_ok(VERIFY_WRITE, o, sizeof(*o)) ||
  686. (__put_user(i->tv_sec, &o->tv_sec) |
  687.  __put_user(i->tv_usec, &o->tv_usec)));
  688. }
  689. static inline long
  690. put_it32(struct itimerval32 *o, struct itimerval *i)
  691. {
  692. return (!access_ok(VERIFY_WRITE, o, sizeof(*o)) ||
  693. (__put_user(i->it_interval.tv_sec, &o->it_interval.tv_sec) |
  694.  __put_user(i->it_interval.tv_usec, &o->it_interval.tv_usec) |
  695.  __put_user(i->it_value.tv_sec, &o->it_value.tv_sec) |
  696.  __put_user(i->it_value.tv_usec, &o->it_value.tv_usec)));
  697. }
  698. extern int do_getitimer(int which, struct itimerval *value);
  699. asmlinkage int
  700. sys32_getitimer(int which, struct itimerval32 *it)
  701. {
  702. struct itimerval kit;
  703. int error;
  704. error = do_getitimer(which, &kit);
  705. if (!error && put_it32(it, &kit))
  706. error = -EFAULT;
  707. return error;
  708. }
  709. extern int do_setitimer(int which, struct itimerval *, struct itimerval *);
  710. asmlinkage int
  711. sys32_setitimer(int which, struct itimerval32 *in, struct itimerval32 *out)
  712. {
  713. struct itimerval kin, kout;
  714. int error;
  715. if (in) {
  716. if (get_it32(&kin, in))
  717. return -EFAULT;
  718. } else
  719. memset(&kin, 0, sizeof(kin));
  720. error = do_setitimer(which, &kin, out ? &kout : NULL);
  721. if (error || !out)
  722. return error;
  723. if (put_it32(out, &kout))
  724. return -EFAULT;
  725. return 0;
  726. }
  727. asmlinkage unsigned long
  728. sys32_alarm(unsigned int seconds)
  729. {
  730. struct itimerval it_new, it_old;
  731. unsigned int oldalarm;
  732. it_new.it_interval.tv_sec = it_new.it_interval.tv_usec = 0;
  733. it_new.it_value.tv_sec = seconds;
  734. it_new.it_value.tv_usec = 0;
  735. do_setitimer(ITIMER_REAL, &it_new, &it_old);
  736. oldalarm = it_old.it_value.tv_sec;
  737. /* ehhh.. We can't return 0 if we have an alarm pending.. */
  738. /* And we'd better return too much than too little anyway */
  739. if (it_old.it_value.tv_usec)
  740. oldalarm++;
  741. return oldalarm;
  742. }
  743. /* Translations due to time_t size differences.  Which affects all
  744.    sorts of things, like timeval and itimerval.  */
  745. extern struct timezone sys_tz;
  746. extern int do_sys_settimeofday(struct timeval *tv, struct timezone *tz);
  747. asmlinkage int
  748. sys32_gettimeofday(struct timeval32 *tv, struct timezone *tz)
  749. {
  750. if (tv) {
  751. struct timeval ktv;
  752. do_gettimeofday(&ktv);
  753. if (put_tv32(tv, &ktv))
  754. return -EFAULT;
  755. }
  756. if (tz) {
  757. if (copy_to_user(tz, &sys_tz, sizeof(sys_tz)))
  758. return -EFAULT;
  759. }
  760. return 0;
  761. }
  762. asmlinkage int
  763. sys32_settimeofday(struct timeval32 *tv, struct timezone *tz)
  764. {
  765. struct timeval ktv;
  766. struct timezone ktz;
  767.   if (tv) {
  768. if (get_tv32(&ktv, tv))
  769. return -EFAULT;
  770. }
  771. if (tz) {
  772. if (copy_from_user(&ktz, tz, sizeof(ktz)))
  773. return -EFAULT;
  774. }
  775. return do_sys_settimeofday(tv ? &ktv : NULL, tz ? &ktz : NULL);
  776. }
  777. extern asmlinkage long sys_llseek(unsigned int fd, unsigned long offset_high,
  778.           unsigned long offset_low, loff_t * result,
  779.           unsigned int origin);
  780. asmlinkage int sys32_llseek(unsigned int fd, unsigned int offset_high,
  781.     unsigned int offset_low, loff_t * result,
  782.     unsigned int origin)
  783. {
  784. return sys_llseek(fd, offset_high, offset_low, result, origin);
  785. }
  786. struct iovec32 { unsigned int iov_base; int iov_len; };
  787. typedef ssize_t (*IO_fn_t)(struct file *, char *, size_t, loff_t *);
  788. static long
  789. do_readv_writev32(int type, struct file *file, const struct iovec32 *vector,
  790.   u32 count)
  791. {
  792. unsigned long tot_len;
  793. struct iovec iovstack[UIO_FASTIOV];
  794. struct iovec *iov=iovstack, *ivp;
  795. struct inode *inode;
  796. long retval, i;
  797. IO_fn_t fn;
  798. /* First get the "struct iovec" from user memory and
  799.  * verify all the pointers
  800.  */
  801. if (!count)
  802. return 0;
  803. if(verify_area(VERIFY_READ, vector, sizeof(struct iovec32)*count))
  804. return -EFAULT;
  805. if (count > UIO_MAXIOV)
  806. return -EINVAL;
  807. if (count > UIO_FASTIOV) {
  808. iov = kmalloc(count*sizeof(struct iovec), GFP_KERNEL);
  809. if (!iov)
  810. return -ENOMEM;
  811. }
  812. tot_len = 0;
  813. i = count;
  814. ivp = iov;
  815. while (i > 0) {
  816. u32 len;
  817. u32 buf;
  818. __get_user(len, &vector->iov_len);
  819. __get_user(buf, &vector->iov_base);
  820. tot_len += len;
  821. ivp->iov_base = (void *)A(buf);
  822. ivp->iov_len = (__kernel_size_t) len;
  823. vector++;
  824. ivp++;
  825. i--;
  826. }
  827. inode = file->f_dentry->d_inode;
  828. /* VERIFY_WRITE actually means a read, as we write to user space */
  829. retval = locks_verify_area((type == VERIFY_WRITE
  830.     ? FLOCK_VERIFY_READ : FLOCK_VERIFY_WRITE),
  831.    inode, file, file->f_pos, tot_len);
  832. if (retval) {
  833. if (iov != iovstack)
  834. kfree(iov);
  835. return retval;
  836. }
  837. /* Then do the actual IO.  Note that sockets need to be handled
  838.  * specially as they have atomicity guarantees and can handle
  839.  * iovec's natively
  840.  */
  841. if (inode->i_sock) {
  842. int err;
  843. err = sock_readv_writev(type, inode, file, iov, count, tot_len);
  844. if (iov != iovstack)
  845. kfree(iov);
  846. return err;
  847. }
  848. if (!file->f_op) {
  849. if (iov != iovstack)
  850. kfree(iov);
  851. return -EINVAL;
  852. }
  853. /* VERIFY_WRITE actually means a read, as we write to user space */
  854. fn = file->f_op->read;
  855. if (type == VERIFY_READ)
  856. fn = (IO_fn_t) file->f_op->write;
  857. ivp = iov;
  858. while (count > 0) {
  859. void * base;
  860. int len, nr;
  861. base = ivp->iov_base;
  862. len = ivp->iov_len;
  863. ivp++;
  864. count--;
  865. nr = fn(file, base, len, &file->f_pos);
  866. if (nr < 0) {
  867. if (retval)
  868. break;
  869. retval = nr;
  870. break;
  871. }
  872. retval += nr;
  873. if (nr != len)
  874. break;
  875. }
  876. if (iov != iovstack)
  877. kfree(iov);
  878. return retval;
  879. }
  880. asmlinkage long
  881. sys32_readv(int fd, struct iovec32 *vector, u32 count)
  882. {
  883. struct file *file;
  884. ssize_t ret;
  885. ret = -EBADF;
  886. file = fget(fd);
  887. if (!file)
  888. goto bad_file;
  889. if (file->f_op && (file->f_mode & FMODE_READ) &&
  890.     (file->f_op->readv || file->f_op->read))
  891. ret = do_readv_writev32(VERIFY_WRITE, file, vector, count);
  892. fput(file);
  893. bad_file:
  894. return ret;
  895. }
  896. asmlinkage long
  897. sys32_writev(int fd, struct iovec32 *vector, u32 count)
  898. {
  899. struct file *file;
  900. ssize_t ret;
  901. ret = -EBADF;
  902. file = fget(fd);
  903. if(!file)
  904. goto bad_file;
  905. if (file->f_op && (file->f_mode & FMODE_WRITE) &&
  906.     (file->f_op->writev || file->f_op->write))
  907.         ret = do_readv_writev32(VERIFY_READ, file, vector, count);
  908. fput(file);
  909. bad_file:
  910. return ret;
  911. }
  912. /* From the Single Unix Spec: pread & pwrite act like lseek to pos + op +
  913.    lseek back to original location.  They fail just like lseek does on
  914.    non-seekable files.  */
  915. asmlinkage ssize_t sys32_pread(unsigned int fd, char * buf,
  916.        size_t count, u32 unused, u64 a4, u64 a5)
  917. {
  918. ssize_t ret;
  919. struct file * file;
  920. ssize_t (*read)(struct file *, char *, size_t, loff_t *);
  921. loff_t pos;
  922. ret = -EBADF;
  923. file = fget(fd);
  924. if (!file)
  925. goto bad_file;
  926. if (!(file->f_mode & FMODE_READ))
  927. goto out;
  928. pos = merge_64(a4, a5);
  929. ret = locks_verify_area(FLOCK_VERIFY_READ, file->f_dentry->d_inode,
  930. file, pos, count);
  931. if (ret)
  932. goto out;
  933. ret = -EINVAL;
  934. if (!file->f_op || !(read = file->f_op->read))
  935. goto out;
  936. if (pos < 0)
  937. goto out;
  938. ret = read(file, buf, count, &pos);
  939. if (ret > 0)
  940. dnotify_parent(file->f_dentry, DN_ACCESS);
  941. out:
  942. fput(file);
  943. bad_file:
  944. return ret;
  945. }
  946. asmlinkage ssize_t sys32_pwrite(unsigned int fd, const char * buf,
  947.         size_t count, u32 unused, u64 a4, u64 a5)
  948. {
  949. ssize_t ret;
  950. struct file * file;
  951. ssize_t (*write)(struct file *, const char *, size_t, loff_t *);
  952. loff_t pos;
  953. ret = -EBADF;
  954. file = fget(fd);
  955. if (!file)
  956. goto bad_file;
  957. if (!(file->f_mode & FMODE_WRITE))
  958. goto out;
  959. pos = merge_64(a4, a5);
  960. ret = locks_verify_area(FLOCK_VERIFY_WRITE, file->f_dentry->d_inode,
  961. file, pos, count);
  962. if (ret)
  963. goto out;
  964. ret = -EINVAL;
  965. if (!file->f_op || !(write = file->f_op->write))
  966. goto out;
  967. if (pos < 0)
  968. goto out;
  969. ret = write(file, buf, count, &pos);
  970. if (ret > 0)
  971. dnotify_parent(file->f_dentry, DN_MODIFY);
  972. out:
  973. fput(file);
  974. bad_file:
  975. return ret;
  976. }
  977. /*
  978.  * Ooo, nasty.  We need here to frob 32-bit unsigned longs to
  979.  * 64-bit unsigned longs.
  980.  */
  981. static inline int
  982. get_fd_set32(unsigned long n, unsigned long *fdset, u32 *ufdset)
  983. {
  984. if (ufdset) {
  985. unsigned long odd;
  986. if (verify_area(VERIFY_WRITE, ufdset, n*sizeof(u32)))
  987. return -EFAULT;
  988. odd = n & 1UL;
  989. n &= ~1UL;
  990. while (n) {
  991. unsigned long h, l;
  992. __get_user(l, ufdset);
  993. __get_user(h, ufdset+1);
  994. ufdset += 2;
  995. *fdset++ = h << 32 | l;
  996. n -= 2;
  997. }
  998. if (odd)
  999. __get_user(*fdset, ufdset);
  1000. } else {
  1001. /* Tricky, must clear full unsigned long in the
  1002.  * kernel fdset at the end, this makes sure that
  1003.  * actually happens.
  1004.  */
  1005. memset(fdset, 0, ((n + 1) & ~1)*sizeof(u32));
  1006. }
  1007. return 0;
  1008. }
  1009. static inline void
  1010. set_fd_set32(unsigned long n, u32 *ufdset, unsigned long *fdset)
  1011. {
  1012. unsigned long odd;
  1013. if (!ufdset)
  1014. return;
  1015. odd = n & 1UL;
  1016. n &= ~1UL;
  1017. while (n) {
  1018. unsigned long h, l;
  1019. l = *fdset++;
  1020. h = l >> 32;
  1021. __put_user(l, ufdset);
  1022. __put_user(h, ufdset+1);
  1023. ufdset += 2;
  1024. n -= 2;
  1025. }
  1026. if (odd)
  1027. __put_user(*fdset, ufdset);
  1028. }
  1029. /*
  1030.  * We can actually return ERESTARTSYS instead of EINTR, but I'd
  1031.  * like to be certain this leads to no problems. So I return
  1032.  * EINTR just for safety.
  1033.  *
  1034.  * Update: ERESTARTSYS breaks at least the xview clock binary, so
  1035.  * I'm trying ERESTARTNOHAND which restart only when you want to.
  1036.  */
  1037. #define MAX_SELECT_SECONDS 
  1038. ((unsigned long) (MAX_SCHEDULE_TIMEOUT / HZ)-1)
  1039. asmlinkage int sys32_select(int n, u32 *inp, u32 *outp, u32 *exp, struct timeval32 *tvp)
  1040. {
  1041. fd_set_bits fds;
  1042. char *bits;
  1043. unsigned long nn;
  1044. long timeout;
  1045. int ret, size;
  1046. timeout = MAX_SCHEDULE_TIMEOUT;
  1047. if (tvp) {
  1048. time_t sec, usec;
  1049. if ((ret = verify_area(VERIFY_READ, tvp, sizeof(*tvp)))
  1050.     || (ret = __get_user(sec, &tvp->tv_sec))
  1051.     || (ret = __get_user(usec, &tvp->tv_usec)))
  1052. goto out_nofds;
  1053. ret = -EINVAL;
  1054. if(sec < 0 || usec < 0)
  1055. goto out_nofds;
  1056. if ((unsigned long) sec < MAX_SELECT_SECONDS) {
  1057. timeout = (usec + 1000000/HZ - 1) / (1000000/HZ);
  1058. timeout += sec * (unsigned long) HZ;
  1059. }
  1060. }
  1061. ret = -EINVAL;
  1062. if (n < 0)
  1063. goto out_nofds;
  1064. if (n > current->files->max_fdset)
  1065. n = current->files->max_fdset;
  1066. /*
  1067.  * We need 6 bitmaps (in/out/ex for both incoming and outgoing),
  1068.  * since we used fdset we need to allocate memory in units of
  1069.  * long-words.
  1070.  */
  1071. ret = -ENOMEM;
  1072. size = FDS_BYTES(n);
  1073. bits = kmalloc(6 * size, GFP_KERNEL);
  1074. if (!bits)
  1075. goto out_nofds;
  1076. fds.in      = (unsigned long *)  bits;
  1077. fds.out     = (unsigned long *) (bits +   size);
  1078. fds.ex      = (unsigned long *) (bits + 2*size);
  1079. fds.res_in  = (unsigned long *) (bits + 3*size);
  1080. fds.res_out = (unsigned long *) (bits + 4*size);
  1081. fds.res_ex  = (unsigned long *) (bits + 5*size);
  1082. nn = (n + 8*sizeof(u32) - 1) / (8*sizeof(u32));
  1083. if ((ret = get_fd_set32(nn, fds.in, inp)) ||
  1084.     (ret = get_fd_set32(nn, fds.out, outp)) ||
  1085.     (ret = get_fd_set32(nn, fds.ex, exp)))
  1086. goto out;
  1087. zero_fd_set(n, fds.res_in);
  1088. zero_fd_set(n, fds.res_out);
  1089. zero_fd_set(n, fds.res_ex);
  1090. ret = do_select(n, &fds, &timeout);
  1091. if (tvp && !(current->personality & STICKY_TIMEOUTS)) {
  1092. time_t sec = 0, usec = 0;
  1093. if (timeout) {
  1094. sec = timeout / HZ;
  1095. usec = timeout % HZ;
  1096. usec *= (1000000/HZ);
  1097. }
  1098. put_user(sec, &tvp->tv_sec);
  1099. put_user(usec, &tvp->tv_usec);
  1100. }
  1101. if (ret < 0)
  1102. goto out;
  1103. if (!ret) {
  1104. ret = -ERESTARTNOHAND;
  1105. if (signal_pending(current))
  1106. goto out;
  1107. ret = 0;
  1108. }
  1109. set_fd_set32(nn, inp, fds.res_in);
  1110. set_fd_set32(nn, outp, fds.res_out);
  1111. set_fd_set32(nn, exp, fds.res_ex);
  1112. out:
  1113. kfree(bits);
  1114. out_nofds:
  1115. return ret;
  1116. }
  1117. struct timespec32 {
  1118. int  tv_sec;
  1119. int tv_nsec;
  1120. };
  1121. extern asmlinkage int sys_sched_rr_get_interval(pid_t pid,
  1122. struct timespec *interval);
  1123. asmlinkage int
  1124. sys32_sched_rr_get_interval(__kernel_pid_t32 pid, struct timespec32 *interval)
  1125. {
  1126. struct timespec t;
  1127. int ret;
  1128. mm_segment_t old_fs = get_fs ();
  1129. set_fs (KERNEL_DS);
  1130. ret = sys_sched_rr_get_interval(pid, &t);
  1131. set_fs (old_fs);
  1132. if (put_user (t.tv_sec, &interval->tv_sec) ||
  1133.     __put_user (t.tv_nsec, &interval->tv_nsec))
  1134. return -EFAULT;
  1135. return ret;
  1136. }
  1137. extern asmlinkage int sys_nanosleep(struct timespec *rqtp,
  1138.     struct timespec *rmtp);
  1139. asmlinkage int
  1140. sys32_nanosleep(struct timespec32 *rqtp, struct timespec32 *rmtp)
  1141. {
  1142. struct timespec t;
  1143. int ret;
  1144. mm_segment_t old_fs = get_fs ();
  1145. if (get_user (t.tv_sec, &rqtp->tv_sec) ||
  1146.     __get_user (t.tv_nsec, &rqtp->tv_nsec))
  1147. return -EFAULT;
  1148. set_fs (KERNEL_DS);
  1149. ret = sys_nanosleep(&t, rmtp ? &t : NULL);
  1150. set_fs (old_fs);
  1151. if (rmtp && ret == -EINTR) {
  1152. if (__put_user (t.tv_sec, &rmtp->tv_sec) ||
  1153.          __put_user (t.tv_nsec, &rmtp->tv_nsec))
  1154. return -EFAULT;
  1155. }
  1156. return ret;
  1157. }
  1158. struct tms32 {
  1159. int tms_utime;
  1160. int tms_stime;
  1161. int tms_cutime;
  1162. int tms_cstime;
  1163. };
  1164. extern asmlinkage long sys_times(struct tms * tbuf);
  1165. asmlinkage long sys32_times(struct tms32 *tbuf)
  1166. {
  1167. struct tms t;
  1168. long ret;
  1169. mm_segment_t old_fs = get_fs();
  1170. int err;
  1171. set_fs(KERNEL_DS);
  1172. ret = sys_times(tbuf ? &t : NULL);
  1173. set_fs(old_fs);
  1174. if (tbuf) {
  1175. err = put_user (t.tms_utime, &tbuf->tms_utime);
  1176. err |= __put_user (t.tms_stime, &tbuf->tms_stime);
  1177. err |= __put_user (t.tms_cutime, &tbuf->tms_cutime);
  1178. err |= __put_user (t.tms_cstime, &tbuf->tms_cstime);
  1179. if (err)
  1180. ret = -EFAULT;
  1181. }
  1182. return ret;
  1183. }
  1184. extern asmlinkage int sys_setsockopt(int fd, int level, int optname,
  1185.      char *optval, int optlen);
  1186. static int do_set_attach_filter(int fd, int level, int optname,
  1187. char *optval, int optlen)
  1188. {
  1189. struct sock_fprog32 {
  1190. __u16 len;
  1191. __u32 filter;
  1192. } *fprog32 = (struct sock_fprog32 *)optval;
  1193. struct sock_fprog kfprog;
  1194. struct sock_filter *kfilter;
  1195. unsigned int fsize;
  1196. mm_segment_t old_fs;
  1197. __u32 uptr;
  1198. int ret;
  1199. if (get_user(kfprog.len, &fprog32->len) ||
  1200.     __get_user(uptr, &fprog32->filter))
  1201. return -EFAULT;
  1202. kfprog.filter = (struct sock_filter *)A(uptr);
  1203. fsize = kfprog.len * sizeof(struct sock_filter);
  1204. kfilter = (struct sock_filter *)kmalloc(fsize, GFP_KERNEL);
  1205. if (kfilter == NULL)
  1206. return -ENOMEM;
  1207. if (copy_from_user(kfilter, kfprog.filter, fsize)) {
  1208. kfree(kfilter);
  1209. return -EFAULT;
  1210. }
  1211. kfprog.filter = kfilter;
  1212. old_fs = get_fs();
  1213. set_fs(KERNEL_DS);
  1214. ret = sys_setsockopt(fd, level, optname,
  1215.      (char *)&kfprog, sizeof(kfprog));
  1216. set_fs(old_fs);
  1217. kfree(kfilter);
  1218. return ret;
  1219. }
  1220. static int do_set_icmpv6_filter(int fd, int level, int optname,
  1221. char *optval, int optlen)
  1222. {
  1223. struct icmp6_filter kfilter;
  1224. mm_segment_t old_fs;
  1225. int ret, i;
  1226. if (copy_from_user(&kfilter, optval, sizeof(kfilter)))
  1227. return -EFAULT;
  1228. for (i = 0; i < 8; i += 2) {
  1229. u32 tmp = kfilter.data[i];
  1230. kfilter.data[i] = kfilter.data[i + 1];
  1231. kfilter.data[i + 1] = tmp;
  1232. }
  1233. old_fs = get_fs();
  1234. set_fs(KERNEL_DS);
  1235. ret = sys_setsockopt(fd, level, optname,
  1236.      (char *) &kfilter, sizeof(kfilter));
  1237. set_fs(old_fs);
  1238. return ret;
  1239. }
  1240. asmlinkage int sys32_setsockopt(int fd, int level, int optname,
  1241. char *optval, int optlen)
  1242. {
  1243. if (optname == SO_ATTACH_FILTER)
  1244. return do_set_attach_filter(fd, level, optname,
  1245.     optval, optlen);
  1246. if (level == SOL_ICMPV6 && optname == ICMPV6_FILTER)
  1247. return do_set_icmpv6_filter(fd, level, optname,
  1248.     optval, optlen);
  1249. return sys_setsockopt(fd, level, optname, optval, optlen);
  1250. }
  1251. static inline int get_flock(struct flock *kfl, struct flock32 *ufl)
  1252. {
  1253. int err;
  1254. if (!access_ok(VERIFY_READ, ufl, sizeof(*ufl)))
  1255. return -EFAULT;
  1256. err = __get_user(kfl->l_type, &ufl->l_type);
  1257. err |= __get_user(kfl->l_whence, &ufl->l_whence);
  1258. err |= __get_user(kfl->l_start, &ufl->l_start);
  1259. err |= __get_user(kfl->l_len, &ufl->l_len);
  1260. err |= __get_user(kfl->l_pid, &ufl->l_pid);
  1261. return err;
  1262. }
  1263. static inline int put_flock(struct flock *kfl, struct flock32 *ufl)
  1264. {
  1265. int err;
  1266. if (!access_ok(VERIFY_WRITE, ufl, sizeof(*ufl)))
  1267. return -EFAULT;
  1268. err = __put_user(kfl->l_type, &ufl->l_type);
  1269. err |= __put_user(kfl->l_whence, &ufl->l_whence);
  1270. err |= __put_user(kfl->l_start, &ufl->l_start);
  1271. err |= __put_user(kfl->l_len, &ufl->l_len);
  1272. err |= __put_user(0, &ufl->l_sysid);
  1273. err |= __put_user(kfl->l_pid, &ufl->l_pid);
  1274. return err;
  1275. }
  1276. extern asmlinkage long
  1277. sys_fcntl(unsigned int fd, unsigned int cmd, unsigned long arg);
  1278. asmlinkage long
  1279. sys32_fcntl(unsigned int fd, unsigned int cmd, unsigned long arg)
  1280. {
  1281. switch (cmd) {
  1282. case F_GETLK:
  1283. case F_SETLK:
  1284. case F_SETLKW:
  1285. {
  1286. struct flock f;
  1287. mm_segment_t old_fs;
  1288. long ret;
  1289. if (get_flock(&f, (struct flock32 *)arg))
  1290. return -EFAULT;
  1291. old_fs = get_fs(); set_fs (KERNEL_DS);
  1292. ret = sys_fcntl(fd, cmd, (unsigned long)&f);
  1293. set_fs (old_fs);
  1294. if (put_flock(&f, (struct flock32 *)arg))
  1295. return -EFAULT;
  1296. return ret;
  1297. }
  1298. default:
  1299. return sys_fcntl(fd, cmd, (unsigned long)arg);
  1300. }
  1301. }
  1302. asmlinkage long
  1303. sys32_fcntl64(unsigned int fd, unsigned int cmd, unsigned long arg)
  1304. {
  1305. switch (cmd) {
  1306. case F_GETLK64:
  1307. return sys_fcntl(fd, F_GETLK, arg);
  1308. case F_SETLK64:
  1309. return sys_fcntl(fd, F_SETLK, arg);
  1310. case F_SETLKW64:
  1311. return sys_fcntl(fd, F_SETLKW, arg);
  1312. }
  1313. return sys32_fcntl(fd, cmd, arg);
  1314. }
  1315. struct msgbuf32 { s32 mtype; char mtext[1]; };
  1316. struct ipc_perm32
  1317. {
  1318. key_t       key;
  1319.         __kernel_uid_t32  uid;
  1320.         __kernel_gid_t32  gid;
  1321.         __kernel_uid_t32  cuid;
  1322.         __kernel_gid_t32  cgid;
  1323.         __kernel_mode_t32 mode;
  1324.         unsigned short  seq;
  1325. };
  1326. struct ipc64_perm32 {
  1327. key_t key;
  1328. __kernel_uid_t32 uid;
  1329. __kernel_gid_t32 gid;
  1330. __kernel_uid_t32 cuid;
  1331. __kernel_gid_t32 cgid;
  1332. __kernel_mode_t32 mode; 
  1333. unsigned short seq;
  1334. unsigned short __pad1;
  1335. unsigned int __unused1;
  1336. unsigned int __unused2;
  1337. };
  1338. struct semid_ds32 {
  1339.         struct ipc_perm32 sem_perm;               /* permissions .. see ipc.h */
  1340.         __kernel_time_t32 sem_otime;              /* last semop time */
  1341.         __kernel_time_t32 sem_ctime;              /* last change time */
  1342.         u32 sem_base;              /* ptr to first semaphore in array */
  1343.         u32 sem_pending;          /* pending operations to be processed */
  1344.         u32 sem_pending_last;    /* last pending operation */
  1345.         u32 undo;                  /* undo requests on this array */
  1346.         unsigned short  sem_nsems;              /* no. of semaphores in array */
  1347. };
  1348. struct msqid_ds32
  1349. {
  1350.         struct ipc_perm32 msg_perm;
  1351.         u32 msg_first;
  1352.         u32 msg_last;
  1353.         __kernel_time_t32 msg_stime;
  1354.         __kernel_time_t32 msg_rtime;
  1355.         __kernel_time_t32 msg_ctime;
  1356.         u32 wwait;
  1357.         u32 rwait;
  1358.         unsigned short msg_cbytes;
  1359.         unsigned short msg_qnum;
  1360.         unsigned short msg_qbytes;
  1361.         __kernel_ipc_pid_t32 msg_lspid;
  1362.         __kernel_ipc_pid_t32 msg_lrpid;
  1363. };
  1364. struct msqid64_ds32 {
  1365. struct ipc64_perm32 msg_perm;
  1366. __kernel_time_t32 msg_stime;
  1367. unsigned int __unused1;
  1368. __kernel_time_t32 msg_rtime;
  1369. unsigned int __unused2;
  1370. __kernel_time_t32 msg_ctime;
  1371. unsigned int __unused3;
  1372. unsigned int msg_cbytes;
  1373. unsigned int msg_qnum;
  1374. unsigned int msg_qbytes;
  1375. __kernel_pid_t32 msg_lspid;
  1376. __kernel_pid_t32 msg_lrpid;
  1377. unsigned int __unused4;
  1378. unsigned int __unused5;
  1379. };
  1380. struct shmid_ds32 {
  1381.         struct ipc_perm32       shm_perm;
  1382.         int                     shm_segsz;
  1383.         __kernel_time_t32       shm_atime;
  1384.         __kernel_time_t32       shm_dtime;
  1385.         __kernel_time_t32       shm_ctime;
  1386.         __kernel_ipc_pid_t32    shm_cpid;
  1387.         __kernel_ipc_pid_t32    shm_lpid;
  1388.         unsigned short          shm_nattch;
  1389. };
  1390. struct ipc_kludge32 {
  1391. u32 msgp;
  1392. s32 msgtyp;
  1393. };
  1394. static int
  1395. do_sys32_semctl(int first, int second, int third, void *uptr)
  1396. {
  1397. union semun fourth;
  1398. u32 pad;
  1399. int err, err2;
  1400. struct semid64_ds s;
  1401. struct semid_ds32 *usp;
  1402. mm_segment_t old_fs;
  1403. if (!uptr)
  1404. return -EINVAL;
  1405. err = -EFAULT;
  1406. if (get_user (pad, (u32 *)uptr))
  1407. return err;
  1408. if ((third & ~IPC_64) == SETVAL)
  1409. fourth.val = (int)pad;
  1410. else
  1411. fourth.__pad = (void *)A(pad);
  1412. switch (third & ~IPC_64) {
  1413. case IPC_INFO:
  1414. case IPC_RMID:
  1415. case IPC_SET:
  1416. case SEM_INFO:
  1417. case GETVAL:
  1418. case GETPID:
  1419. case GETNCNT:
  1420. case GETZCNT:
  1421. case GETALL:
  1422. case SETVAL:
  1423. case SETALL:
  1424. err = sys_semctl (first, second, third, fourth);
  1425. break;
  1426. case IPC_STAT:
  1427. case SEM_STAT:
  1428. usp = (struct semid_ds32 *)A(pad);
  1429. fourth.__pad = &s;
  1430. old_fs = get_fs ();
  1431. set_fs (KERNEL_DS);
  1432. err = sys_semctl (first, second, third, fourth);
  1433. set_fs (old_fs);
  1434. err2 = put_user(s.sem_perm.key, &usp->sem_perm.key);
  1435. err2 |= __put_user(s.sem_perm.uid, &usp->sem_perm.uid);
  1436. err2 |= __put_user(s.sem_perm.gid, &usp->sem_perm.gid);
  1437. err2 |= __put_user(s.sem_perm.cuid,
  1438.    &usp->sem_perm.cuid);
  1439. err2 |= __put_user (s.sem_perm.cgid,
  1440.     &usp->sem_perm.cgid);
  1441. err2 |= __put_user (s.sem_perm.mode,
  1442.     &usp->sem_perm.mode);
  1443. err2 |= __put_user (s.sem_perm.seq, &usp->sem_perm.seq);
  1444. err2 |= __put_user (s.sem_otime, &usp->sem_otime);
  1445. err2 |= __put_user (s.sem_ctime, &usp->sem_ctime);
  1446. err2 |= __put_user (s.sem_nsems, &usp->sem_nsems);
  1447. if (err2)
  1448. err = -EFAULT;
  1449. break;
  1450. }
  1451. return err;
  1452. }
  1453. do_sys32_msgsnd (int first, int second, int third, void *uptr)
  1454. {
  1455. struct msgbuf32 *up = (struct msgbuf32 *)uptr;
  1456. struct msgbuf *p;
  1457. mm_segment_t old_fs;
  1458. int err;
  1459. if (second < 0)
  1460. return -EINVAL;
  1461. p = kmalloc (second + sizeof (struct msgbuf)
  1462.     + 4, GFP_USER);
  1463. if (!p)
  1464. return -ENOMEM;
  1465. err = get_user (p->mtype, &up->mtype);
  1466. if (err)
  1467. goto out;
  1468. err |= __copy_from_user (p->mtext, &up->mtext, second);
  1469. if (err)
  1470. goto out;
  1471. old_fs = get_fs ();
  1472. set_fs (KERNEL_DS);
  1473. err = sys_msgsnd (first, p, second, third);
  1474. set_fs (old_fs);
  1475. out:
  1476. kfree (p);
  1477. return err;
  1478. }
  1479. static int
  1480. do_sys32_msgrcv (int first, int second, int msgtyp, int third,
  1481.  int version, void *uptr)
  1482. {
  1483. struct msgbuf32 *up;
  1484. struct msgbuf *p;
  1485. mm_segment_t old_fs;
  1486. int err;
  1487. if (!version) {
  1488. struct ipc_kludge32 *uipck = (struct ipc_kludge32 *)uptr;
  1489. struct ipc_kludge32 ipck;
  1490. err = -EINVAL;
  1491. if (!uptr)
  1492. goto out;
  1493. err = -EFAULT;
  1494. if (copy_from_user (&ipck, uipck, sizeof (struct ipc_kludge32)))
  1495. goto out;
  1496. uptr = (void *)AA(ipck.msgp);
  1497. msgtyp = ipck.msgtyp;
  1498. }
  1499. if (second < 0)
  1500. return -EINVAL;
  1501. err = -ENOMEM;
  1502. p = kmalloc (second + sizeof (struct msgbuf) + 4, GFP_USER);
  1503. if (!p)
  1504. goto out;
  1505. old_fs = get_fs ();
  1506. set_fs (KERNEL_DS);
  1507. err = sys_msgrcv (first, p, second + 4, msgtyp, third);
  1508. set_fs (old_fs);
  1509. if (err < 0)
  1510. goto free_then_out;
  1511. up = (struct msgbuf32 *)uptr;
  1512. if (put_user (p->mtype, &up->mtype) ||
  1513.     __copy_to_user (&up->mtext, p->mtext, err))
  1514. err = -EFAULT;
  1515. free_then_out:
  1516. kfree (p);
  1517. out:
  1518. return err;
  1519. }
  1520. static int
  1521. do_sys32_msgctl (int first, int second, void *uptr)
  1522. {
  1523. int err = -EINVAL, err2;
  1524. struct msqid64_ds m;
  1525. struct msqid_ds32 *up32 = (struct msqid_ds32 *)uptr;
  1526. struct msqid64_ds32 *up64 = (struct msqid64_ds32 *)uptr;
  1527. mm_segment_t old_fs;
  1528. switch (second & ~IPC_64) {
  1529. case IPC_INFO:
  1530. case IPC_RMID:
  1531. case MSG_INFO:
  1532. err = sys_msgctl (first, second, (struct msqid_ds *)uptr);
  1533. break;
  1534. case IPC_SET:
  1535. if (second & IPC_64) {
  1536. if (!access_ok(VERIFY_READ, up64, sizeof(*up64))) {
  1537. err = -EFAULT;
  1538. break;
  1539. }
  1540. err = __get_user(m.msg_perm.uid, &up64->msg_perm.uid);
  1541. err |= __get_user(m.msg_perm.gid, &up64->msg_perm.gid);
  1542. err |= __get_user(m.msg_perm.mode, &up64->msg_perm.mode);
  1543. err |= __get_user(m.msg_qbytes, &up64->msg_qbytes);
  1544. } else {
  1545. if (!access_ok(VERIFY_READ, up32, sizeof(*up32))) {
  1546. err = -EFAULT;
  1547. break;
  1548. }
  1549. err = __get_user(m.msg_perm.uid, &up32->msg_perm.uid);
  1550. err |= __get_user(m.msg_perm.gid, &up32->msg_perm.gid);
  1551. err |= __get_user(m.msg_perm.mode, &up32->msg_perm.mode);
  1552. err |= __get_user(m.msg_qbytes, &up32->msg_qbytes);
  1553. }
  1554. if (err)
  1555. break;
  1556. old_fs = get_fs ();
  1557. set_fs (KERNEL_DS);
  1558. err = sys_msgctl (first, second, (struct msqid_ds *)&m);
  1559. set_fs (old_fs);
  1560. break;
  1561. case IPC_STAT:
  1562. case MSG_STAT:
  1563. old_fs = get_fs ();
  1564. set_fs (KERNEL_DS);
  1565. err = sys_msgctl (first, second, (struct msqid_ds *)&m);
  1566. set_fs (old_fs);
  1567. if (second & IPC_64) {
  1568. if (!access_ok(VERIFY_WRITE, up64, sizeof(*up64))) {
  1569. err = -EFAULT;
  1570. break;
  1571. }
  1572. err2 = __put_user(m.msg_perm.key, &up64->msg_perm.key);
  1573. err2 |= __put_user(m.msg_perm.uid, &up64->msg_perm.uid);
  1574. err2 |= __put_user(m.msg_perm.gid, &up64->msg_perm.gid);
  1575. err2 |= __put_user(m.msg_perm.cuid, &up64->msg_perm.cuid);
  1576. err2 |= __put_user(m.msg_perm.cgid, &up64->msg_perm.cgid);
  1577. err2 |= __put_user(m.msg_perm.mode, &up64->msg_perm.mode);
  1578. err2 |= __put_user(m.msg_perm.seq, &up64->msg_perm.seq);
  1579. err2 |= __put_user(m.msg_stime, &up64->msg_stime);
  1580. err2 |= __put_user(m.msg_rtime, &up64->msg_rtime);
  1581. err2 |= __put_user(m.msg_ctime, &up64->msg_ctime);
  1582. err2 |= __put_user(m.msg_cbytes, &up64->msg_cbytes);
  1583. err2 |= __put_user(m.msg_qnum, &up64->msg_qnum);
  1584. err2 |= __put_user(m.msg_qbytes, &up64->msg_qbytes);
  1585. err2 |= __put_user(m.msg_lspid, &up64->msg_lspid);
  1586. err2 |= __put_user(m.msg_lrpid, &up64->msg_lrpid);
  1587. if (err2)
  1588. err = -EFAULT;
  1589. } else {
  1590. if (!access_ok(VERIFY_WRITE, up32, sizeof(*up32))) {
  1591. err = -EFAULT;
  1592. break;
  1593. }
  1594. err2 = __put_user(m.msg_perm.key, &up32->msg_perm.key);
  1595. err2 |= __put_user(m.msg_perm.uid, &up32->msg_perm.uid);
  1596. err2 |= __put_user(m.msg_perm.gid, &up32->msg_perm.gid);
  1597. err2 |= __put_user(m.msg_perm.cuid, &up32->msg_perm.cuid);
  1598. err2 |= __put_user(m.msg_perm.cgid, &up32->msg_perm.cgid);
  1599. err2 |= __put_user(m.msg_perm.mode, &up32->msg_perm.mode);
  1600. err2 |= __put_user(m.msg_perm.seq, &up32->msg_perm.seq);
  1601. err2 |= __put_user(m.msg_stime, &up32->msg_stime);
  1602. err2 |= __put_user(m.msg_rtime, &up32->msg_rtime);
  1603. err2 |= __put_user(m.msg_ctime, &up32->msg_ctime);
  1604. err2 |= __put_user(m.msg_cbytes, &up32->msg_cbytes);
  1605. err2 |= __put_user(m.msg_qnum, &up32->msg_qnum);
  1606. err2 |= __put_user(m.msg_qbytes, &up32->msg_qbytes);
  1607. err2 |= __put_user(m.msg_lspid, &up32->msg_lspid);
  1608. err2 |= __put_user(m.msg_lrpid, &up32->msg_lrpid);
  1609. if (err2)
  1610. err = -EFAULT;
  1611. }
  1612. break;
  1613. }
  1614. return err;
  1615. }
  1616. static int
  1617. do_sys32_shmat (int first, int second, int third, int version, void *uptr)
  1618. {
  1619. unsigned long raddr;
  1620. u32 *uaddr = (u32 *)A((u32)third);
  1621. int err = -EINVAL;
  1622. if (version == 1)
  1623. return err;
  1624. if (version == 1)
  1625. return err;
  1626. err = sys_shmat (first, uptr, second, &raddr);
  1627. if (err)
  1628. return err;
  1629. err = put_user (raddr, uaddr);
  1630. return err;
  1631. }
  1632. static int
  1633. do_sys32_shmctl (int first, int second, void *uptr)
  1634. {
  1635. int err = -EFAULT, err2;
  1636. struct shmid_ds s;
  1637. struct shmid64_ds s64;
  1638. struct shmid_ds32 *up = (struct shmid_ds32 *)uptr;
  1639. mm_segment_t old_fs;
  1640. struct shm_info32 {
  1641. int used_ids;
  1642. u32 shm_tot, shm_rss, shm_swp;
  1643. u32 swap_attempts, swap_successes;
  1644. } *uip = (struct shm_info32 *)uptr;
  1645. struct shm_info si;
  1646. switch (second) {
  1647. case IPC_INFO:
  1648. case IPC_RMID:
  1649. case SHM_LOCK:
  1650. case SHM_UNLOCK:
  1651. err = sys_shmctl (first, second, (struct shmid_ds *)uptr);
  1652. break;
  1653. case IPC_SET:
  1654. err = get_user (s.shm_perm.uid, &up->shm_perm.uid);
  1655. err |= __get_user (s.shm_perm.gid, &up->shm_perm.gid);
  1656. err |= __get_user (s.shm_perm.mode, &up->shm_perm.mode);
  1657. if (err)
  1658. break;
  1659. old_fs = get_fs ();
  1660. set_fs (KERNEL_DS);
  1661. err = sys_shmctl (first, second, &s);
  1662. set_fs (old_fs);
  1663. break;
  1664. case IPC_STAT:
  1665. case SHM_STAT:
  1666. old_fs = get_fs ();
  1667. set_fs (KERNEL_DS);
  1668. err = sys_shmctl (first, second, (void *) &s64);
  1669. set_fs (old_fs);
  1670. if (err < 0)
  1671. break;
  1672. err2 = put_user (s64.shm_perm.key, &up->shm_perm.key);
  1673. err2 |= __put_user (s64.shm_perm.uid, &up->shm_perm.uid);
  1674. err2 |= __put_user (s64.shm_perm.gid, &up->shm_perm.gid);
  1675. err2 |= __put_user (s64.shm_perm.cuid,
  1676.     &up->shm_perm.cuid);
  1677. err2 |= __put_user (s64.shm_perm.cgid,
  1678.     &up->shm_perm.cgid);
  1679. err2 |= __put_user (s64.shm_perm.mode,
  1680.     &up->shm_perm.mode);
  1681. err2 |= __put_user (s64.shm_perm.seq, &up->shm_perm.seq);
  1682. err2 |= __put_user (s64.shm_atime, &up->shm_atime);
  1683. err2 |= __put_user (s64.shm_dtime, &up->shm_dtime);
  1684. err2 |= __put_user (s64.shm_ctime, &up->shm_ctime);
  1685. err2 |= __put_user (s64.shm_segsz, &up->shm_segsz);
  1686. err2 |= __put_user (s64.shm_nattch, &up->shm_nattch);
  1687. err2 |= __put_user (s64.shm_cpid, &up->shm_cpid);
  1688. err2 |= __put_user (s64.shm_lpid, &up->shm_lpid);
  1689. if (err2)
  1690. err = -EFAULT;
  1691. break;
  1692. case SHM_INFO:
  1693. old_fs = get_fs ();
  1694. set_fs (KERNEL_DS);
  1695. err = sys_shmctl (first, second, (void *)&si);
  1696. set_fs (old_fs);
  1697. if (err < 0)
  1698. break;
  1699. err2 = put_user (si.used_ids, &uip->used_ids);
  1700. err2 |= __put_user (si.shm_tot, &uip->shm_tot);
  1701. err2 |= __put_user (si.shm_rss, &uip->shm_rss);
  1702. err2 |= __put_user (si.shm_swp, &uip->shm_swp);
  1703. err2 |= __put_user (si.swap_attempts,
  1704.     &uip->swap_attempts);
  1705. err2 |= __put_user (si.swap_successes,
  1706.     &uip->swap_successes);
  1707. if (err2)
  1708. err = -EFAULT;
  1709. break;
  1710. }
  1711. return err;
  1712. }
  1713. asmlinkage long
  1714. sys32_ipc (u32 call, int first, int second, int third, u32 ptr, u32 fifth)
  1715. {
  1716. int version, err;
  1717. version = call >> 16; /* hack for backward compatibility */
  1718. call &= 0xffff;
  1719. switch (call) {
  1720. case SEMOP:
  1721. /* struct sembuf is the same on 32 and 64bit :)) */
  1722. err = sys_semop (first, (struct sembuf *)AA(ptr),
  1723.  second);
  1724. break;
  1725. case SEMGET:
  1726. err = sys_semget (first, second, third);
  1727. break;
  1728. case SEMCTL:
  1729. err = do_sys32_semctl (first, second, third,
  1730.        (void *)AA(ptr));
  1731. break;
  1732. case MSGSND:
  1733. err = do_sys32_msgsnd (first, second, third,
  1734.        (void *)AA(ptr));
  1735. break;
  1736. case MSGRCV:
  1737. err = do_sys32_msgrcv (first, second, fifth, third,
  1738.        version, (void *)AA(ptr));
  1739. break;
  1740. case MSGGET:
  1741. err = sys_msgget ((key_t) first, second);
  1742. break;
  1743. case MSGCTL:
  1744. err = do_sys32_msgctl (first, second, (void *)AA(ptr));
  1745. break;
  1746. case SHMAT:
  1747. err = do_sys32_shmat (first, second, third,
  1748.       version, (void *)AA(ptr));
  1749. break;
  1750. case SHMDT:
  1751. err = sys_shmdt ((char *)A(ptr));
  1752. break;
  1753. case SHMGET:
  1754. err = sys_shmget (first, second, third);
  1755. break;
  1756. case SHMCTL:
  1757. err = do_sys32_shmctl (first, second, (void *)AA(ptr));
  1758. break;
  1759. default:
  1760. err = -EINVAL;
  1761. break;
  1762. }
  1763. return err;
  1764. }
  1765. struct sysctl_args32
  1766. {
  1767. __kernel_caddr_t32 name;
  1768. int nlen;
  1769. __kernel_caddr_t32 oldval;
  1770. __kernel_caddr_t32 oldlenp;
  1771. __kernel_caddr_t32 newval;
  1772. __kernel_size_t32 newlen;
  1773. unsigned int __unused[4];
  1774. };
  1775. asmlinkage long sys32_sysctl(struct sysctl_args32 *uargs32)
  1776. {
  1777. struct __sysctl_args kargs;
  1778. struct sysctl_args32 kargs32;
  1779. mm_segment_t old_fs;
  1780. int name[CTL_MAXNAME];
  1781. size_t oldlen[1];
  1782. int err, ret;
  1783. ret = -EFAULT;
  1784. memset(&kargs, 0, sizeof (kargs));
  1785. err = get_user(kargs32.name, &uargs32->name);
  1786. err |= __get_user(kargs32.nlen, &uargs32->nlen);
  1787. err |= __get_user(kargs32.oldval, &uargs32->oldval);
  1788. err |= __get_user(kargs32.oldlenp, &uargs32->oldlenp);
  1789. err |= __get_user(kargs32.newval, &uargs32->newval);
  1790. err |= __get_user(kargs32.newlen, &uargs32->newlen);
  1791. if (err)
  1792. goto out;
  1793. if (kargs32.nlen == 0 || kargs32.nlen >= CTL_MAXNAME) {
  1794. ret = -ENOTDIR;
  1795. goto out;
  1796. }
  1797. kargs.name = name;
  1798. kargs.nlen = kargs32.nlen;
  1799. if (copy_from_user(kargs.name, (int *)A(kargs32.name),
  1800.    kargs32.nlen * sizeof(name) / sizeof(name[0])))
  1801. goto out;
  1802. if (kargs32.oldval) {
  1803. if (!kargs32.oldlenp || get_user(oldlen[0],
  1804.  (int *)A(kargs32.oldlenp)))
  1805. return -EFAULT;
  1806. kargs.oldlenp = oldlen;
  1807. kargs.oldval = kmalloc(oldlen[0], GFP_KERNEL);
  1808. if (!kargs.oldval) {
  1809. ret = -ENOMEM;
  1810. goto out;
  1811. }
  1812. }
  1813. if (kargs32.newval && kargs32.newlen) {
  1814. kargs.newval = kmalloc(kargs32.newlen, GFP_KERNEL);
  1815. if (!kargs.newval) {
  1816. ret = -ENOMEM;
  1817. goto out;
  1818. }
  1819. if (copy_from_user(kargs.newval, (int *)A(kargs32.newval),
  1820.    kargs32.newlen))
  1821. goto out;
  1822. }
  1823. old_fs = get_fs(); set_fs (KERNEL_DS);
  1824. ret = sys_sysctl(&kargs);
  1825. set_fs (old_fs);
  1826. if (ret)
  1827. goto out;
  1828. if (kargs.oldval) {
  1829. if (put_user(oldlen[0], (int *)A(kargs32.oldlenp)) ||
  1830.     copy_to_user((int *)A(kargs32.oldval), kargs.oldval,
  1831.  oldlen[0]))
  1832. ret = -EFAULT;
  1833. }
  1834. out:
  1835. if (kargs.oldval)
  1836. kfree(kargs.oldval);
  1837. if (kargs.newval)
  1838. kfree(kargs.newval);
  1839. return ret;
  1840. }
  1841. asmlinkage long sys32_newuname(struct new_utsname * name)
  1842. {
  1843. int ret = 0;
  1844. down_read(&uts_sem);
  1845. if (copy_to_user(name,&system_utsname,sizeof *name))
  1846. ret = -EFAULT;
  1847. up_read(&uts_sem);
  1848. if (current->personality == PER_LINUX32 && !ret)
  1849. if (copy_to_user(name->machine, "mips", 8))
  1850. ret = -EFAULT;
  1851. return ret;
  1852. }
  1853. extern asmlinkage long sys_personality(unsigned long);
  1854. asmlinkage int sys32_personality(unsigned long personality)
  1855. {
  1856. int ret;
  1857. if (current->personality == PER_LINUX32 && personality == PER_LINUX)
  1858. personality = PER_LINUX32;
  1859. ret = sys_personality(personality);
  1860. if (ret == PER_LINUX32)
  1861. ret = PER_LINUX;
  1862. return ret;
  1863. }
  1864. /* Handle adjtimex compatability. */
  1865. struct timex32 {
  1866. u32 modes;
  1867. s32 offset, freq, maxerror, esterror;
  1868. s32 status, constant, precision, tolerance;
  1869. struct timeval32 time;
  1870. s32 tick;
  1871. s32 ppsfreq, jitter, shift, stabil;
  1872. s32 jitcnt, calcnt, errcnt, stbcnt;
  1873. s32  :32; s32  :32; s32  :32; s32  :32;
  1874. s32  :32; s32  :32; s32  :32; s32  :32;
  1875. s32  :32; s32  :32; s32  :32; s32  :32;
  1876. };
  1877. extern int do_adjtimex(struct timex *);
  1878. asmlinkage int sys32_adjtimex(struct timex32 *utp)
  1879. {
  1880. struct timex txc;
  1881. int ret;
  1882. memset(&txc, 0, sizeof(struct timex));
  1883. if(get_user(txc.modes, &utp->modes) ||
  1884.    __get_user(txc.offset, &utp->offset) ||
  1885.    __get_user(txc.freq, &utp->freq) ||
  1886.    __get_user(txc.maxerror, &utp->maxerror) ||
  1887.    __get_user(txc.esterror, &utp->esterror) ||
  1888.    __get_user(txc.status, &utp->status) ||
  1889.    __get_user(txc.constant, &utp->constant) ||
  1890.    __get_user(txc.precision, &utp->precision) ||
  1891.    __get_user(txc.tolerance, &utp->tolerance) ||
  1892.    __get_user(txc.time.tv_sec, &utp->time.tv_sec) ||
  1893.    __get_user(txc.time.tv_usec, &utp->time.tv_usec) ||
  1894.    __get_user(txc.tick, &utp->tick) ||
  1895.    __get_user(txc.ppsfreq, &utp->ppsfreq) ||
  1896.    __get_user(txc.jitter, &utp->jitter) ||
  1897.    __get_user(txc.shift, &utp->shift) ||
  1898.    __get_user(txc.stabil, &utp->stabil) ||
  1899.    __get_user(txc.jitcnt, &utp->jitcnt) ||
  1900.    __get_user(txc.calcnt, &utp->calcnt) ||
  1901.    __get_user(txc.errcnt, &utp->errcnt) ||
  1902.    __get_user(txc.stbcnt, &utp->stbcnt))
  1903. return -EFAULT;
  1904. ret = do_adjtimex(&txc);
  1905. if(put_user(txc.modes, &utp->modes) ||
  1906.    __put_user(txc.offset, &utp->offset) ||
  1907.    __put_user(txc.freq, &utp->freq) ||
  1908.    __put_user(txc.maxerror, &utp->maxerror) ||
  1909.    __put_user(txc.esterror, &utp->esterror) ||
  1910.    __put_user(txc.status, &utp->status) ||
  1911.    __put_user(txc.constant, &utp->constant) ||
  1912.    __put_user(txc.precision, &utp->precision) ||
  1913.    __put_user(txc.tolerance, &utp->tolerance) ||
  1914.    __put_user(txc.time.tv_sec, &utp->time.tv_sec) ||
  1915.    __put_user(txc.time.tv_usec, &utp->time.tv_usec) ||
  1916.    __put_user(txc.tick, &utp->tick) ||
  1917.    __put_user(txc.ppsfreq, &utp->ppsfreq) ||
  1918.    __put_user(txc.jitter, &utp->jitter) ||
  1919.    __put_user(txc.shift, &utp->shift) ||
  1920.    __put_user(txc.stabil, &utp->stabil) ||
  1921.    __put_user(txc.jitcnt, &utp->jitcnt) ||
  1922.    __put_user(txc.calcnt, &utp->calcnt) ||
  1923.    __put_user(txc.errcnt, &utp->errcnt) ||
  1924.    __put_user(txc.stbcnt, &utp->stbcnt))
  1925. ret = -EFAULT;
  1926. return ret;
  1927. }
  1928. /*
  1929.  *  Declare the 32-bit version of the msghdr
  1930.  */
  1931. struct msghdr32 {
  1932. unsigned int    msg_name; /* Socket name */
  1933. int msg_namelen; /* Length of name */
  1934. unsigned int    msg_iov; /* Data blocks */
  1935. unsigned int msg_iovlen; /* Number of blocks */
  1936. unsigned int    msg_control; /* Per protocol magic (eg BSD file descriptor passing) */
  1937. unsigned int msg_controllen; /* Length of cmsg list */
  1938. unsigned msg_flags;
  1939. };
  1940. static inline int
  1941. shape_msg(struct msghdr *mp, struct msghdr32 *mp32)
  1942. {
  1943. int ret;
  1944. unsigned int i;
  1945. if (!access_ok(VERIFY_READ, mp32, sizeof(*mp32)))
  1946. return(-EFAULT);
  1947. ret = __get_user(i, &mp32->msg_name);
  1948. mp->msg_name = (void *)A(i);
  1949. ret |= __get_user(mp->msg_namelen, &mp32->msg_namelen);
  1950. ret |= __get_user(i, &mp32->msg_iov);
  1951. mp->msg_iov = (struct iovec *)A(i);
  1952. ret |= __get_user(mp->msg_iovlen, &mp32->msg_iovlen);
  1953. ret |= __get_user(i, &mp32->msg_control);
  1954. mp->msg_control = (void *)A(i);
  1955. ret |= __get_user(mp->msg_controllen, &mp32->msg_controllen);
  1956. ret |= __get_user(mp->msg_flags, &mp32->msg_flags);
  1957. return(ret ? -EFAULT : 0);
  1958. }
  1959. /*
  1960.  * Verify & re-shape IA32 iovec. The caller must ensure that the
  1961.  *      iovec is big enough to hold the re-shaped message iovec.
  1962.  *
  1963.  * Save time not doing verify_area. copy_*_user will make this work
  1964.  * in any case.
  1965.  *
  1966.  * Don't need to check the total size for overflow (cf net/core/iovec.c),
  1967.  * 32-bit sizes can't overflow a 64-bit count.
  1968.  */
  1969. static inline int
  1970. verify_iovec32(struct msghdr *m, struct iovec *iov, char *address, int mode)
  1971. {
  1972. int size, err, ct;
  1973. struct iovec32 *iov32;
  1974. if(m->msg_namelen)
  1975. {
  1976. if(mode==VERIFY_READ)
  1977. {
  1978. err=move_addr_to_kernel(m->msg_name, m->msg_namelen, address);
  1979. if(err<0)
  1980. goto out;
  1981. }
  1982. m->msg_name = address;
  1983. } else
  1984. m->msg_name = NULL;
  1985. err = -EFAULT;
  1986. size = m->msg_iovlen * sizeof(struct iovec32);
  1987. if (copy_from_user(iov, m->msg_iov, size))
  1988. goto out;
  1989. m->msg_iov=iov;
  1990. err = 0;
  1991. iov32 = (struct iovec32 *)iov;
  1992. for (ct = m->msg_iovlen; ct-- > 0; ) {
  1993. iov[ct].iov_len = (__kernel_size_t)iov32[ct].iov_len;
  1994. iov[ct].iov_base = (void *) A(iov32[ct].iov_base);
  1995. err += iov[ct].iov_len;
  1996. }
  1997. out:
  1998. return err;
  1999. }
  2000. extern __inline__ void
  2001. sockfd_put(struct socket *sock)
  2002. {
  2003. fput(sock->file);
  2004. }
  2005. /* XXX This really belongs in some header file... -DaveM */
  2006. #define MAX_SOCK_ADDR 128 /* 108 for Unix domain -
  2007.    16 for IP, 16 for IPX,
  2008.    24 for IPv6,
  2009.    about 80 for AX.25 */
  2010. extern struct socket *sockfd_lookup(int fd, int *err);
  2011. /*
  2012.  * BSD sendmsg interface
  2013.  */
  2014. int sys32_sendmsg(int fd, struct msghdr32 *msg, unsigned flags)
  2015. {
  2016. struct socket *sock;
  2017. char address[MAX_SOCK_ADDR];
  2018. struct iovec iovstack[UIO_FASTIOV], *iov = iovstack;
  2019. unsigned char ctl[sizeof(struct cmsghdr) + 20]; /* 20 is size of ipv6_pktinfo */
  2020. unsigned char *ctl_buf = ctl;
  2021. struct msghdr msg_sys;
  2022. int err, ctl_len, iov_size, total_len;
  2023. err = -EFAULT;
  2024. if (shape_msg(&msg_sys, msg))
  2025. goto out;
  2026. sock = sockfd_lookup(fd, &err);
  2027. if (!sock)
  2028. goto out;
  2029. /* do not move before msg_sys is valid */
  2030. err = -EINVAL;
  2031. if (msg_sys.msg_iovlen > UIO_MAXIOV)
  2032. goto out_put;
  2033. /* Check whether to allocate the iovec area*/
  2034. err = -ENOMEM;
  2035. iov_size = msg_sys.msg_iovlen * sizeof(struct iovec32);
  2036. if (msg_sys.msg_iovlen > UIO_FASTIOV) {
  2037. iov = sock_kmalloc(sock->sk, iov_size, GFP_KERNEL);
  2038. if (!iov)
  2039. goto out_put;
  2040. }
  2041. /* This will also move the address data into kernel space */
  2042. err = verify_iovec32(&msg_sys, iov, address, VERIFY_READ);
  2043. if (err < 0)
  2044. goto out_freeiov;
  2045. total_len = err;
  2046. err = -ENOBUFS;
  2047. if (msg_sys.msg_controllen > INT_MAX)
  2048. goto out_freeiov;
  2049. ctl_len = msg_sys.msg_controllen;
  2050. if (ctl_len)
  2051. {
  2052. if (ctl_len > sizeof(ctl))
  2053. {
  2054. err = -ENOBUFS;
  2055. ctl_buf = sock_kmalloc(sock->sk, ctl_len, GFP_KERNEL);
  2056. if (ctl_buf == NULL)
  2057. goto out_freeiov;
  2058. }
  2059. err = -EFAULT;
  2060. if (copy_from_user(ctl_buf, msg_sys.msg_control, ctl_len))
  2061. goto out_freectl;
  2062. msg_sys.msg_control = ctl_buf;
  2063. }
  2064. msg_sys.msg_flags = flags;
  2065. if (sock->file->f_flags & O_NONBLOCK)
  2066. msg_sys.msg_flags |= MSG_DONTWAIT;
  2067. err = sock_sendmsg(sock, &msg_sys, total_len);
  2068. out_freectl:
  2069. if (ctl_buf != ctl)
  2070. sock_kfree_s(sock->sk, ctl_buf, ctl_len);
  2071. out_freeiov:
  2072. if (iov != iovstack)
  2073. sock_kfree_s(sock->sk, iov, iov_size);
  2074. out_put:
  2075. sockfd_put(sock);
  2076. out:
  2077. return err;
  2078. }
  2079. /*
  2080.  * BSD recvmsg interface
  2081.  */
  2082. int
  2083. sys32_recvmsg (int fd, struct msghdr32 *msg, unsigned int flags)
  2084. {
  2085. struct socket *sock;
  2086. struct iovec iovstack[UIO_FASTIOV];
  2087. struct iovec *iov=iovstack;
  2088. struct msghdr msg_sys;
  2089. unsigned long cmsg_ptr;
  2090. int err, iov_size, total_len, len;
  2091. /* kernel mode address */
  2092. char addr[MAX_SOCK_ADDR];
  2093. /* user mode address pointers */
  2094. struct sockaddr *uaddr;
  2095. int *uaddr_len;
  2096. err=-EFAULT;
  2097. if (shape_msg(&msg_sys, msg))
  2098. goto out;
  2099. sock = sockfd_lookup(fd, &err);
  2100. if (!sock)
  2101. goto out;
  2102. err = -EINVAL;
  2103. if (msg_sys.msg_iovlen > UIO_MAXIOV)
  2104. goto out_put;
  2105. /* Check whether to allocate the iovec area*/
  2106. err = -ENOMEM;
  2107. iov_size = msg_sys.msg_iovlen * sizeof(struct iovec);
  2108. if (msg_sys.msg_iovlen > UIO_FASTIOV) {
  2109. iov = sock_kmalloc(sock->sk, iov_size, GFP_KERNEL);
  2110. if (!iov)
  2111. goto out_put;
  2112. }
  2113. /*
  2114.  * Save the user-mode address (verify_iovec will change the
  2115.  * kernel msghdr to use the kernel address space)
  2116.  */
  2117. uaddr = msg_sys.msg_name;
  2118. uaddr_len = &msg->msg_namelen;
  2119. err = verify_iovec32(&msg_sys, iov, addr, VERIFY_WRITE);
  2120. if (err < 0)
  2121. goto out_freeiov;
  2122. total_len=err;
  2123. cmsg_ptr = (unsigned long)msg_sys.msg_control;
  2124. msg_sys.msg_flags = 0;
  2125. if (sock->file->f_flags & O_NONBLOCK)
  2126. flags |= MSG_DONTWAIT;
  2127. err = sock_recvmsg(sock, &msg_sys, total_len, flags);
  2128. if (err < 0)
  2129. goto out_freeiov;
  2130. len = err;
  2131. if (uaddr != NULL) {
  2132. err = move_addr_to_user(addr, msg_sys.msg_namelen, uaddr, uaddr_len);
  2133. if (err < 0)
  2134. goto out_freeiov;
  2135. }
  2136. err = __put_user(msg_sys.msg_flags, &msg->msg_flags);
  2137. if (err)
  2138. goto out_freeiov;
  2139. err = __put_user((unsigned long)msg_sys.msg_control-cmsg_ptr,
  2140.  &msg->msg_controllen);
  2141. if (err)
  2142. goto out_freeiov;
  2143. err = len;
  2144. out_freeiov:
  2145. if (iov != iovstack)
  2146. sock_kfree_s(sock->sk, iov, iov_size);
  2147. out_put:
  2148. sockfd_put(sock);
  2149. out:
  2150. return err;
  2151. }
  2152. asmlinkage ssize_t sys_readahead(int fd, loff_t offset, size_t count);
  2153. asmlinkage ssize_t sys32_readahead(int fd, u32 pad0, u64 a2, u64 a3,
  2154.                                    size_t count)
  2155. {
  2156. return sys_readahead(fd, merge_64(a2, a3), count);
  2157. }
  2158. #ifdef CONFIG_MODULES
  2159. /* From sparc64 */
  2160. struct kernel_sym32 {
  2161.         u32 value;
  2162.         char name[60];
  2163. };
  2164. extern asmlinkage int sys_get_kernel_syms(struct kernel_sym *table);
  2165. asmlinkage int sys32_get_kernel_syms(struct kernel_sym32 *table)
  2166. {
  2167.         int len, i;
  2168.         struct kernel_sym *tbl;
  2169.         mm_segment_t old_fs;
  2170.         len = sys_get_kernel_syms(NULL);
  2171.         if (!table) return len;
  2172.         tbl = kmalloc (len * sizeof (struct kernel_sym), GFP_KERNEL);
  2173.         if (!tbl) return -ENOMEM;
  2174.         old_fs = get_fs();
  2175.         set_fs (KERNEL_DS);
  2176.         sys_get_kernel_syms(tbl);
  2177.         set_fs (old_fs);
  2178.         for (i = 0; i < len; i++, table++) {
  2179.                 if (put_user (tbl[i].value, &table->value) ||
  2180.                     copy_to_user (table->name, tbl[i].name, 60))
  2181.                         break;
  2182.         }
  2183.         kfree (tbl);
  2184.         return i;
  2185. }
  2186. #else
  2187. asmlinkage long
  2188. sys32_get_kernel_syms(struct kernel_sym *table)
  2189. {
  2190. return -ENOSYS;
  2191. }
  2192. #endif