Skip to content

Commit f214fcf

Browse files
authored
Ensure read_avail is set for the first non-empty block (#6916)
Also add defense to prevent Heap buffer overflow (from ASAN report in prod)
1 parent fcbcd73 commit f214fcf

File tree

1 file changed

+7
-7
lines changed

1 file changed

+7
-7
lines changed

src/traffic_server/FetchSM.cc

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)