diff --git a/modules/core/src/persistence_json.cpp b/modules/core/src/persistence_json.cpp index ae678e1b8b..89914e6534 100644 --- a/modules/core/src/persistence_json.cpp +++ b/modules/core/src/persistence_json.cpp @@ -296,6 +296,8 @@ public: while ( is_eof == false && is_completed == false ) { + if (!ptr) + CV_PARSE_ERROR_CPP("Invalid input"); switch ( *ptr ) { /* comment */ @@ -381,6 +383,7 @@ public: if ( is_eof || !is_completed ) { ptr = fs->bufferStart(); + CV_Assert(ptr); *ptr = '\0'; fs->setEof(); if( !is_completed ) @@ -392,6 +395,9 @@ public: char* parseKey( char* ptr, FileNode& collection, FileNode& value_placeholder ) { + if (!ptr) + CV_PARSE_ERROR_CPP("Invalid input"); + if( *ptr != '"' ) CV_PARSE_ERROR_CPP( "Key must start with \'\"\'" ); @@ -430,6 +436,9 @@ public: char* parseValue( char* ptr, FileNode& node ) { + if (!ptr) + CV_PARSE_ERROR_CPP("Invalid value input"); + ptr = skipSpaces( ptr ); if( !ptr || !*ptr ) CV_PARSE_ERROR_CPP( "Unexpected End-Of-File" ); @@ -817,6 +826,9 @@ public: bool parse( char* ptr ) { + if (!ptr) + CV_PARSE_ERROR_CPP("Invalid input"); + ptr = skipSpaces( ptr ); if ( !ptr || !*ptr ) return false; diff --git a/modules/core/src/persistence_xml.cpp b/modules/core/src/persistence_xml.cpp index fb30d90896..89876dd3da 100644 --- a/modules/core/src/persistence_xml.cpp +++ b/modules/core/src/persistence_xml.cpp @@ -360,6 +360,9 @@ public: char* skipSpaces( char* ptr, int mode ) { + if (!ptr) + CV_PARSE_ERROR_CPP("Invalid input"); + int level = 0; for(;;) @@ -441,6 +444,9 @@ public: char* parseValue( char* ptr, FileNode& node ) { + if (!ptr) + CV_PARSE_ERROR_CPP("Invalid input"); + FileNode new_elem; bool have_space = true; int value_type = node.type(); @@ -456,6 +462,8 @@ public: (c == '<' && ptr[1] == '!' && ptr[2] == '-') ) { ptr = skipSpaces( ptr, 0 ); + if (!ptr) + CV_PARSE_ERROR_CPP("Invalid input"); have_space = true; c = *ptr; } @@ -502,6 +510,8 @@ public: { ptr = fs->parseBase64( ptr, 0, new_elem); ptr = skipSpaces( ptr, 0 ); + if (!ptr) + CV_PARSE_ERROR_CPP("Invalid input"); } ptr = parseTag( ptr, key2, type_name, tag_type ); @@ -645,6 +655,9 @@ public: char* parseTag( char* ptr, std::string& tag_name, std::string& type_name, int& tag_type ) { + if (!ptr) + CV_PARSE_ERROR_CPP("Invalid tag input"); + if( *ptr == '\0' ) CV_PARSE_ERROR_CPP( "Unexpected end of the stream" ); @@ -702,6 +715,8 @@ public: if( *ptr != '=' ) { ptr = skipSpaces( ptr, CV_XML_INSIDE_TAG ); + if (!ptr) + CV_PARSE_ERROR_CPP("Invalid attribute"); if( *ptr != '=' ) CV_PARSE_ERROR_CPP( "Attribute name should be followed by \'=\'" ); } @@ -740,6 +755,8 @@ public: if( c != '>' ) { ptr = skipSpaces( ptr, CV_XML_INSIDE_TAG ); + if (!ptr) + CV_PARSE_ERROR_CPP("Invalid input"); c = *ptr; } @@ -781,6 +798,8 @@ public: // CV_XML_INSIDE_TAG is used to prohibit leading comments ptr = skipSpaces( ptr, CV_XML_INSIDE_TAG ); + if (!ptr) + CV_PARSE_ERROR_CPP("Invalid input"); if( memcmp( ptr, "\'" ); @@ -791,6 +810,8 @@ public: while( ptr && *ptr != '\0' ) { ptr = skipSpaces( ptr, 0 ); + if (!ptr) + CV_PARSE_ERROR_CPP("Invalid input"); if( *ptr != '\0' ) { diff --git a/modules/core/src/persistence_yml.cpp b/modules/core/src/persistence_yml.cpp index 4129ca1dc5..7742e82770 100644 --- a/modules/core/src/persistence_yml.cpp +++ b/modules/core/src/persistence_yml.cpp @@ -330,6 +330,9 @@ public: char* skipSpaces( char* ptr, int min_indent, int max_comment_indent ) { + if (!ptr) + CV_PARSE_ERROR_CPP("Invalid input"); + for(;;) { while( *ptr == ' ' ) @@ -374,6 +377,9 @@ public: bool getBase64Row(char* ptr, int indent, char* &beg, char* &end) { + if (!ptr) + CV_PARSE_ERROR_CPP("Invalid input"); + beg = end = ptr = skipSpaces(ptr, 0, INT_MAX); if (!ptr || !*ptr) return false; // end of file @@ -394,6 +400,9 @@ public: char* parseKey( char* ptr, FileNode& map_node, FileNode& value_placeholder ) { + if (!ptr) + CV_PARSE_ERROR_CPP("Invalid input"); + char c; char *endptr = ptr - 1, *saveptr; @@ -422,6 +431,9 @@ public: char* parseValue( char* ptr, FileNode& node, int min_indent, bool is_parent_flow ) { + if (!ptr) + CV_PARSE_ERROR_CPP("Invalid input"); + char* endptr = 0; char c = ptr[0], d = ptr[1]; int value_type = FileNode::NONE; @@ -508,6 +520,8 @@ public: *endptr = d; ptr = skipSpaces( endptr, min_indent, INT_MAX ); + if (!ptr) + CV_PARSE_ERROR_CPP("Invalid input"); c = *ptr; @@ -634,6 +648,8 @@ public: FileNode elem; ptr = skipSpaces( ptr, new_min_indent, INT_MAX ); + if (!ptr) + CV_PARSE_ERROR_CPP("Invalid input"); if( *ptr == '}' || *ptr == ']' ) { if( *ptr != d ) @@ -647,6 +663,8 @@ public: if( *ptr != ',' ) CV_PARSE_ERROR_CPP( "Missing , between the elements" ); ptr = skipSpaces( ptr + 1, new_min_indent, INT_MAX ); + if (!ptr) + CV_PARSE_ERROR_CPP("Invalid input"); } if( struct_type == FileNode::MAP ) @@ -746,6 +764,9 @@ public: bool parse( char* ptr ) { + if (!ptr) + CV_PARSE_ERROR_CPP("Invalid input"); + bool first = true; bool ok = true; FileNode root_collection(fs->getFS(), 0, 0);