diff options
Diffstat (limited to 'net/tipc/msg.c')
-rw-r--r-- | net/tipc/msg.c | 44 |
1 files changed, 43 insertions, 1 deletions
diff --git a/net/tipc/msg.c b/net/tipc/msg.c index b6eb90cd3ef7..4a64caf6fa20 100644 --- a/net/tipc/msg.c +++ b/net/tipc/msg.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * net/tipc/msg.c: TIPC message header routines | 2 | * net/tipc/msg.c: TIPC message header routines |
3 | * | 3 | * |
4 | * Copyright (c) 2000-2006, 2014, Ericsson AB | 4 | * Copyright (c) 2000-2006, 2014-2015, Ericsson AB |
5 | * Copyright (c) 2005, 2010-2011, Wind River Systems | 5 | * Copyright (c) 2005, 2010-2011, Wind River Systems |
6 | * All rights reserved. | 6 | * All rights reserved. |
7 | * | 7 | * |
@@ -181,6 +181,48 @@ err: | |||
181 | return 0; | 181 | return 0; |
182 | } | 182 | } |
183 | 183 | ||
184 | /* tipc_msg_validate - validate basic format of received message | ||
185 | * | ||
186 | * This routine ensures a TIPC message has an acceptable header, and at least | ||
187 | * as much data as the header indicates it should. The routine also ensures | ||
188 | * that the entire message header is stored in the main fragment of the message | ||
189 | * buffer, to simplify future access to message header fields. | ||
190 | * | ||
191 | * Note: Having extra info present in the message header or data areas is OK. | ||
192 | * TIPC will ignore the excess, under the assumption that it is optional info | ||
193 | * introduced by a later release of the protocol. | ||
194 | */ | ||
195 | bool tipc_msg_validate(struct sk_buff *skb) | ||
196 | { | ||
197 | struct tipc_msg *msg; | ||
198 | int msz, hsz; | ||
199 | |||
200 | if (unlikely(TIPC_SKB_CB(skb)->validated)) | ||
201 | return true; | ||
202 | if (unlikely(!pskb_may_pull(skb, MIN_H_SIZE))) | ||
203 | return false; | ||
204 | |||
205 | hsz = msg_hdr_sz(buf_msg(skb)); | ||
206 | if (unlikely(hsz < MIN_H_SIZE) || (hsz > MAX_H_SIZE)) | ||
207 | return false; | ||
208 | if (unlikely(!pskb_may_pull(skb, hsz))) | ||
209 | return false; | ||
210 | |||
211 | msg = buf_msg(skb); | ||
212 | if (unlikely(msg_version(msg) != TIPC_VERSION)) | ||
213 | return false; | ||
214 | |||
215 | msz = msg_size(msg); | ||
216 | if (unlikely(msz < hsz)) | ||
217 | return false; | ||
218 | if (unlikely((msz - hsz) > TIPC_MAX_USER_MSG_SIZE)) | ||
219 | return false; | ||
220 | if (unlikely(skb->len < msz)) | ||
221 | return false; | ||
222 | |||
223 | TIPC_SKB_CB(skb)->validated = true; | ||
224 | return true; | ||
225 | } | ||
184 | 226 | ||
185 | /** | 227 | /** |
186 | * tipc_msg_build - create buffer chain containing specified header and data | 228 | * tipc_msg_build - create buffer chain containing specified header and data |