Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 220950
b: refs/heads/master
c: 8acfe46
h: refs/heads/master
v: v3
  • Loading branch information
David S. Miller committed Oct 28, 2010
1 parent fa2ab4c commit 2dbbe35
Show file tree
Hide file tree
Showing 4 changed files with 17 additions and 17 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 349f6c5c5d827db909a69e5b9e844e8623c8e881
refs/heads/master: 8acfe468b0384e834a303f08ebc4953d72fb690a
2 changes: 1 addition & 1 deletion trunk/include/linux/socket.h
Original file line number Diff line number Diff line change
Expand Up @@ -322,7 +322,7 @@ extern int csum_partial_copy_fromiovecend(unsigned char *kdata,
int offset,
unsigned int len, __wsum *csump);

extern long verify_iovec(struct msghdr *m, struct iovec *iov, struct sockaddr *address, int mode);
extern int verify_iovec(struct msghdr *m, struct iovec *iov, struct sockaddr *address, int mode);
extern int memcpy_toiovec(struct iovec *v, unsigned char *kdata, int len);
extern int memcpy_toiovecend(const struct iovec *v, unsigned char *kdata,
int offset, int len);
Expand Down
10 changes: 6 additions & 4 deletions trunk/net/compat.c
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,12 @@ static inline int iov_from_user_compat_to_kern(struct iovec *kiov,
compat_size_t len;

if (get_user(len, &uiov32->iov_len) ||
get_user(buf, &uiov32->iov_base)) {
tot_len = -EFAULT;
break;
}
get_user(buf, &uiov32->iov_base))
return -EFAULT;

if (len > INT_MAX - tot_len)
len = INT_MAX - tot_len;

tot_len += len;
kiov->iov_base = compat_ptr(buf);
kiov->iov_len = (__kernel_size_t) len;
Expand Down
20 changes: 9 additions & 11 deletions trunk/net/core/iovec.c
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,9 @@
* in any case.
*/

long verify_iovec(struct msghdr *m, struct iovec *iov, struct sockaddr *address, int mode)
int verify_iovec(struct msghdr *m, struct iovec *iov, struct sockaddr *address, int mode)
{
int size, ct;
long err;
int size, ct, err;

if (m->msg_namelen) {
if (mode == VERIFY_READ) {
Expand All @@ -62,14 +61,13 @@ long verify_iovec(struct msghdr *m, struct iovec *iov, struct sockaddr *address,
err = 0;

for (ct = 0; ct < m->msg_iovlen; ct++) {
err += iov[ct].iov_len;
/*
* Goal is not to verify user data, but to prevent returning
* negative value, which is interpreted as errno.
* Overflow is still possible, but it is harmless.
*/
if (err < 0)
return -EMSGSIZE;
size_t len = iov[ct].iov_len;

if (len > INT_MAX - err) {
len = INT_MAX - err;
iov[ct].iov_len = len;
}
err += len;
}

return err;
Expand Down

0 comments on commit 2dbbe35

Please sign in to comment.