Skip to content

Commit 0d21079

Browse files
committed
Fix Buffer Overflow Vulnerabilities in Firmata SYSEX Message Processing
1 parent 2f335e7 commit 0d21079

File tree

1 file changed

+4
-2
lines changed

1 file changed

+4
-2
lines changed

FirmataParser.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -436,7 +436,8 @@ void FirmataParser::processSysexMessage(void)
436436
if ( 3 > sysexBytesRead ) {
437437
(*currentReportFirmwareCallback)(currentReportFirmwareCallbackContext, 0, 0, (const char *)NULL);
438438
} else {
439-
const size_t end_of_string = (string_offset + decodeByteStream((sysexBytesRead - string_offset), &dataBuffer[string_offset]));
439+
const size_t bytec = min(sysexBytesRead - string_offset, dataBufferSize - string_offset);
440+
const size_t end_of_string = (string_offset + decodeByteStream(bytec, &dataBuffer[string_offset]));
440441
bufferDataAtPosition('\0', end_of_string); // NULL terminate the string
441442
(*currentReportFirmwareCallback)(currentReportFirmwareCallbackContext, (size_t)dataBuffer[major_version_offset], (size_t)dataBuffer[minor_version_offset], (const char *)&dataBuffer[string_offset]);
442443
}
@@ -445,7 +446,8 @@ void FirmataParser::processSysexMessage(void)
445446
case STRING_DATA:
446447
if (currentStringCallback) {
447448
const size_t string_offset = 1;
448-
const size_t end_of_string = (string_offset + decodeByteStream((sysexBytesRead - string_offset), &dataBuffer[string_offset]));
449+
const size_t bytec = min(sysexBytesRead - string_offset, dataBufferSize - string_offset);
450+
const size_t end_of_string = (string_offset + decodeByteStream(bytec, &dataBuffer[string_offset]));
449451
bufferDataAtPosition('\0', end_of_string); // NULL terminate the string
450452
(*currentStringCallback)(currentStringCallbackContext, (const char *)&dataBuffer[string_offset]);
451453
}

0 commit comments

Comments
 (0)