lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [day] [month] [year] [list]
Date:	Thu, 4 Apr 2013 16:41:26 +1100
From:	Stephen Rothwell <sfr@...b.auug.org.au>
To:	Al Viro <viro@...IV.linux.org.uk>
Cc:	linux-next@...r.kernel.org, linux-kernel@...r.kernel.org
Subject: linux-next: manual merge of the signal tree with the vfs tree

Hi Al,

Today's linux-next merge of the signal tree got conflicts in
fs/read_write.c and fs/read_write.h between commit 1fd193fd030a ("switch
compat readv/writev variants to COMPAT_SYSCALL_DEFINE") from the vfs tree
and commit 19f4fc3aee18 ("convert sendfile{,64} to
COMPAT_SYSCALL_DEFINE") from the signal tree.

I fixed it up (see below) and can carry the fix as necessary (no action
is required).

-- 
Cheers,
Stephen Rothwell                    sfr@...b.auug.org.au

diff --cc fs/read_write.c
index e7d7bde,f738e4d..0000000
--- a/fs/read_write.c
+++ b/fs/read_write.c
@@@ -903,203 -853,8 +887,203 @@@ SYSCALL_DEFINE5(pwritev, unsigned long
  	return ret;
  }
  
 +#ifdef CONFIG_COMPAT
 +
 +static ssize_t compat_do_readv_writev(int type, struct file *file,
 +			       const struct compat_iovec __user *uvector,
 +			       unsigned long nr_segs, loff_t *pos)
 +{
 +	compat_ssize_t tot_len;
 +	struct iovec iovstack[UIO_FASTIOV];
 +	struct iovec *iov = iovstack;
 +	ssize_t ret;
 +	io_fn_t fn;
 +	iov_fn_t fnv;
 +
 +	ret = -EINVAL;
 +	if (!file->f_op)
 +		goto out;
 +
 +	ret = -EFAULT;
 +	if (!access_ok(VERIFY_READ, uvector, nr_segs*sizeof(*uvector)))
 +		goto out;
 +
 +	ret = compat_rw_copy_check_uvector(type, uvector, nr_segs,
 +					       UIO_FASTIOV, iovstack, &iov);
 +	if (ret <= 0)
 +		goto out;
 +
 +	tot_len = ret;
 +	ret = rw_verify_area(type, file, pos, tot_len);
 +	if (ret < 0)
 +		goto out;
 +
 +	fnv = NULL;
 +	if (type == READ) {
 +		fn = file->f_op->read;
 +		fnv = file->f_op->aio_read;
 +	} else {
 +		fn = (io_fn_t)file->f_op->write;
 +		fnv = file->f_op->aio_write;
 +		file_start_write(file);
 +	}
 +
 +	if (fnv)
 +		ret = do_sync_readv_writev(file, iov, nr_segs, tot_len,
 +						pos, fnv);
 +	else
 +		ret = do_loop_readv_writev(file, iov, nr_segs, pos, fn);
 +
 +	if (type != READ)
 +		file_end_write(file);
 +
 +out:
 +	if (iov != iovstack)
 +		kfree(iov);
 +	if ((ret + (type == READ)) > 0) {
 +		if (type == READ)
 +			fsnotify_access(file);
 +		else
 +			fsnotify_modify(file);
 +	}
 +	return ret;
 +}
 +
 +static size_t compat_readv(struct file *file,
 +			   const struct compat_iovec __user *vec,
 +			   unsigned long vlen, loff_t *pos)
 +{
 +	ssize_t ret = -EBADF;
 +
 +	if (!(file->f_mode & FMODE_READ))
 +		goto out;
 +
 +	ret = -EINVAL;
 +	if (!file->f_op || (!file->f_op->aio_read && !file->f_op->read))
 +		goto out;
 +
 +	ret = compat_do_readv_writev(READ, file, vec, vlen, pos);
 +
 +out:
 +	if (ret > 0)
 +		add_rchar(current, ret);
 +	inc_syscr(current);
 +	return ret;
 +}
 +
 +COMPAT_SYSCALL_DEFINE3(readv, unsigned long, fd,
 +		const struct compat_iovec __user *,vec,
 +		unsigned long, vlen)
 +{
 +	struct fd f = fdget(fd);
 +	ssize_t ret;
 +	loff_t pos;
 +
 +	if (!f.file)
 +		return -EBADF;
 +	pos = f.file->f_pos;
 +	ret = compat_readv(f.file, vec, vlen, &pos);
 +	f.file->f_pos = pos;
 +	fdput(f);
 +	return ret;
 +}
 +
 +COMPAT_SYSCALL_DEFINE4(preadv64, unsigned long, fd,
 +		const struct compat_iovec __user *,vec,
 +		unsigned long, vlen, loff_t, pos)
 +{
 +	struct fd f;
 +	ssize_t ret;
 +
 +	if (pos < 0)
 +		return -EINVAL;
 +	f = fdget(fd);
 +	if (!f.file)
 +		return -EBADF;
 +	ret = -ESPIPE;
 +	if (f.file->f_mode & FMODE_PREAD)
 +		ret = compat_readv(f.file, vec, vlen, &pos);
 +	fdput(f);
 +	return ret;
 +}
 +
 +COMPAT_SYSCALL_DEFINE5(preadv, unsigned long, fd,
 +		const struct compat_iovec __user *,vec,
 +		unsigned long, vlen, u32, pos_low, u32, pos_high)
 +{
 +	loff_t pos = ((loff_t)pos_high << 32) | pos_low;
 +	return compat_sys_preadv64(fd, vec, vlen, pos);
 +}
 +
 +static size_t compat_writev(struct file *file,
 +			    const struct compat_iovec __user *vec,
 +			    unsigned long vlen, loff_t *pos)
 +{
 +	ssize_t ret = -EBADF;
 +
 +	if (!(file->f_mode & FMODE_WRITE))
 +		goto out;
 +
 +	ret = -EINVAL;
 +	if (!file->f_op || (!file->f_op->aio_write && !file->f_op->write))
 +		goto out;
 +
 +	ret = compat_do_readv_writev(WRITE, file, vec, vlen, pos);
 +
 +out:
 +	if (ret > 0)
 +		add_wchar(current, ret);
 +	inc_syscw(current);
 +	return ret;
 +}
 +
 +COMPAT_SYSCALL_DEFINE3(writev, unsigned long, fd,
 +		const struct compat_iovec __user *, vec,
 +		unsigned long, vlen)
 +{
 +	struct fd f = fdget(fd);
 +	ssize_t ret;
 +	loff_t pos;
 +
 +	if (!f.file)
 +		return -EBADF;
 +	pos = f.file->f_pos;
 +	ret = compat_writev(f.file, vec, vlen, &pos);
 +	f.file->f_pos = pos;
 +	fdput(f);
 +	return ret;
 +}
 +
 +COMPAT_SYSCALL_DEFINE4(pwritev64, unsigned long, fd,
 +		const struct compat_iovec __user *,vec,
 +		unsigned long, vlen, loff_t, pos)
 +{
 +	struct fd f;
 +	ssize_t ret;
 +
 +	if (pos < 0)
 +		return -EINVAL;
 +	f = fdget(fd);
 +	if (!f.file)
 +		return -EBADF;
 +	ret = -ESPIPE;
 +	if (f.file->f_mode & FMODE_PWRITE)
 +		ret = compat_writev(f.file, vec, vlen, &pos);
 +	fdput(f);
 +	return ret;
 +}
 +
 +COMPAT_SYSCALL_DEFINE5(pwritev, unsigned long, fd,
 +		const struct compat_iovec __user *,vec,
 +		unsigned long, vlen, u32, pos_low, u32, pos_high)
 +{
 +	loff_t pos = ((loff_t)pos_high << 32) | pos_low;
 +	return compat_sys_pwritev64(fd, vec, vlen, pos);
 +}
 +#endif
 +
- ssize_t do_sendfile(int out_fd, int in_fd, loff_t *ppos, size_t count,
- 		    loff_t max)
+ static ssize_t do_sendfile(int out_fd, int in_fd, loff_t *ppos,
+ 		  	   size_t count, loff_t max)
  {
  	struct fd in, out;
  	struct inode *in_inode, *out_inode;
diff --cc fs/read_write.h
index b987806,d07b954..0000000
--- a/fs/read_write.h
+++ b/fs/read_write.h
@@@ -8,5 -8,7 +8,3 @@@ typedef ssize_t (*io_fn_t)(struct file 
  typedef ssize_t (*iov_fn_t)(struct kiocb *, const struct iovec *,
  		unsigned long, loff_t);
  
- ssize_t do_sendfile(int out_fd, int in_fd, loff_t *ppos, size_t count,
- 		    loff_t max);
 -ssize_t do_sync_readv_writev(struct file *filp, const struct iovec *iov,
 -		unsigned long nr_segs, size_t len, loff_t *ppos, iov_fn_t fn);
 -ssize_t do_loop_readv_writev(struct file *filp, struct iovec *iov,
 -		unsigned long nr_segs, loff_t *ppos, io_fn_t fn);

Content of type "application/pgp-signature" skipped

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