Hi,
I've noticed that the test 'test_string_matching' introduced in r1505336 [1]
violates the contracts of the svn_cstring__match_length and
svn_cstring__reverse_match_length functions:
[[[
Return the number of bytes before A and B that don't differ. If no
difference can be found in the first MAX_LEN characters, MAX_LEN will
be returned. Please note that A-MAX_LEN and B-MAX_LEN must both be
valid addresses.
]]]
Currently this test sets the MAX_LEN value to the maximum of the string
lengths. This violates the "valid addresses" part of the contract and results
in undefined behavior due to the out-of-bounds memory access.
On my 64-bit Ubuntu machine this test fails when compiled with the string
pooling optimization (gcc -O1 / -O2 / -O3):
[[[
PASS: string-test 27: check deletion from svn_stringbuf_t
PASS: string-test 28: check replacement in svn_stringbuf_t
PASS: string-test 29: test string similarity scores
svn_tests: E200006: assertion 'rmatch_len == test->rmatch_len' failed at
subversion/tests/libsvn_subr/string-test.c:823
FAIL: string-test 30: test string matching
]]]
I've attached a patch that fixes this issue.
[1]: https://svn.apache.org/viewvc?view=revision&revision=r1505336
Thanks and regards,
Evgeny Kotkov
Index: subversion/tests/libsvn_subr/string-test.c
===================================================================
--- subversion/tests/libsvn_subr/string-test.c (revision 1507762)
+++ subversion/tests/libsvn_subr/string-test.c (working copy)
@@ -812,7 +812,7 @@ test_string_matching(apr_pool_t *pool)
{
apr_size_t a_len = strlen(test->a);
apr_size_t b_len = strlen(test->b);
- apr_size_t max_match = MAX(a_len, b_len);
+ apr_size_t max_match = MIN(a_len, b_len);
apr_size_t match_len
= svn_cstring__match_length(test->a, test->b, max_match);
apr_size_t rmatch_len
Fix the out-of-bounds memory access in test_string_matching_test. Follow-up
to r1505336.
* subversion/tests/libsvn_subr/string-test.c
(test_string_matching): Correctly initialize the 'max_match' value to avoid
out-of-bounds memory access.
Patch by: Evgeny Kotkov <evgeny.kotkov{_AT_}visualsvn.com>