summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMathias Stearn <mathias@10gen.com>2013-01-08 23:09:28 -0500
committerMathias Stearn <mathias@10gen.com>2013-01-09 17:42:18 -0500
commit0c05bdf0be1afa381548372a9e8ea6e2726fc018 (patch)
tree7597d77d0aaa705a899dd234d1b2fcb78c3a85af
parentb2ab9737664420fbaeaf16c39f06bd53dfc13a4f (diff)
downloadmongo-0c05bdf0be1afa381548372a9e8ea6e2726fc018.tar.gz
Fix StringData::substr with single argument
Original version had an overflow bug
-rw-r--r--src/mongo/base/string_data-inl.h3
-rw-r--r--src/mongo/base/string_data_test.cpp47
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 ) {