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"),
> 
> 

Reply via email to