diff --git a/mesh/crypto.c b/mesh/crypto.c
index 3dcf226..a03dc94 100644
--- a/mesh/crypto.c
+++ b/mesh/crypto.c
if (dst)
*dst = this_dst;
+ if (packet_len < 9 + 4)
+ return false;
+
hdr = l_get_be32(packet + 9);
is_segmented = !!((hdr >> SEG_HDR_SHIFT) & 0x1);
if (*ctl) {
uint8_t this_opcode = packet[9] & OPCODE_MASK;
+ /* NetMIC */
+ packet_len -= 8;
+
if (cookie)
*cookie = l_get_be32(packet + 2) ^ packet[6];
*seqZero = (hdr >> SEQ_ZERO_HDR_SHIFT) &
SEQ_ZERO_MASK;
+ if (packet_len < 9)
+ return false;
+
*payload = packet + 9;
*payload_len = packet_len - 9;
} else {
+ if (packet_len < 10)
+ return false;
+
*payload = packet + 10;
*payload_len = packet_len - 10;
}
} else {
+ /* NetMIC */
+ packet_len -= 4;
+
if (cookie)
*cookie = l_get_be32(packet + packet_len - 8);
if (segN)
*segN = (hdr >> SEGN_HDR_SHIFT) & SEG_MASK;
+ if (packet_len < 13)
+ return false;
+
*payload = packet + 13;
*payload_len = packet_len - 13;
} else {
+ if (packet_len < 10)
+ return false;
+
*payload = packet + 10;
*payload_len = packet_len - 10;
}
diff --git a/mesh/net-keys.c b/mesh/net-keys.c
index 0daeb92..98e6d23 100644
--- a/mesh/net-keys.c
+++ b/mesh/net-keys.c
if (result) {
cache_id = key->id;
- if (cache_plain[1] & 0x80)
- cache_plainlen = cache_len - 8;
- else
- cache_plainlen = cache_len - 4;
+ cache_plainlen = cache_len;
}
}