@@ -367,6 +367,10 @@ FetchSM::get_info_from_buffer(IOBufferReader *reader)
367367 return ;
368368 }
369369
370+ /* Read the data out of the reader */
371+ if (reader->block != NULL )
372+ reader->skip_empty_blocks ();
373+
370374 read_avail = reader->read_avail ();
371375 Debug (DEBUG_TAG, " [%s] total avail %" PRId64, __FUNCTION__, read_avail);
372376 if (!read_avail) {
@@ -377,10 +381,6 @@ FetchSM::get_info_from_buffer(IOBufferReader *reader)
377381 info = (char *)ats_malloc (sizeof (char ) * (read_avail + 1 ));
378382 client_response = info;
379383
380- /* Read the data out of the reader */
381- if (reader->block != NULL )
382- reader->skip_empty_blocks ();
383-
384384 blk = reader->block .get ();
385385
386386 // This is the equivalent of TSIOBufferBlockReadStart()
@@ -391,7 +391,7 @@ FetchSM::get_info_from_buffer(IOBufferReader *reader)
391391 int bytes_used = 0 ;
392392 header_done = 1 ;
393393 if (client_response_hdr.parse_resp (&http_parser, reader, &bytes_used, 0 ) == PARSE_RESULT_DONE) {
394- if (bytes_used > 0 ) {
394+ if (( bytes_used > 0 ) && (bytes_used <= read_avail) ) {
395395 memcpy (info, buf, bytes_used);
396396 info += bytes_used;
397397 client_bytes += bytes_used;
@@ -418,7 +418,7 @@ FetchSM::get_info_from_buffer(IOBufferReader *reader)
418418 buf = blk->start () + reader->start_offset ;
419419 read_done = blk->read_avail () - reader->start_offset ;
420420
421- if (read_done > 0 ) {
421+ if (( read_done > 0 ) && ((read_done <= read_avail)) ) {
422422 memcpy (info, buf, read_done);
423423 reader->consume (read_done);
424424 read_avail -= read_done;
@@ -453,7 +453,7 @@ FetchSM::get_info_from_buffer(IOBufferReader *reader)
453453 buf = blk->start () + reader->start_offset ;
454454 read_done = blk->read_avail () - reader->start_offset ;
455455
456- if (read_done > 0 ) {
456+ if (( read_done > 0 ) && (read_done <= read_avail) ) {
457457 memcpy (info, buf, read_done);
458458 reader->consume (read_done);
459459 read_avail -= read_done;
0 commit comments