Changeset c171463
- Timestamp:
- 06/30/18 20:26:46 (3 years ago)
- Branches:
- cachetimestamps, develop, master, rc-4.0.4, ringdecrementfix, ringperformance
- Children:
- e17bad6
- Parents:
- 7bb2fd4
- git-author:
- Richard Sanger <rsanger@…> (06/30/18 19:48:48)
- git-committer:
- Richard Sanger <rsanger@…> (06/30/18 20:26:46)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
lib/format_pcapng.c
r7bb2fd4 rc171463 173 173 }; 174 174 175 typedef struct pcapng_peeker pcapng_hdr_t; 176 175 177 176 178 #define DATA(x) ((struct pcapng_format_data_t *)((x)->format_data)) … … 287 289 288 290 static char *pcapng_parse_next_option(libtrace_t *libtrace, char **pktbuf, 289 uint16_t *code, uint16_t *length ) {291 uint16_t *code, uint16_t *length, pcapng_hdr_t *blockhdr) { 290 292 291 293 struct pcapng_optheader *opthdr = (struct pcapng_optheader *)*pktbuf; 292 294 int to_skip; 293 295 int padding = 0; 296 char *eob; //end of block 294 297 char *optval; 298 if (DATA(libtrace)->byteswapped) { 299 eob = ((char *) blockhdr) + byteswap32(blockhdr->blocklen); 300 } else { 301 eob = ((char *) blockhdr) + blockhdr->blocklen; 302 } 303 304 assert((char *)blockhdr < *pktbuf); 305 // Check if we have reached the end of the block, +4 for trailing block-size 306 // We cannot assume a endofopt, so we add one 307 if (eob == (*pktbuf) + 4) { 308 *code = 0; 309 *length = 0; 310 return *pktbuf; 311 } 312 // If there is not enough space for another header we've encountered an error 313 if (eob < (*pktbuf) + 4 + sizeof(struct pcapng_optheader)) { 314 return NULL; 315 } 295 316 296 317 if (DATA(libtrace)->byteswapped) { … … 311 332 312 333 to_skip = (*length) + padding; 334 // Check the value we return is within the block length 335 if (eob < optval + to_skip + 4) { 336 return NULL; 337 } 313 338 *pktbuf = optval + to_skip; 314 339 … … 588 613 do { 589 614 optval = pcapng_parse_next_option(libtrace, &bodyptr, 590 &optcode, &optlen );615 &optcode, &optlen, (pcapng_hdr_t *) packet->buffer); 591 616 if (optval == NULL) { 592 617 trace_set_err(libtrace, TRACE_ERR_BAD_PACKET, … … 799 824 do { 800 825 optval = pcapng_parse_next_option(packet->trace, &bodyptr, 801 &optcode, &optlen );826 &optcode, &optlen, (pcapng_hdr_t *) packet->buffer); 802 827 if (optval == NULL) { 803 828 trace_set_err(libtrace, TRACE_ERR_BAD_PACKET, … … 992 1017 do { 993 1018 optval = pcapng_parse_next_option(packet->trace, &bodyptr, 994 &optcode, &optlen );1019 &optcode, &optlen, (pcapng_hdr_t *) packet->buffer); 995 1020 if (optval == NULL) { 996 1021 trace_set_err(libtrace, TRACE_ERR_BAD_PACKET, … … 1055 1080 if (DATA(libtrace)->byteswapped) { 1056 1081 btype = byteswap32(peeker.blocktype); 1082 to_read = byteswap32(peeker.blocklen); 1057 1083 } else { 1058 1084 btype = peeker.blocktype; 1085 to_read = peeker.blocklen; 1086 } 1087 1088 // Check we won't read off the end of the packet buffer. Assuming corruption. 1089 // Exclude the SECTION header, as this is used to identify the byteorder 1090 if (to_read > LIBTRACE_PACKET_BUFSIZE && btype != PCAPNG_SECTION_TYPE) { 1091 trace_set_err(libtrace, TRACE_ERR_BAD_PACKET, 1092 "Oversized pcapng block found, is the trace corrupted?"); 1093 return -1; 1059 1094 } 1060 1095 … … 1106 1141 /* Everything else -- don't care, skip it */ 1107 1142 default: 1108 if (DATA(libtrace)->byteswapped) {1109 to_read = byteswap32(peeker.blocklen);1110 } else {1111 to_read = peeker.blocklen;1112 }1113 1143 err = skip_block(libtrace, to_read); 1114 1144 break;
Note: See TracChangeset
for help on using the changeset viewer.