|
|
@@ -643,17 +643,23 @@ batadv_v_ogm_process_per_outif(struct batadv_priv *bat_priv,
|
|
|
* batadv_v_ogm_aggr_packet() - checks if there is another OGM aggregated
|
|
|
* @buff_pos: current position in the skb
|
|
|
* @packet_len: total length of the skb
|
|
|
- * @tvlv_len: tvlv length of the previously considered OGM
|
|
|
+ * @ogm2_packet: potential OGM2 in buffer
|
|
|
*
|
|
|
* Return: true if there is enough space for another OGM, false otherwise.
|
|
|
*/
|
|
|
-static bool batadv_v_ogm_aggr_packet(int buff_pos, int packet_len,
|
|
|
- __be16 tvlv_len)
|
|
|
+static bool
|
|
|
+batadv_v_ogm_aggr_packet(int buff_pos, int packet_len,
|
|
|
+ const struct batadv_ogm2_packet *ogm2_packet)
|
|
|
{
|
|
|
int next_buff_pos = 0;
|
|
|
|
|
|
- next_buff_pos += buff_pos + BATADV_OGM2_HLEN;
|
|
|
- next_buff_pos += ntohs(tvlv_len);
|
|
|
+ /* check if there is enough space for the header */
|
|
|
+ next_buff_pos += buff_pos + sizeof(*ogm2_packet);
|
|
|
+ if (next_buff_pos > packet_len)
|
|
|
+ return false;
|
|
|
+
|
|
|
+ /* check if there is enough space for the optional TVLV */
|
|
|
+ next_buff_pos += ntohs(ogm2_packet->tvlv_len);
|
|
|
|
|
|
return (next_buff_pos <= packet_len) &&
|
|
|
(next_buff_pos <= BATADV_MAX_AGGREGATION_BYTES);
|
|
|
@@ -830,7 +836,7 @@ int batadv_v_ogm_packet_recv(struct sk_buff *skb,
|
|
|
ogm_packet = (struct batadv_ogm2_packet *)skb->data;
|
|
|
|
|
|
while (batadv_v_ogm_aggr_packet(ogm_offset, skb_headlen(skb),
|
|
|
- ogm_packet->tvlv_len)) {
|
|
|
+ ogm_packet)) {
|
|
|
batadv_v_ogm_process(skb, ogm_offset, if_incoming);
|
|
|
|
|
|
ogm_offset += BATADV_OGM2_HLEN;
|