Skip to content

Commit eaf6fb3

Browse files
Pavel Siskaxsiska12
authored andcommitted
ssdp: Check payload length during parsing.
1 parent 946d304 commit eaf6fb3

File tree

2 files changed

+10
-5
lines changed

2 files changed

+10
-5
lines changed

process/ssdp.cpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343

4444
#include <iostream>
4545

46+
#include "common.hpp"
4647
#include "ssdp.hpp"
4748

4849
namespace ipxp {
@@ -189,14 +190,16 @@ bool SSDPPlugin::get_header_val(char **data, const char *header, const int len)
189190
* \brief Parses SSDP payload based on configuration in conf struct.
190191
*
191192
* \param [in] data Pointer to pointer to SSDP data.
193+
* \param [in] payload_len Lenght of payload data
192194
* \param [in] conf Struct containing parser configuration.
193195
*/
194-
void SSDPPlugin::parse_headers(char *data, header_parser_conf conf)
196+
void SSDPPlugin::parse_headers(char *data, size_t payload_len, header_parser_conf conf)
195197
{
196198
char *ptr = data;
197199
char *old_ptr = ptr;
200+
size_t len = 0;
198201

199-
while (*ptr != '\0') {
202+
while (*ptr != '\0' && len <= payload_len) {
200203
if (*ptr == '\n' && *(ptr - 1) == '\r') {
201204
*(ptr - 1) = '\0';
202205
for (unsigned j = 0, i = 0; j < conf.select_cnt; j++) {
@@ -242,6 +245,7 @@ void SSDPPlugin::parse_headers(char *data, header_parser_conf conf)
242245
old_ptr = ptr + 1;
243246
}
244247
ptr++;
248+
len++;
245249
}
246250
return;
247251
}
@@ -282,6 +286,7 @@ void SSDPPlugin::parse_ssdp_message(Flow &rec, const Packet &pkt)
282286
static_cast<RecordExtSSDP *>(rec.get_extension(RecordExtSSDP::REGISTERED_ID))
283287
};
284288
char *data = (char *) pkt.payload;
289+
size_t payload_len = pkt.payload_len;
285290

286291
total++;
287292
if (data[0] == 'N') {
@@ -290,14 +295,14 @@ void SSDPPlugin::parse_ssdp_message(Flow &rec, const Packet &pkt)
290295
int notify_headers[] = { NT, LOCATION, SERVER };
291296
parse_conf.select = notify_headers;
292297
parse_conf.select_cnt = sizeof(notify_headers) / sizeof(notify_headers[0]);
293-
parse_headers(data, parse_conf);
298+
parse_headers(data, payload_len, parse_conf);
294299
} else if (data[0] == 'M') {
295300
searches++;
296301
SSDP_DEBUG_MSG("M-search #%d\n", searches);
297302
int search_headers[] = { ST, USER_AGENT };
298303
parse_conf.select = search_headers;
299304
parse_conf.select_cnt = sizeof(search_headers) / sizeof(search_headers[0]);
300-
parse_headers(data, parse_conf);
305+
parse_headers(data, payload_len, parse_conf);
301306
}
302307
SSDP_DEBUG_MSG("\n");
303308
}

process/ssdp.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ class SSDPPlugin : public ProcessPlugin
219219

220220
uint16_t parse_loc_port(char *data, uint8_t ip_version);
221221
bool get_header_val(char **data, const char *header, const int len);
222-
void parse_headers(char *data, header_parser_conf conf);
222+
void parse_headers(char *data, size_t payload_len, header_parser_conf conf);
223223
void parse_ssdp_message(Flow &rec, const Packet &pkt);
224224
void append_value(char *curr_entry, unsigned entry_max, char *value);
225225
};

0 commit comments

Comments
 (0)