forked from mirrors/linux
		
	fix compat truncate/ftruncate
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
		
							parent
							
								
									561c673197
								
							
						
					
					
						commit
						3f6d078d4a
					
				
					 11 changed files with 29 additions and 35 deletions
				
			
		|  | @ -113,8 +113,8 @@ __SYSCALL(88,  sys_reboot) | ||||||
| __SYSCALL(89,  sys_ni_syscall)			/* 89 was sys_readdir */ | __SYSCALL(89,  sys_ni_syscall)			/* 89 was sys_readdir */ | ||||||
| __SYSCALL(90,  sys_ni_syscall)			/* 90 was sys_mmap */ | __SYSCALL(90,  sys_ni_syscall)			/* 90 was sys_mmap */ | ||||||
| __SYSCALL(91,  sys_munmap) | __SYSCALL(91,  sys_munmap) | ||||||
| __SYSCALL(92,  sys_truncate) | __SYSCALL(92,  compat_sys_truncate) | ||||||
| __SYSCALL(93,  sys_ftruncate) | __SYSCALL(93,  compat_sys_ftruncate) | ||||||
| __SYSCALL(94,  sys_fchmod) | __SYSCALL(94,  sys_fchmod) | ||||||
| __SYSCALL(95,  sys_fchown16) | __SYSCALL(95,  sys_fchown16) | ||||||
| __SYSCALL(96,  sys_getpriority) | __SYSCALL(96,  sys_getpriority) | ||||||
|  |  | ||||||
|  | @ -284,8 +284,8 @@ sys_call_table: | ||||||
| 	PTR	compat_sys_old_readdir | 	PTR	compat_sys_old_readdir | ||||||
| 	PTR	sys_mips_mmap			/* 4090 */ | 	PTR	sys_mips_mmap			/* 4090 */ | ||||||
| 	PTR	sys_munmap | 	PTR	sys_munmap | ||||||
| 	PTR	sys_truncate | 	PTR	compat_sys_truncate | ||||||
| 	PTR	sys_ftruncate | 	PTR	compat_sys_ftruncate | ||||||
| 	PTR	sys_fchmod | 	PTR	sys_fchmod | ||||||
| 	PTR	sys_fchown			/* 4095 */ | 	PTR	sys_fchown			/* 4095 */ | ||||||
| 	PTR	sys_getpriority | 	PTR	sys_getpriority | ||||||
|  |  | ||||||
|  | @ -165,8 +165,8 @@ | ||||||
| 	ENTRY_SAME(mmap2) | 	ENTRY_SAME(mmap2) | ||||||
| 	ENTRY_SAME(mmap)		/* 90 */ | 	ENTRY_SAME(mmap)		/* 90 */ | ||||||
| 	ENTRY_SAME(munmap) | 	ENTRY_SAME(munmap) | ||||||
| 	ENTRY_SAME(truncate) | 	ENTRY_COMP(truncate) | ||||||
| 	ENTRY_SAME(ftruncate) | 	ENTRY_COMP(ftruncate) | ||||||
| 	ENTRY_SAME(fchmod) | 	ENTRY_SAME(fchmod) | ||||||
| 	ENTRY_SAME(fchown)		/* 95 */ | 	ENTRY_SAME(fchown)		/* 95 */ | ||||||
| 	ENTRY_SAME(getpriority) | 	ENTRY_SAME(getpriority) | ||||||
|  |  | ||||||
|  | @ -146,18 +146,6 @@ asmlinkage long compat_sys_sendfile64_wrapper(u32 out_fd, u32 in_fd, | ||||||
| 			    (off_t __user *)offset, count); | 			    (off_t __user *)offset, count); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| long compat_sys_truncate(const char __user * path, u32 length) |  | ||||||
| { |  | ||||||
| 	/* sign extend length */ |  | ||||||
| 	return sys_truncate(path, (int)length); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| long compat_sys_ftruncate(int fd, u32 length) |  | ||||||
| { |  | ||||||
| 	/* sign extend length */ |  | ||||||
| 	return sys_ftruncate(fd, (int)length); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| unsigned long compat_sys_mmap2(unsigned long addr, size_t len, | unsigned long compat_sys_mmap2(unsigned long addr, size_t len, | ||||||
| 			  unsigned long prot, unsigned long flags, | 			  unsigned long prot, unsigned long flags, | ||||||
| 			  unsigned long fd, unsigned long pgoff) | 			  unsigned long fd, unsigned long pgoff) | ||||||
|  |  | ||||||
|  | @ -325,16 +325,6 @@ ENTRY(sys32_munmap_wrapper) | ||||||
| 	llgfr	%r3,%r3			# size_t | 	llgfr	%r3,%r3			# size_t | ||||||
| 	jg	sys_munmap		# branch to system call | 	jg	sys_munmap		# branch to system call | ||||||
| 
 | 
 | ||||||
| ENTRY(sys32_truncate_wrapper) |  | ||||||
| 	llgtr	%r2,%r2			# const char * |  | ||||||
| 	lgfr	%r3,%r3			# long |  | ||||||
| 	jg	sys_truncate		# branch to system call |  | ||||||
| 
 |  | ||||||
| ENTRY(sys32_ftruncate_wrapper) |  | ||||||
| 	llgfr	%r2,%r2			# unsigned int |  | ||||||
| 	llgfr	%r3,%r3			# unsigned long |  | ||||||
| 	jg	sys_ftruncate		# branch to system call |  | ||||||
| 
 |  | ||||||
| ENTRY(sys32_fchmod_wrapper) | ENTRY(sys32_fchmod_wrapper) | ||||||
| 	llgfr	%r2,%r2			# unsigned int | 	llgfr	%r2,%r2			# unsigned int | ||||||
| 	llgfr	%r3,%r3			# mode_t | 	llgfr	%r3,%r3			# mode_t | ||||||
|  |  | ||||||
|  | @ -100,8 +100,8 @@ SYSCALL(sys_reboot,sys_reboot,sys32_reboot_wrapper) | ||||||
| SYSCALL(sys_ni_syscall,sys_ni_syscall,old32_readdir_wrapper)	/* old readdir syscall */ | SYSCALL(sys_ni_syscall,sys_ni_syscall,old32_readdir_wrapper)	/* old readdir syscall */ | ||||||
| SYSCALL(sys_old_mmap,sys_old_mmap,old32_mmap_wrapper)		/* 90 */ | SYSCALL(sys_old_mmap,sys_old_mmap,old32_mmap_wrapper)		/* 90 */ | ||||||
| SYSCALL(sys_munmap,sys_munmap,sys32_munmap_wrapper) | SYSCALL(sys_munmap,sys_munmap,sys32_munmap_wrapper) | ||||||
| SYSCALL(sys_truncate,sys_truncate,sys32_truncate_wrapper) | SYSCALL(sys_truncate,sys_truncate,compat_sys_truncate) | ||||||
| SYSCALL(sys_ftruncate,sys_ftruncate,sys32_ftruncate_wrapper) | SYSCALL(sys_ftruncate,sys_ftruncate,compat_sys_ftruncate) | ||||||
| SYSCALL(sys_fchmod,sys_fchmod,sys32_fchmod_wrapper) | SYSCALL(sys_fchmod,sys_fchmod,sys32_fchmod_wrapper) | ||||||
| SYSCALL(sys_fchown16,sys_ni_syscall,sys32_fchown16_wrapper)	/* 95 old fchown16 syscall*/ | SYSCALL(sys_fchown16,sys_ni_syscall,sys32_fchown16_wrapper)	/* 95 old fchown16 syscall*/ | ||||||
| SYSCALL(sys_getpriority,sys_getpriority,sys32_getpriority_wrapper) | SYSCALL(sys_getpriority,sys_getpriority,sys32_getpriority_wrapper) | ||||||
|  |  | ||||||
|  | @ -52,7 +52,6 @@ SIGN1(sys32_recvmsg, compat_sys_recvmsg, %o0) | ||||||
| SIGN1(sys32_sendmsg, compat_sys_sendmsg, %o0) | SIGN1(sys32_sendmsg, compat_sys_sendmsg, %o0) | ||||||
| SIGN2(sys32_sync_file_range, compat_sync_file_range, %o0, %o5) | SIGN2(sys32_sync_file_range, compat_sync_file_range, %o0, %o5) | ||||||
| SIGN1(sys32_vmsplice, compat_sys_vmsplice, %o0) | SIGN1(sys32_vmsplice, compat_sys_vmsplice, %o0) | ||||||
| SIGN1(sys32_truncate, sys_truncate, %o1) |  | ||||||
| 
 | 
 | ||||||
| 	.globl		sys32_mmap2
 | 	.globl		sys32_mmap2
 | ||||||
| sys32_mmap2: | sys32_mmap2: | ||||||
|  |  | ||||||
|  | @ -43,8 +43,8 @@ sys_call_table32: | ||||||
| /*110*/	.word sys_setresgid, sys_getresgid, sys_setregid, sys_nis_syscall, sys_nis_syscall | /*110*/	.word sys_setresgid, sys_getresgid, sys_setregid, sys_nis_syscall, sys_nis_syscall | ||||||
| 	.word sys_getgroups, compat_sys_gettimeofday, sys32_getrusage, sys_nis_syscall, sys_getcwd | 	.word sys_getgroups, compat_sys_gettimeofday, sys32_getrusage, sys_nis_syscall, sys_getcwd | ||||||
| /*120*/	.word compat_sys_readv, compat_sys_writev, compat_sys_settimeofday, sys_fchown16, sys_fchmod | /*120*/	.word compat_sys_readv, compat_sys_writev, compat_sys_settimeofday, sys_fchown16, sys_fchmod | ||||||
| 	.word sys_nis_syscall, sys_setreuid16, sys_setregid16, sys_rename, sys32_truncate | 	.word sys_nis_syscall, sys_setreuid16, sys_setregid16, sys_rename, compat_sys_truncate | ||||||
| /*130*/	.word sys_ftruncate, sys_flock, compat_sys_lstat64, sys_nis_syscall, sys_nis_syscall | /*130*/	.word compat_sys_ftruncate, sys_flock, compat_sys_lstat64, sys_nis_syscall, sys_nis_syscall | ||||||
| 	.word sys_nis_syscall, sys_mkdir, sys_rmdir, compat_sys_utimes, compat_sys_stat64 | 	.word sys_nis_syscall, sys_mkdir, sys_rmdir, compat_sys_utimes, compat_sys_stat64 | ||||||
| /*140*/	.word sys_sendfile64, sys_nis_syscall, sys32_futex, sys_gettid, compat_sys_getrlimit | /*140*/	.word sys_sendfile64, sys_nis_syscall, sys32_futex, sys_gettid, compat_sys_getrlimit | ||||||
| 	.word compat_sys_setrlimit, sys_pivot_root, sys_prctl, sys_pciconfig_read, sys_pciconfig_write | 	.word compat_sys_setrlimit, sys_pivot_root, sys_prctl, sys_pciconfig_read, sys_pciconfig_write | ||||||
|  |  | ||||||
|  | @ -98,8 +98,8 @@ | ||||||
| 89	i386	readdir			sys_old_readdir			compat_sys_old_readdir | 89	i386	readdir			sys_old_readdir			compat_sys_old_readdir | ||||||
| 90	i386	mmap			sys_old_mmap			sys32_mmap | 90	i386	mmap			sys_old_mmap			sys32_mmap | ||||||
| 91	i386	munmap			sys_munmap | 91	i386	munmap			sys_munmap | ||||||
| 92	i386	truncate		sys_truncate | 92	i386	truncate		sys_truncate			compat_sys_truncate | ||||||
| 93	i386	ftruncate		sys_ftruncate | 93	i386	ftruncate		sys_ftruncate			compat_sys_ftruncate | ||||||
| 94	i386	fchmod			sys_fchmod | 94	i386	fchmod			sys_fchmod | ||||||
| 95	i386	fchown			sys_fchown16 | 95	i386	fchown			sys_fchown16 | ||||||
| 96	i386	getpriority		sys_getpriority | 96	i386	getpriority		sys_getpriority | ||||||
|  |  | ||||||
							
								
								
									
										15
									
								
								fs/open.c
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								fs/open.c
									
									
									
									
									
								
							|  | @ -30,6 +30,7 @@ | ||||||
| #include <linux/fs_struct.h> | #include <linux/fs_struct.h> | ||||||
| #include <linux/ima.h> | #include <linux/ima.h> | ||||||
| #include <linux/dnotify.h> | #include <linux/dnotify.h> | ||||||
|  | #include <linux/compat.h> | ||||||
| 
 | 
 | ||||||
| #include "internal.h" | #include "internal.h" | ||||||
| 
 | 
 | ||||||
|  | @ -140,6 +141,13 @@ SYSCALL_DEFINE2(truncate, const char __user *, path, long, length) | ||||||
| 	return do_sys_truncate(path, length); | 	return do_sys_truncate(path, length); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | #ifdef CONFIG_COMPAT | ||||||
|  | COMPAT_SYSCALL_DEFINE2(truncate, const char __user *, path, compat_off_t, length) | ||||||
|  | { | ||||||
|  | 	return do_sys_truncate(path, length); | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| static long do_sys_ftruncate(unsigned int fd, loff_t length, int small) | static long do_sys_ftruncate(unsigned int fd, loff_t length, int small) | ||||||
| { | { | ||||||
| 	struct inode *inode; | 	struct inode *inode; | ||||||
|  | @ -195,6 +203,13 @@ SYSCALL_DEFINE2(ftruncate, unsigned int, fd, unsigned long, length) | ||||||
| 	return ret; | 	return ret; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | #ifdef CONFIG_COMPAT | ||||||
|  | COMPAT_SYSCALL_DEFINE2(ftruncate, unsigned int, fd, compat_ulong_t, length) | ||||||
|  | { | ||||||
|  | 	return do_sys_ftruncate(fd, length, 1); | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| /* LFS versions of truncate are only needed on 32 bit machines */ | /* LFS versions of truncate are only needed on 32 bit machines */ | ||||||
| #if BITS_PER_LONG == 32 | #if BITS_PER_LONG == 32 | ||||||
| SYSCALL_DEFINE(truncate64)(const char __user * path, loff_t length) | SYSCALL_DEFINE(truncate64)(const char __user * path, loff_t length) | ||||||
|  |  | ||||||
|  | @ -536,6 +536,8 @@ asmlinkage long compat_sys_openat(int dfd, const char __user *filename, | ||||||
| asmlinkage long compat_sys_open_by_handle_at(int mountdirfd, | asmlinkage long compat_sys_open_by_handle_at(int mountdirfd, | ||||||
| 					     struct file_handle __user *handle, | 					     struct file_handle __user *handle, | ||||||
| 					     int flags); | 					     int flags); | ||||||
|  | asmlinkage long compat_sys_truncate(const char __user *, compat_off_t); | ||||||
|  | asmlinkage long compat_sys_ftruncate(unsigned int, compat_ulong_t); | ||||||
| asmlinkage long compat_sys_pselect6(int n, compat_ulong_t __user *inp, | asmlinkage long compat_sys_pselect6(int n, compat_ulong_t __user *inp, | ||||||
| 				    compat_ulong_t __user *outp, | 				    compat_ulong_t __user *outp, | ||||||
| 				    compat_ulong_t __user *exp, | 				    compat_ulong_t __user *exp, | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Al Viro
						Al Viro