diff options
| -rw-r--r-- | src/pugixml.cpp | 13 | ||||
| -rw-r--r-- | tests/test_document.cpp | 44 | 
2 files changed, 54 insertions, 3 deletions
| diff --git a/src/pugixml.cpp b/src/pugixml.cpp index 37f52fc..27c2960 100644 --- a/src/pugixml.cpp +++ b/src/pugixml.cpp @@ -922,10 +922,17 @@ namespace  	{
  		const char_t* data = static_cast<const char_t*>(contents);
 -		out_buffer = is_mutable ? const_cast<char_t*>(data) : static_cast<char_t*>(global_allocate(size > 0 ? size : 1));
 -		out_length = size / sizeof(char_t);
 +		if (is_mutable)
 +		{
 +			out_buffer = const_cast<char_t*>(data);
 +		}
 +		else
 +		{
 +			out_buffer = static_cast<char_t*>(global_allocate(size > 0 ? size : 1));
 +			if (!out_buffer) return false;
 +		}
 -		if (!out_buffer) return false;
 +		out_length = size / sizeof(char_t);
  		impl::convert_wchar_endian_swap(out_buffer, data, out_length);
 diff --git a/tests/test_document.cpp b/tests/test_document.cpp index 97ba1d9..34d1ad1 100644 --- a/tests/test_document.cpp +++ b/tests/test_document.cpp @@ -71,6 +71,15 @@ TEST(document_load_stream_error)  	CHECK(doc.load(iss).status == status_out_of_memory);
  }
 +TEST(document_load_stream_empty)
 +{
 +	std::istringstream iss;
 +
 +	pugi::xml_document doc;
 +	doc.load(iss); // parse result depends on STL implementation
 +	CHECK(!doc.first_child());
 +}
 +
  TEST(document_load_stream_wide)
  {
  	pugi::xml_document doc;
 @@ -571,3 +580,38 @@ TEST(document_convert_invalid_utf16)  	CHECK(test_parse_fail("\x00<\xde\x24", 4, encoding_utf16_be));
  	CHECK(test_parse_fail("<\x00\x24\xde", 4, encoding_utf16_le));
  }
 +
 +TEST(document_load_buffer_empty)
 +{
 +	encoding_t encodings[] =
 +	{
 +		encoding_auto,
 +		encoding_utf8,
 +		encoding_utf16_le,
 +		encoding_utf16_be,
 +		encoding_utf16,
 +		encoding_utf32_le,
 +		encoding_utf32_be,
 +		encoding_utf32,
 +		encoding_wchar
 +	};
 +
 +	char buffer[1];
 +
 +	for (unsigned int i = 0; i < sizeof(encodings) / sizeof(encodings[0]); ++i)
 +	{
 +		encoding_t encoding = encodings[i];
 +
 +		xml_document doc;
 +		CHECK(doc.load_buffer(buffer, 0, parse_default, encoding) && !doc.first_child());
 +		CHECK(doc.load_buffer(0, 0, parse_default, encoding) && !doc.first_child());
 +
 +		CHECK(doc.load_buffer_inplace(buffer, 0, parse_default, encoding) && !doc.first_child());
 +		CHECK(doc.load_buffer_inplace(0, 0, parse_default, encoding) && !doc.first_child());
 +
 +		void* own_buffer = pugi::get_memory_allocation_function()(1);
 +
 +		CHECK(doc.load_buffer_inplace_own(own_buffer, 0, parse_default, encoding) && !doc.first_child());
 +		CHECK(doc.load_buffer_inplace_own(0, 0, parse_default, encoding) && !doc.first_child());
 +	}
 +}
 | 
