Author: dannas
Date: Tue Mar 22 11:19:44 2011
New Revision: 1084138
URL: http://svn.apache.org/viewvc?rev=1084138&view=rev
Log:
Fix issue #3809 - 'svn patch' accepts invalid git diff headers.
* subversion/libsvn_diff/parse-diff.c
(svn_diff_parse_next_patch): Disallow non-header lines in the header.
* subversion/tests/libsvn_diff/parse-diff-test.c
(bad_git_diff_header): Remove sentence that says that the test is
failing.
(test_funcs): Remove XFAIL marker.
Modified:
subversion/trunk/subversion/libsvn_diff/parse-diff.c
subversion/trunk/subversion/tests/libsvn_diff/parse-diff-test.c
Modified: subversion/trunk/subversion/libsvn_diff/parse-diff.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_diff/parse-diff.c?rev=1084138&r1=1084137&r2=1084138&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_diff/parse-diff.c (original)
+++ subversion/trunk/subversion/libsvn_diff/parse-diff.c Tue Mar 22 11:19:44
2011
@@ -1286,6 +1286,7 @@ svn_diff_parse_next_patch(svn_patch_t **
{
apr_off_t pos, last_line;
svn_boolean_t eof;
+ svn_boolean_t valid_header_line = FALSE;
svn_boolean_t line_after_tree_header_read = FALSE;
apr_pool_t *iterpool;
enum parse_state state = state_start;
@@ -1323,6 +1324,8 @@ svn_diff_parse_next_patch(svn_patch_t **
iterpool));
}
+ valid_header_line = FALSE;
+
/* Run the state machine. */
for (i = 0; i < (sizeof(transitions) / sizeof(transitions[0])); i++)
{
@@ -1332,6 +1335,7 @@ svn_diff_parse_next_patch(svn_patch_t **
{
SVN_ERR(transitions[i].fn(&state, line->data, *patch,
result_pool, iterpool));
+ valid_header_line = TRUE;
break;
}
}
@@ -1352,7 +1356,19 @@ svn_diff_parse_next_patch(svn_patch_t **
break;
}
else if (state == state_git_tree_seen)
- line_after_tree_header_read = TRUE;
+ {
+ line_after_tree_header_read = TRUE;
+ }
+ else if (! valid_header_line && state != state_start)
+ {
+ /* We've encountered an invalid diff header.
+ *
+ * Rewind to the start of the line just read - it may be a new
+ * header that begins there. */
+ SVN_ERR(svn_io_file_seek(patch_file->apr_file, APR_SET, &last_line,
+ scratch_pool));
+ state = state_start;
+ }
}
while (! eof);
Modified: subversion/trunk/subversion/tests/libsvn_diff/parse-diff-test.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/libsvn_diff/parse-diff-test.c?rev=1084138&r1=1084137&r2=1084138&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/libsvn_diff/parse-diff-test.c (original)
+++ subversion/trunk/subversion/tests/libsvn_diff/parse-diff-test.c Tue Mar 22
11:19:44 2011
@@ -120,9 +120,8 @@ static const char *git_tree_and_text_uni
"" NL;
/* Only the last git diff header is valid. The other ones either misses a
- * path element or has noise between lines that must be continous. The
- * test test_bad_git_diff_headers currently fails because the headers with
- * random noise are tolerated. See issue #3809. */
+ * path element or has noise between lines that must be continous. See
+ * issue #3809. */
static const char *bad_git_diff_header =
"Index: iota.copied" NL
"===================================================================" NL
@@ -925,7 +924,7 @@ struct svn_test_descriptor_t test_funcs[
"test git unidiff parsing"),
SVN_TEST_PASS2(test_parse_git_tree_and_text_diff,
"test git unidiff parsing of tree and text changes"),
- SVN_TEST_XFAIL2(test_bad_git_diff_headers,
+ SVN_TEST_PASS2(test_bad_git_diff_headers,
"test badly formatted git diff headers"),
SVN_TEST_PASS2(test_parse_property_diff,
"test property unidiff parsing"),