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