Author: stefan2
Date: Sat Jan 10 23:46:28 2015
New Revision: 1650834
URL: http://svn.apache.org/r1650834
Log:
Fix stringbuf insertion and replacement for the case that the source is
within the target string itself and contains NUL chars. Also, make the
test cases cover data containing NUL for those operations.
* subversion/libsvn_subr/string.c
(svn_stringbuf_insert,
svn_stringbuf_replace): Since the source data is binary, we need a binary
temp. copy - not a string-y one.
* subversion/tests/libsvn_subr/string-test.c
(test_stringbuf_insert,
test_stringbuf_replace): Add calls that insert strings containing NUL
and insert NULs from within the string.
Found by: julianfoad
Modified:
subversion/trunk/subversion/libsvn_subr/string.c
subversion/trunk/subversion/tests/libsvn_subr/string-test.c
Modified: subversion/trunk/subversion/libsvn_subr/string.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_subr/string.c?rev=1650834&r1=1650833&r2=1650834&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_subr/string.c (original)
+++ subversion/trunk/subversion/libsvn_subr/string.c Sat Jan 10 23:46:28 2015
@@ -658,7 +658,7 @@ svn_stringbuf_insert(svn_stringbuf_t *st
if (bytes + count > str->data && bytes < str->data + str->blocksize)
{
/* special case: BYTES overlaps with this string -> copy the source */
- const char *temp = apr_pstrndup(str->pool, bytes, count);
+ const char *temp = apr_pmemdup(str->pool, bytes, count);
svn_stringbuf_insert(str, pos, temp, count);
}
else
@@ -706,7 +706,7 @@ svn_stringbuf_replace(svn_stringbuf_t *s
if (bytes + new_count > str->data && bytes < str->data + str->blocksize)
{
/* special case: BYTES overlaps with this string -> copy the source */
- const char *temp = apr_pstrndup(str->pool, bytes, new_count);
+ const char *temp = apr_pmemdup(str->pool, bytes, new_count);
svn_stringbuf_replace(str, pos, old_count, temp, new_count);
}
else
Modified: subversion/trunk/subversion/tests/libsvn_subr/string-test.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/libsvn_subr/string-test.c?rev=1650834&r1=1650833&r2=1650834&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/libsvn_subr/string-test.c (original)
+++ subversion/trunk/subversion/tests/libsvn_subr/string-test.c Sat Jan 10
23:46:28 2015
@@ -604,7 +604,19 @@ test_stringbuf_insert(apr_pool_t *pool)
SVN_TEST_STRING_ASSERT(a->data, "test hello, world");
svn_stringbuf_insert(a, 1200, "!", 1);
- return expect_stringbuf_equal(a, "test hello, world!", pool);
+ SVN_TEST_STRING_ASSERT(a->data, "test hello, world!");
+
+ svn_stringbuf_insert(a, 4, "\0-\0", 3);
+ SVN_TEST_ASSERT(svn_stringbuf_compare(a,
+ svn_stringbuf_ncreate("test\0-\0 hello, world!",
+ 21, pool)));
+
+ svn_stringbuf_insert(a, 14, a->data + 4, 3);
+ SVN_TEST_ASSERT(svn_stringbuf_compare(a,
+ svn_stringbuf_ncreate("test\0-\0 hello,\0-\0 world!",
+ 24, pool)));
+
+ return SVN_NO_ERROR;
}
static svn_error_t *
@@ -643,8 +655,24 @@ test_stringbuf_replace(apr_pool_t *pool)
SVN_TEST_STRING_ASSERT(a->data, "test hello, world!");
svn_stringbuf_replace(a, 1200, 199, "!!", 2);
+ SVN_TEST_STRING_ASSERT(a->data, "test hello, world!!!");
+
+ svn_stringbuf_replace(a, 10, 2, "\0-\0", 3);
+ SVN_TEST_ASSERT(svn_stringbuf_compare(a,
+ svn_stringbuf_ncreate("test hello\0-\0world!!!",
+ 21, pool)));
+
+ svn_stringbuf_replace(a, 10, 3, a->data + 10, 3);
+ SVN_TEST_ASSERT(svn_stringbuf_compare(a,
+ svn_stringbuf_ncreate("test hello\0-\0world!!!",
+ 21, pool)));
+
+ svn_stringbuf_replace(a, 19, 1, a->data + 10, 3);
+ SVN_TEST_ASSERT(svn_stringbuf_compare(a,
+ svn_stringbuf_ncreate("test hello\0-\0world!\0-\0!",
+ 23, pool)));
- return expect_stringbuf_equal(a, "test hello, world!!!", pool);
+ return SVN_NO_ERROR;
}
static svn_error_t *