Skip to content
This repository was archived by the owner on May 23, 2023. It is now read-only.

Commit 9e46cf9

Browse files
Juha Heiskanenjuhhei01
authored andcommitted
Added malformed message check to nested IE discovery.
Change-Id: Ia4ee197107a9e6b8bb8126c8b0b445b121f9f7ef
1 parent 7f4c184 commit 9e46cf9

File tree

3 files changed

+36
-9
lines changed

3 files changed

+36
-9
lines changed

source/6LoWPAN/MAC/mac_ie_lib.c

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,13 @@
2626
#define MAC_IE_HEADER_ID_MASK 0x7f80
2727
#define MAC_IE_PAYLOAD_LENGTH_MASK 0x07ff
2828
#define MAC_IE_PAYLOAD_ID_MASK 0x7800
29+
#define MAC_IE_TYPE_PAYLOAD_MASK 0x8000
2930

3031
#define MAC_NESTED_LONG_IE_PAYLOAD_LENGTH_MASK 0x07ff
3132
#define MAC_NESTED_LONG_IE_PAYLOAD_ID_MASK 0x7800
3233
#define MAC_NESTED_SHORT_IE_PAYLOAD_LENGTH_MASK 0x00ff
3334
#define MAC_NESTED_SHORT_IE_PAYLOAD_ID_MASK 0x7f00
35+
#define MAC_NESTED_IE_TYPE_LONG_MASK 0x8000
3436

