You can declare VALID_HEADER_FILE in the do{} loop's scope. (I spotted this because the double initialization stood out.)
dan...@apache.org wrote on Tue, Mar 22, 2011 at 11:19:44 -0000: > 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"), > >