@@ -474,8 +474,30 @@ bool AsyncWebServerRequest::_parseReqHeader() {
474474 } else if (name.equalsIgnoreCase (T_Content_Type)) {
475475 _contentType = value.substring (0 , value.indexOf (' ;' ));
476476 if (value.startsWith (T_MULTIPART_ )) {
477- _boundary = value.substring (value.indexOf (' =' ) + 1 );
477+ String lowcase (value);
478+ lowcase.toLowerCase ();
479+ int bpos = lowcase.indexOf (T_BOUNDARY );
480+ if (bpos < 0 ) {
481+ async_ws_log_d (" Missing multipart boundary parameter, aborting" );
482+ _parseState = PARSE_REQ_FAIL ;
483+ abort ();
484+ return true ;
485+ }
486+ _boundary = value.substring (bpos + T_BOUNDARY_LEN );
487+ int semi = _boundary.indexOf (' ;' );
488+ if (semi >= 0 ) {
489+ _boundary = _boundary.substring (0 , semi);
490+ }
491+ _boundary.trim ();
478492 _boundary.replace (String (' "' ), String ());
493+ // RFC 2046 §5.1 limits boundary strings to 70 characters.
494+ // Reject invalid boundaries to prevent integer overflow in the parser.
495+ if (_boundary.length () == 0 || _boundary.length () > 70 ) {
496+ async_ws_log_d (" Invalid multipart boundary length (%u), aborting" , _boundary.length ());
497+ _parseState = PARSE_REQ_FAIL ;
498+ abort ();
499+ return true ;
500+ }
479501 _isMultipart = true ;
480502 }
481503 } else if (name.equalsIgnoreCase (T_Content_Length) || name.equalsIgnoreCase (T_X_Expected_Entity_Length)) {
@@ -743,8 +765,7 @@ void AsyncWebServerRequest::_parseMultipartPostByte(uint8_t data, bool last) {
743765 itemWriteByte (' \n ' );
744766 itemWriteByte (' -' );
745767 itemWriteByte (' -' );
746- uint8_t i;
747- for (i = 0 ; i < _boundaryPosition; i++) {
768+ for (size_t i = 0 ; i < _boundaryPosition; i++) {
748769 itemWriteByte (_boundary.c_str ()[i]);
749770 }
750771 _parseMultipartPostByte (data, last);
0 commit comments