diff --git a/src/bdecode.cpp b/src/bdecode.cpp index 4a729fc12..da1c666db 100644 --- a/src/bdecode.cpp +++ b/src/bdecode.cpp @@ -796,6 +796,7 @@ namespace { std::int64_t len = t - '0'; char const* const str_start = start; ++start; + if (start >= end) TORRENT_FAIL_BDECODE(bdecode_errors::unexpected_eof); bdecode_errors::error_code_enum e = bdecode_errors::no_error; start = parse_int(start, end, ':', len, e); if (e) diff --git a/test/test_bdecode.cpp b/test/test_bdecode.cpp index 54ee5a8ac..5b2a5afe4 100644 --- a/test/test_bdecode.cpp +++ b/test/test_bdecode.cpp @@ -483,10 +483,10 @@ TORRENT_TEST(unepected_eof) std::printf("%s\n", print_entry(e).c_str()); } -// test unexpected EOF (really expected terminator) +// test unexpected EOF in string length TORRENT_TEST(unepected_eof2) { - char b[] = "l2:..0"; // expected terminating 'e' instead of '0' + char b[] = "l2:..0"; // expected ':' delimiter instead of EOF bdecode_node e; error_code ec; @@ -494,7 +494,7 @@ TORRENT_TEST(unepected_eof2) int ret = bdecode(b, b + sizeof(b)-1, e, ec, &pos); TEST_EQUAL(ret, -1); TEST_EQUAL(pos, 6); - TEST_EQUAL(ec, error_code(bdecode_errors::expected_colon)); + TEST_EQUAL(ec, error_code(bdecode_errors::unexpected_eof)); std::printf("%s\n", print_entry(e).c_str()); }