Index: boost/locale/utf.hpp =================================================================== --- boost/locale/utf.hpp (revision 81589) +++ boost/locale/utf.hpp (revision 81590) @@ -219,16 +219,22 @@ if(BOOST_LOCALE_UNLIKELY(p==e)) return incomplete; tmp = *p++; + if (!is_trail(tmp)) + return illegal; c = (c << 6) | ( tmp & 0x3F); case 2: if(BOOST_LOCALE_UNLIKELY(p==e)) return incomplete; tmp = *p++; + if (!is_trail(tmp)) + return illegal; c = (c << 6) | ( tmp & 0x3F); case 1: if(BOOST_LOCALE_UNLIKELY(p==e)) return incomplete; tmp = *p++; + if (!is_trail(tmp)) + return illegal; c = (c << 6) | ( tmp & 0x3F); } Index: libs/locale/test/test_codepage_converter.cpp =================================================================== --- libs/locale/test/test_codepage_converter.cpp (revision 81589) +++ libs/locale/test/test_codepage_converter.cpp (revision 81590) @@ -140,6 +140,20 @@ TEST_TO("\xf8\x90\x80\x80\x80",illegal); // 400 0000 TEST_TO("\xfd\xbf\xbf\xbf\xbf\xbf",illegal); // 7fff ffff + std::cout << "-- Invalid trail" << std::endl; + TEST_TO("\xC2\x7F",illegal); + TEST_TO("\xdf\x7F",illegal); + TEST_TO("\xe0\x7F\x80",illegal); + TEST_TO("\xef\xbf\x7F",illegal); + TEST_TO("\xe0\x7F\x80",illegal); + TEST_TO("\xef\xbf\x7F",illegal); + TEST_TO("\xf0\x7F\x80\x80",illegal); + TEST_TO("\xf4\x7f\xbf\xbf",illegal); + TEST_TO("\xf0\x90\x7F\x80",illegal); + TEST_TO("\xf4\x8f\x7F\xbf",illegal); + TEST_TO("\xf0\x90\x80\x7F",illegal); + TEST_TO("\xf4\x8f\xbf\x7F",illegal); + std::cout << "-- Invalid length" << std::endl; /// Test that this actually works