diff options
author | Mathias Stearn <mathias@10gen.com> | 2013-01-08 23:09:28 -0500 |
---|---|---|
committer | Mathias Stearn <mathias@10gen.com> | 2013-01-09 17:42:18 -0500 |
commit | 0c05bdf0be1afa381548372a9e8ea6e2726fc018 (patch) | |
tree | 7597d77d0aaa705a899dd234d1b2fcb78c3a85af | |
parent | b2ab9737664420fbaeaf16c39f06bd53dfc13a4f (diff) | |
download | mongo-0c05bdf0be1afa381548372a9e8ea6e2726fc018.tar.gz |
Fix StringData::substr with single argument
Original version had an overflow bug
-rw-r--r-- | src/mongo/base/string_data-inl.h | 3 | ||||
-rw-r--r-- | src/mongo/base/string_data_test.cpp | 47 |
2 files changed, 39 insertions, 11 deletions
diff --git a/src/mongo/base/string_data-inl.h b/src/mongo/base/string_data-inl.h index a99a78d230e..00b403a569c 100644 --- a/src/mongo/base/string_data-inl.h +++ b/src/mongo/base/string_data-inl.h @@ -91,7 +91,8 @@ namespace mongo { if ( pos > size() ) throw std::out_of_range( "out of range" ); - if ( pos + n > size() ) + // truncate to end of string + if ( n > size() - pos ) n = size() - pos; return StringData( _data + pos, n ); diff --git a/src/mongo/base/string_data_test.cpp b/src/mongo/base/string_data_test.cpp index eecda842c25..c8ca72ca76c 100644 --- a/src/mongo/base/string_data_test.cpp +++ b/src/mongo/base/string_data_test.cpp @@ -124,18 +124,45 @@ namespace { } // this is to verify we match std::string -#define SUBSTR_TEST_HELP(big,small,start,len) \ - ASSERT_EQUALS( (string)small, ((string)big).substr( start, len ) ); \ - ASSERT_EQUALS( StringData(small), StringData(big).substr( start, len ) ); + void SUBSTR_TEST_HELP(StringData big, StringData small, size_t start, size_t len) { + ASSERT_EQUALS(small.toString(), big.toString().substr(start, len)); + ASSERT_EQUALS(small, StringData(big).substr(start, len)); + } + void SUBSTR_TEST_HELP(StringData big, StringData small, size_t start) { + ASSERT_EQUALS(small.toString(), big.toString().substr(start)); + ASSERT_EQUALS(small, StringData(big).substr(start)); + } + +// [12] is number of args to substr +#define SUBSTR_1_TEST_HELP(big,small,start) \ + ASSERT_EQUALS( StringData(small).toString(), StringData(big).toString().substr(start) ); \ + ASSERT_EQUALS( StringData(small), StringData(big).substr(start) ); + +#define SUBSTR_2_TEST_HELP(big,small,start,len) \ + ASSERT_EQUALS( StringData(small).toString(), StringData(big).toString().substr(start, len) ); \ + ASSERT_EQUALS( StringData(small), StringData(big).substr(start, len) ); TEST(Substr, Simple1 ) { - SUBSTR_TEST_HELP( "abcde", "abcde", 0, 10 ); - SUBSTR_TEST_HELP( "abcde", "abcde", 0, 5 ); - SUBSTR_TEST_HELP( "abcde", "abc", 0, 3 ); - SUBSTR_TEST_HELP( "abcde", "cde", 2, 5 ); - SUBSTR_TEST_HELP( "abcde", "cde", 2, 3 ); - SUBSTR_TEST_HELP( "abcde", "cd", 2, 2 ); - SUBSTR_TEST_HELP( "abcde", "cd", 2, 2 ); + SUBSTR_1_TEST_HELP( "abcde", "abcde", 0 ); + SUBSTR_2_TEST_HELP( "abcde", "abcde", 0, 10 ); + SUBSTR_2_TEST_HELP( "abcde", "abcde", 0, 5 ); + SUBSTR_2_TEST_HELP( "abcde", "abc", 0, 3 ); + SUBSTR_1_TEST_HELP( "abcde", "cde", 2 ); + SUBSTR_2_TEST_HELP( "abcde", "cde", 2, 5 ); + SUBSTR_2_TEST_HELP( "abcde", "cde", 2, 3 ); + SUBSTR_2_TEST_HELP( "abcde", "cd", 2, 2 ); + SUBSTR_2_TEST_HELP( "abcde", "cd", 2, 2 ); + SUBSTR_1_TEST_HELP( "abcde", "", 5 ); + SUBSTR_2_TEST_HELP( "abcde", "", 5, 0 ); + SUBSTR_2_TEST_HELP( "abcde", "", 5, 10 ); + + // make sure we don't blow past the end of the StringData + SUBSTR_1_TEST_HELP( StringData("abcdeXXX", 5), "abcde", 0); + SUBSTR_2_TEST_HELP( StringData("abcdeXXX", 5), "abcde", 0, 10); + SUBSTR_1_TEST_HELP( StringData("abcdeXXX", 5), "de", 3); + SUBSTR_2_TEST_HELP( StringData("abcdeXXX", 5), "de", 3, 7); + SUBSTR_1_TEST_HELP( StringData("abcdeXXX", 5), "", 5); + SUBSTR_2_TEST_HELP( StringData("abcdeXXX", 5), "", 5, 1); } TEST( equalCaseInsensitiveTest, Simple1 ) { |