aboutsummaryrefslogtreecommitdiffstats
path: root/fs/compat.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/compat.c')
-rw-r--r--fs/compat.c48
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(&current->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(&current->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:
1567out_unmark: 1554out_unmark:
1568 if (clear_in_exec) 1555 if (clear_in_exec)
1569 current->fs->in_exec = 0; 1556 current->fs->in_exec = 0;
1570
1571out_unlock:
1572 current->in_execve = 0; 1557 current->in_execve = 0;
1573 mutex_unlock(&current->cred_guard_mutex);
1574 1558
1575out_free: 1559out_free:
1576 free_bprm(bprm); 1560 free_bprm(bprm);