projects
/
deliverable
/
linux.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
[IPIP]: Use proper net in (mostly) routing calls.
[deliverable/linux.git]
/
fs
/
splice.c
diff --git
a/fs/splice.c
b/fs/splice.c
index 4ee49e86edde5a2272781b6e49e0371b721ceb33..0670c915cd35c5e8b653494d4d5b1efe76867e2e 100644
(file)
--- a/
fs/splice.c
+++ b/
fs/splice.c
@@
-1179,6
+1179,9
@@
static int copy_from_user_mmap_sem(void *dst, const void __user *src, size_t n)
{
int partial;
{
int partial;
+ if (!access_ok(VERIFY_READ, src, n))
+ return -EFAULT;
+
pagefault_disable();
partial = __copy_from_user_inatomic(dst, src, n);
pagefault_enable();
pagefault_disable();
partial = __copy_from_user_inatomic(dst, src, n);
pagefault_enable();
@@
-1231,7
+1234,7
@@
static int get_iovec_page_array(const struct iovec __user *iov,
if (unlikely(!len))
break;
error = -EFAULT;
if (unlikely(!len))
break;
error = -EFAULT;
- if (
unlikely(!base
))
+ if (
!access_ok(VERIFY_READ, base, len
))
break;
/*
break;
/*
@@
-1387,6
+1390,11
@@
static long vmsplice_to_user(struct file *file, const struct iovec __user *iov,
break;
}
break;
}
+ if (unlikely(!access_ok(VERIFY_WRITE, base, len))) {
+ error = -EFAULT;
+ break;
+ }
+
sd.len = 0;
sd.total_len = len;
sd.flags = flags;
sd.len = 0;
sd.total_len = len;
sd.flags = flags;
@@
-1661,6
+1669,13
@@
static int link_pipe(struct pipe_inode_info *ipipe,
i++;
} while (len);
i++;
} while (len);
+ /*
+ * return EAGAIN if we have the potential of some data in the
+ * future, otherwise just return 0
+ */
+ if (!ret && ipipe->waiting_writers && (flags & SPLICE_F_NONBLOCK))
+ ret = -EAGAIN;
+
inode_double_unlock(ipipe->inode, opipe->inode);
/*
inode_double_unlock(ipipe->inode, opipe->inode);
/*
@@
-1701,11
+1716,8
@@
static long do_tee(struct file *in, struct file *out, size_t len,
ret = link_ipipe_prep(ipipe, flags);
if (!ret) {
ret = link_opipe_prep(opipe, flags);
ret = link_ipipe_prep(ipipe, flags);
if (!ret) {
ret = link_opipe_prep(opipe, flags);
- if (!ret)
{
+ if (!ret)
ret = link_pipe(ipipe, opipe, len, flags);
ret = link_pipe(ipipe, opipe, len, flags);
- if (!ret && (flags & SPLICE_F_NONBLOCK))
- ret = -EAGAIN;
- }
}
}
}
}
This page took
0.025849 seconds
and
5
git commands to generate.