diff options
| author | David S. Miller <davem@davemloft.net> | 2013-10-18 13:22:19 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2013-10-18 13:22:19 -0400 |
| commit | ace0d5d8bf8a69866e4394ca2e4c5d1296ef7db2 (patch) | |
| tree | d12bae2180f77b4dc48580bf5a85b995f1f4909c /net/tipc/msg.c | |
| parent | 7cc7c5e54b7128195a1403747a63971c3c3f8e25 (diff) | |
| parent | bbfbe47cc99ce093708aaf28b7f2c08d28045c67 (diff) | |
Merge branch 'tipc'
Jon Maloy says:
====================
Some small and relatively straightforward patches. With exception of
the two first ones they are all unrelated and address minor issues.
v2: update of v1 (http://patchwork.ozlabs.org/patch/277404/)
-added commit to use memcpy_fromiovec on user data as per v1 feedback
-updated sparse fix commit to drop chunks covered by above commit
-added new commit that greatly simplifies the link lookup routine
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/tipc/msg.c')
| -rw-r--r-- | net/tipc/msg.c | 27 |
1 files changed, 11 insertions, 16 deletions
diff --git a/net/tipc/msg.c b/net/tipc/msg.c index ced60e2fc4f7..e525f8ce1dee 100644 --- a/net/tipc/msg.c +++ b/net/tipc/msg.c | |||
| @@ -73,13 +73,13 @@ void tipc_msg_init(struct tipc_msg *m, u32 user, u32 type, u32 hsize, | |||
| 73 | * Returns message data size or errno | 73 | * Returns message data size or errno |
| 74 | */ | 74 | */ |
| 75 | int tipc_msg_build(struct tipc_msg *hdr, struct iovec const *msg_sect, | 75 | int tipc_msg_build(struct tipc_msg *hdr, struct iovec const *msg_sect, |
| 76 | u32 num_sect, unsigned int total_len, int max_size, | 76 | unsigned int len, int max_size, struct sk_buff **buf) |
| 77 | struct sk_buff **buf) | ||
| 78 | { | 77 | { |
| 79 | int dsz, sz, hsz, pos, res, cnt; | 78 | int dsz, sz, hsz; |
| 79 | unsigned char *to; | ||
| 80 | 80 | ||
| 81 | dsz = total_len; | 81 | dsz = len; |
| 82 | pos = hsz = msg_hdr_sz(hdr); | 82 | hsz = msg_hdr_sz(hdr); |
| 83 | sz = hsz + dsz; | 83 | sz = hsz + dsz; |
| 84 | msg_set_size(hdr, sz); | 84 | msg_set_size(hdr, sz); |
| 85 | if (unlikely(sz > max_size)) { | 85 | if (unlikely(sz > max_size)) { |
| @@ -91,16 +91,11 @@ int tipc_msg_build(struct tipc_msg *hdr, struct iovec const *msg_sect, | |||
| 91 | if (!(*buf)) | 91 | if (!(*buf)) |
| 92 | return -ENOMEM; | 92 | return -ENOMEM; |
| 93 | skb_copy_to_linear_data(*buf, hdr, hsz); | 93 | skb_copy_to_linear_data(*buf, hdr, hsz); |
| 94 | for (res = 1, cnt = 0; res && (cnt < num_sect); cnt++) { | 94 | to = (*buf)->data + hsz; |
| 95 | skb_copy_to_linear_data_offset(*buf, pos, | 95 | if (len && memcpy_fromiovecend(to, msg_sect, 0, dsz)) { |
| 96 | msg_sect[cnt].iov_base, | 96 | kfree_skb(*buf); |
| 97 | msg_sect[cnt].iov_len); | 97 | *buf = NULL; |
| 98 | pos += msg_sect[cnt].iov_len; | 98 | return -EFAULT; |
| 99 | } | 99 | } |
| 100 | if (likely(res)) | 100 | return dsz; |
| 101 | return dsz; | ||
| 102 | |||
| 103 | kfree_skb(*buf); | ||
| 104 | *buf = NULL; | ||
| 105 | return -EFAULT; | ||
| 106 | } | 101 | } |
