aboutsummaryrefslogtreecommitdiffstats
path: root/net/tipc/msg.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/tipc/msg.c')
-rw-r--r--net/tipc/msg.c44
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 */
195bool 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