diff options
Diffstat (limited to 'fs/compat.c')
-rw-r--r-- | fs/compat.c | 48 |
1 files changed, 16 insertions, 32 deletions
diff --git a/fs/compat.c b/fs/compat.c index 94502dab972a..d576b552e8e2 100644 --- a/fs/compat.c +++ b/fs/compat.c | |||
@@ -100,13 +100,6 @@ asmlinkage long compat_sys_utimensat(unsigned int dfd, char __user *filename, st | |||
100 | get_compat_timespec(&tv[1], &t[1])) | 100 | get_compat_timespec(&tv[1], &t[1])) |
101 | return -EFAULT; | 101 | return -EFAULT; |
102 | 102 | ||
103 | if ((tv[0].tv_nsec == UTIME_OMIT || tv[0].tv_nsec == UTIME_NOW) | ||
104 | && tv[0].tv_sec != 0) | ||
105 | return -EINVAL; | ||
106 | if ((tv[1].tv_nsec == UTIME_OMIT || tv[1].tv_nsec == UTIME_NOW) | ||
107 | && tv[1].tv_sec != 0) | ||
108 | return -EINVAL; | ||
109 | |||
110 | if (tv[0].tv_nsec == UTIME_OMIT && tv[1].tv_nsec == UTIME_OMIT) | 103 | if (tv[0].tv_nsec == UTIME_OMIT && tv[1].tv_nsec == UTIME_OMIT) |
111 | return 0; | 104 | return 0; |
112 | } | 105 | } |
@@ -775,13 +768,13 @@ asmlinkage long compat_sys_mount(char __user * dev_name, char __user * dir_name, | |||
775 | char __user * type, unsigned long flags, | 768 | char __user * type, unsigned long flags, |
776 | void __user * data) | 769 | void __user * data) |
777 | { | 770 | { |
778 | unsigned long type_page; | 771 | char *kernel_type; |
779 | unsigned long data_page; | 772 | unsigned long data_page; |
780 | unsigned long dev_page; | 773 | char *kernel_dev; |
781 | char *dir_page; | 774 | char *dir_page; |
782 | int retval; | 775 | int retval; |
783 | 776 | ||
784 | retval = copy_mount_options (type, &type_page); | 777 | retval = copy_mount_string(type, &kernel_type); |
785 | if (retval < 0) | 778 | if (retval < 0) |
786 | goto out; | 779 | goto out; |
787 | 780 | ||
@@ -790,38 +783,38 @@ asmlinkage long compat_sys_mount(char __user * dev_name, char __user * dir_name, | |||
790 | if (IS_ERR(dir_page)) | 783 | if (IS_ERR(dir_page)) |
791 | goto out1; | 784 | goto out1; |
792 | 785 | ||
793 | retval = copy_mount_options (dev_name, &dev_page); | 786 | retval = copy_mount_string(dev_name, &kernel_dev); |
794 | if (retval < 0) | 787 | if (retval < 0) |
795 | goto out2; | 788 | goto out2; |
796 | 789 | ||
797 | retval = copy_mount_options (data, &data_page); | 790 | retval = copy_mount_options(data, &data_page); |
798 | if (retval < 0) | 791 | if (retval < 0) |
799 | goto out3; | 792 | goto out3; |
800 | 793 | ||
801 | retval = -EINVAL; | 794 | retval = -EINVAL; |
802 | 795 | ||
803 | if (type_page && data_page) { | 796 | if (kernel_type && data_page) { |
804 | if (!strcmp((char *)type_page, SMBFS_NAME)) { | 797 | if (!strcmp(kernel_type, SMBFS_NAME)) { |
805 | do_smb_super_data_conv((void *)data_page); | 798 | do_smb_super_data_conv((void *)data_page); |
806 | } else if (!strcmp((char *)type_page, NCPFS_NAME)) { | 799 | } else if (!strcmp(kernel_type, NCPFS_NAME)) { |
807 | do_ncp_super_data_conv((void *)data_page); | 800 | do_ncp_super_data_conv((void *)data_page); |
808 | } else if (!strcmp((char *)type_page, NFS4_NAME)) { | 801 | } else if (!strcmp(kernel_type, NFS4_NAME)) { |
809 | if (do_nfs4_super_data_conv((void *) data_page)) | 802 | if (do_nfs4_super_data_conv((void *) data_page)) |
810 | goto out4; | 803 | goto out4; |
811 | } | 804 | } |
812 | } | 805 | } |
813 | 806 | ||
814 | retval = do_mount((char*)dev_page, dir_page, (char*)type_page, | 807 | retval = do_mount(kernel_dev, dir_page, kernel_type, |
815 | flags, (void*)data_page); | 808 | flags, (void*)data_page); |
816 | 809 | ||
817 | out4: | 810 | out4: |
818 | free_page(data_page); | 811 | free_page(data_page); |
819 | out3: | 812 | out3: |
820 | free_page(dev_page); | 813 | kfree(kernel_dev); |
821 | out2: | 814 | out2: |
822 | putname(dir_page); | 815 | putname(dir_page); |
823 | out1: | 816 | out1: |
824 | free_page(type_page); | 817 | kfree(kernel_type); |
825 | out: | 818 | out: |
826 | return retval; | 819 | return retval; |
827 | } | 820 | } |
@@ -1485,20 +1478,15 @@ int compat_do_execve(char * filename, | |||
1485 | if (!bprm) | 1478 | if (!bprm) |
1486 | goto out_files; | 1479 | goto out_files; |
1487 | 1480 | ||
1488 | retval = -ERESTARTNOINTR; | 1481 | retval = prepare_bprm_creds(bprm); |
1489 | if (mutex_lock_interruptible(¤t->cred_guard_mutex)) | 1482 | if (retval) |
1490 | goto out_free; | 1483 | goto out_free; |
1491 | current->in_execve = 1; | ||
1492 | |||
1493 | retval = -ENOMEM; | ||
1494 | bprm->cred = prepare_exec_creds(); | ||
1495 | if (!bprm->cred) | ||
1496 | goto out_unlock; | ||
1497 | 1484 | ||
1498 | retval = check_unsafe_exec(bprm); | 1485 | retval = check_unsafe_exec(bprm); |
1499 | if (retval < 0) | 1486 | if (retval < 0) |
1500 | goto out_unlock; | 1487 | goto out_free; |
1501 | clear_in_exec = retval; | 1488 | clear_in_exec = retval; |
1489 | current->in_execve = 1; | ||
1502 | 1490 | ||
1503 | file = open_exec(filename); | 1491 | file = open_exec(filename); |
1504 | retval = PTR_ERR(file); | 1492 | retval = PTR_ERR(file); |
@@ -1547,7 +1535,6 @@ int compat_do_execve(char * filename, | |||
1547 | /* execve succeeded */ | 1535 | /* execve succeeded */ |
1548 | current->fs->in_exec = 0; | 1536 | current->fs->in_exec = 0; |
1549 | current->in_execve = 0; | 1537 | current->in_execve = 0; |
1550 | mutex_unlock(¤t->cred_guard_mutex); | ||
1551 | acct_update_integrals(current); | 1538 | acct_update_integrals(current); |
1552 | free_bprm(bprm); | 1539 | free_bprm(bprm); |
1553 | if (displaced) | 1540 | if (displaced) |
@@ -1567,10 +1554,7 @@ out_file: | |||
1567 | out_unmark: | 1554 | out_unmark: |
1568 | if (clear_in_exec) | 1555 | if (clear_in_exec) |
1569 | current->fs->in_exec = 0; | 1556 | current->fs->in_exec = 0; |
1570 | |||
1571 | out_unlock: | ||
1572 | current->in_execve = 0; | 1557 | current->in_execve = 0; |
1573 | mutex_unlock(¤t->cred_guard_mutex); | ||
1574 | 1558 | ||
1575 | out_free: | 1559 | out_free: |
1576 | free_bprm(bprm); | 1560 | free_bprm(bprm); |