diff options
author | Jon Paul Maloy <jon.maloy@ericsson.com> | 2015-03-13 16:08:06 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-03-14 14:38:32 -0400 |
commit | cf2157f88a5abf1a64b8c51a737a35e918dc67e5 (patch) | |
tree | 8896dd853ffa7676faeba4423d494a17fba67db1 /net/tipc/link.c | |
parent | 7764d6e83d2c3b50d9282f12144ebb10418c056e (diff) |
tipc: move message validation function to msg.c
The function link_buf_validate() is in reality re-entrant and context
independent, and will in later commits be called from several locations.
Therefore, we move it to msg.c, make it outline and rename the it to
tipc_msg_validate().
We also redesign the function to make proper use of pskb_may_pull()
Signed-off-by: Jon Maloy <jon.maloy@ericsson.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/tipc/link.c')
-rw-r--r-- | net/tipc/link.c | 58 |
1 files changed, 1 insertions, 57 deletions
diff --git a/net/tipc/link.c b/net/tipc/link.c index 98609fdfb06a..944c8c663a2d 100644 --- a/net/tipc/link.c +++ b/net/tipc/link.c | |||
@@ -1048,61 +1048,6 @@ static void link_retrieve_defq(struct tipc_link *link, | |||
1048 | } | 1048 | } |
1049 | 1049 | ||
1050 | /** | 1050 | /** |
1051 | * link_recv_buf_validate - validate basic format of received message | ||
1052 | * | ||
1053 | * This routine ensures a TIPC message has an acceptable header, and at least | ||
1054 | * as much data as the header indicates it should. The routine also ensures | ||
1055 | * that the entire message header is stored in the main fragment of the message | ||
1056 | * buffer, to simplify future access to message header fields. | ||
1057 | * | ||
1058 | * Note: Having extra info present in the message header or data areas is OK. | ||
1059 | * TIPC will ignore the excess, under the assumption that it is optional info | ||
1060 | * introduced by a later release of the protocol. | ||
1061 | */ | ||
1062 | static int link_recv_buf_validate(struct sk_buff *buf) | ||
1063 | { | ||
1064 | static u32 min_data_hdr_size[8] = { | ||
1065 | SHORT_H_SIZE, MCAST_H_SIZE, NAMED_H_SIZE, BASIC_H_SIZE, | ||
1066 | MAX_H_SIZE, MAX_H_SIZE, MAX_H_SIZE, MAX_H_SIZE | ||
1067 | }; | ||
1068 | |||
1069 | struct tipc_msg *msg; | ||
1070 | u32 tipc_hdr[2]; | ||
1071 | u32 size; | ||
1072 | u32 hdr_size; | ||
1073 | u32 min_hdr_size; | ||
1074 | |||
1075 | /* If this packet comes from the defer queue, the skb has already | ||
1076 | * been validated | ||
1077 | */ | ||
1078 | if (unlikely(TIPC_SKB_CB(buf)->deferred)) | ||
1079 | return 1; | ||
1080 | |||
1081 | if (unlikely(buf->len < MIN_H_SIZE)) | ||
1082 | return 0; | ||
1083 | |||
1084 | msg = skb_header_pointer(buf, 0, sizeof(tipc_hdr), tipc_hdr); | ||
1085 | if (msg == NULL) | ||
1086 | return 0; | ||
1087 | |||
1088 | if (unlikely(msg_version(msg) != TIPC_VERSION)) | ||
1089 | return 0; | ||
1090 | |||
1091 | size = msg_size(msg); | ||
1092 | hdr_size = msg_hdr_sz(msg); | ||
1093 | min_hdr_size = msg_isdata(msg) ? | ||
1094 | min_data_hdr_size[msg_type(msg)] : INT_H_SIZE; | ||
1095 | |||
1096 | if (unlikely((hdr_size < min_hdr_size) || | ||
1097 | (size < hdr_size) || | ||
1098 | (buf->len < size) || | ||
1099 | (size - hdr_size > TIPC_MAX_USER_MSG_SIZE))) | ||
1100 | return 0; | ||
1101 | |||
1102 | return pskb_may_pull(buf, hdr_size); | ||
1103 | } | ||
1104 | |||
1105 | /** | ||
1106 | * tipc_rcv - process TIPC packets/messages arriving from off-node | 1051 | * tipc_rcv - process TIPC packets/messages arriving from off-node |
1107 | * @net: the applicable net namespace | 1052 | * @net: the applicable net namespace |
1108 | * @skb: TIPC packet | 1053 | * @skb: TIPC packet |
@@ -1127,7 +1072,7 @@ void tipc_rcv(struct net *net, struct sk_buff *skb, struct tipc_bearer *b_ptr) | |||
1127 | 1072 | ||
1128 | while ((skb = __skb_dequeue(&head))) { | 1073 | while ((skb = __skb_dequeue(&head))) { |
1129 | /* Ensure message is well-formed */ | 1074 | /* Ensure message is well-formed */ |
1130 | if (unlikely(!link_recv_buf_validate(skb))) | 1075 | if (unlikely(!tipc_msg_validate(skb))) |
1131 | goto discard; | 1076 | goto discard; |
1132 | 1077 | ||
1133 | /* Ensure message data is a single contiguous unit */ | 1078 | /* Ensure message data is a single contiguous unit */ |
@@ -1398,7 +1343,6 @@ static void link_handle_out_of_seq_msg(struct tipc_link *l_ptr, | |||
1398 | 1343 | ||
1399 | if (tipc_link_defer_pkt(&l_ptr->deferred_queue, buf)) { | 1344 | if (tipc_link_defer_pkt(&l_ptr->deferred_queue, buf)) { |
1400 | l_ptr->stats.deferred_recv++; | 1345 | l_ptr->stats.deferred_recv++; |
1401 | TIPC_SKB_CB(buf)->deferred = true; | ||
1402 | if ((skb_queue_len(&l_ptr->deferred_queue) % 16) == 1) | 1346 | if ((skb_queue_len(&l_ptr->deferred_queue) % 16) == 1) |
1403 | tipc_link_proto_xmit(l_ptr, STATE_MSG, 0, 0, 0, 0, 0); | 1347 | tipc_link_proto_xmit(l_ptr, STATE_MSG, 0, 0, 0, 0, 0); |
1404 | } else { | 1348 | } else { |