4343
4444#include < iostream>
4545
46+ #include " common.hpp"
4647#include " ssdp.hpp"
4748
4849namespace 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}
0 commit comments