From 728f0eb2f5119eb45a760a6f2293521d4d8f2374 Mon Sep 17 00:00:00 2001 From: Vadim Pisarevsky Date: Wed, 10 Nov 2010 20:11:07 +0000 Subject: [PATCH] fixed infinite loop in FileStorage::open when reading incomplete XML's (ticket #663) --- modules/core/src/persistence.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/modules/core/src/persistence.cpp b/modules/core/src/persistence.cpp index 79fd213d85..c2b5c59145 100644 --- a/modules/core/src/persistence.cpp +++ b/modules/core/src/persistence.cpp @@ -1763,7 +1763,7 @@ icvXMLParseValue( CvFileStorage* fs, char* ptr, CvFileNode* node, d = ptr[1]; - if( c =='<' ) + if( c =='<' || c == '\0' ) { CvStringHashNode *key = 0, *key2 = 0; CvAttrList* list = 0; @@ -1773,7 +1773,7 @@ icvXMLParseValue( CvFileStorage* fs, char* ptr, CvFileNode* node, const char* type_name = 0; int elem_type = CV_NODE_NONE; - if( d == '/' ) + if( d == '/' || c == '\0' ) break; ptr = icvXMLParseTag( fs, ptr, &key, &list, &tag_type ); @@ -1989,6 +1989,9 @@ icvXMLParseTag( CvFileStorage* fs, char* ptr, CvStringHashNode** _tag, char c; int have_space; + if( *ptr == '\0' ) + CV_PARSE_ERROR( "Preliminary end of the stream" ); + if( *ptr != '<' ) CV_PARSE_ERROR( "Tag should start with \'<\'" );