3537
static void mac_ie_header_parse(mac_header_IE_t *header_element, uint8_t *ptr)
3638
{
@@ -52,7 +54,7 @@ static void mac_ie_nested_id_parse(mac_nested_payload_IE_t *element, uint8_t *pt
5254
{
5355
uint16_t ie_dummy = common_read_16_bit_inverse(ptr);
5456

55-
if (ie_dummy & 0x8000) {
57+
if (ie_dummy & MAC_NESTED_IE_TYPE_LONG_MASK) {
5658
element->type_long = true;
5759
element->length = (ie_dummy & MAC_NESTED_LONG_IE_PAYLOAD_LENGTH_MASK);
5860
element->id = ((ie_dummy & MAC_NESTED_LONG_IE_PAYLOAD_ID_MASK ) >> 11);
@@ -77,15 +79,15 @@ uint8_t *mac_ie_header_base_write(uint8_t *ptr, uint8_t type, uint16_t length)
7779
uint8_t *mac_ie_payload_base_write(uint8_t *ptr, uint8_t type, uint16_t length)
7880
{
7981

80-
uint16_t ie_dummy = 0x8000; //Payload type
82+
uint16_t ie_dummy = MAC_IE_TYPE_PAYLOAD_MASK; //Payload type
8183
ie_dummy |= (length & MAC_IE_PAYLOAD_LENGTH_MASK);
8284
ie_dummy |= ((type << 11 ) & MAC_IE_PAYLOAD_ID_MASK);
8385
return common_write_16_bit_inverse(ie_dummy, ptr);
8486
}
8587

8688
uint8_t *mac_ie_nested_ie_long_base_write(uint8_t *ptr, uint8_t sub_id, uint16_t length)
8789
{
88-
uint16_t ie_dummy = 0x8000;
90+
uint16_t ie_dummy = MAC_NESTED_IE_TYPE_LONG_MASK;
8991
ie_dummy |= (length & MAC_NESTED_LONG_IE_PAYLOAD_LENGTH_MASK);
9092
ie_dummy |= ((sub_id << 11 ) & MAC_NESTED_LONG_IE_PAYLOAD_ID_MASK);
9193

@@ -112,7 +114,7 @@ uint16_t mac_ie_payload_discover(uint8_t *payload_ptr, uint16_t length, mac_payl
112114
return ie_element.length;
113115
}
114116

115-
length -= ie_element.length +2;
117+
length -= ie_element.length + 2;
116118

117119
payload_ptr += ie_element.length + 2;
118120
}
@@ -124,13 +126,18 @@ uint16_t mac_ie_nested_discover(uint8_t *payload_ptr, uint16_t length, mac_neste
124126
mac_nested_payload_IE_t ie_element;
125127
while (length >= 2) {
126128
mac_ie_nested_id_parse(&ie_element, payload_ptr);
129+
130+
if (length < ie_element.length + 2) {
131+
return 0;
132+
}
133+
127134
if (nested_ie->id == ie_element.id && nested_ie->type_long == ie_element.type_long) {
128135
nested_ie->content_ptr = ie_element.content_ptr;
129136
nested_ie->length = ie_element.length;
130137
return ie_element.length;
131138
}
132139

133-
length -= ie_element.length +2;
140+
length -= ie_element.length + 2;
134141

135142
payload_ptr += ie_element.length + 2;
136143
}
@@ -148,7 +155,7 @@ uint8_t mac_ie_header_discover(uint8_t *header_ptr, uint16_t length, mac_header_
148155
return ie_element.length;
149156
}
150157

151-
length -= ie_element.length +2;
158+
length -= ie_element.length + 2;
152159

153160
header_ptr += ie_element.length + 2;
154161
}
@@ -170,7 +177,7 @@ uint8_t mac_ie_header_sub_id_discover(uint8_t *header_ptr, uint16_t length, mac_
170177
return ie_element.length;
171178
}
172179

173-
length -= ie_element.length +2;
180+
length -= ie_element.length + 2;
174181

175182
header_ptr += ie_element.length + 2;
176183
}

source/6LoWPAN/MAC/mac_ie_lib.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ typedef struct mac_nested_payload_IE_s {
3434
/** IE header element generic header write */
3535
uint8_t *mac_ie_header_base_write(uint8_t *ptr, uint8_t type, uint16_t length);
3636

37-
/** IE ayload element generic header write */
37+
/** IE payload element generic header write */
3838
uint8_t *mac_ie_payload_base_write(uint8_t *ptr, uint8_t type, uint16_t length);
3939

4040
/** Nested IE long header write */
@@ -46,7 +46,7 @@ uint8_t *mac_ie_nested_ie_short_base_write(uint8_t *ptr, uint8_t sub_id, uint16_
4646
/** Payload IE discover for spesific group ID */
4747
uint16_t mac_ie_payload_discover(uint8_t *payload_ptr, uint16_t length, struct mac_payload_IE_s * payload_ie);
4848

49-
/** Nested IE element discover inside parsed payload elemnt */
49+
/** Nested IE element discover inside parsed payload element */
5050
uint16_t mac_ie_nested_discover(uint8_t *payload_ptr, uint16_t length, mac_nested_payload_IE_t * nested_ie);
5151

5252
/** Header IE elemnt discover */

test/nanostack/unittest/6lp_mac/mac_ie_lib/test_mac_ie_lib.c

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,26 @@ bool test_mac_ie_nested_discover()
162162
return false;
163163
}
164164

165+
common_functions_stub.readuint16_from_queue = 2;
166+
167+
common_functions_stub.uint16_value_queue[1] = 0x8000 + 7;
168+
common_functions_stub.uint16_value_queue[1] |= ((2 << 11 ) & 0x7800);
169+
common_functions_stub.uint16_value_queue[0] = 40;
170+
common_functions_stub.uint16_value_queue[0] |= ((1 << 8 ) & 0x7f00);
171+
if (mac_ie_nested_discover(buffer, 50, &mac_payload_ie)) { //1 byte too short
172+
return false;
173+
}
174+
175+
common_functions_stub.readuint16_from_queue = 2;
176+
177+
common_functions_stub.uint16_value_queue[1] = 0x8000 + 7;
178+
common_functions_stub.uint16_value_queue[1] |= ((2 << 11 ) & 0x7800);
179+
common_functions_stub.uint16_value_queue[0] = 70;
180+
common_functions_stub.uint16_value_queue[0] |= ((1 << 8 ) & 0x7f00);
181+
if (mac_ie_nested_discover(buffer, 51, &mac_payload_ie)) { //Plenty off too long
182+
return false;
183+
}
184+
165185

166186
return true;
167187
}

0 commit comments

Comments
 (0)