Hi,

I found a little bug in parsing a change revision: If the number,
given to the --change argument, starts with a double minus or with
`-r-`, the command aborts. This patch fixes this bug.

Steps to reproduce:

$ svn diff https://svn.apache.org/repos/asf -c --123
svn: E235000: In file '..\..\..\subversion\libsvn_client\ra.c' line
692: assertion failed (SVN_IS_VALID_REVNUM(start_revnum))

Or...

$ svn diff https://svn.apache.org/repos/asf -c -r-123
svn: E235000: In file '..\..\..\subversion\libsvn_client\ra.c' line
692: assertion failed (SVN_IS_VALID_REVNUM(start_revnum))

The same would happen if the svn diff command is invoked from a
working copy, without URL.

[[[
Fix bug: check the change argument for a double minus at the start.

If changeno is negative and is_negative is TRUE, raise
SVN_ERR_CL_ARG_PARSING_ERROR, because string with a double minus is
not a valid number.

* subversion/svn/svn.c
  (sub_main): If changeno is negative and is_negative is TRUE, raise
  SVN_ERR_CL_ARG_PARSING_ERROR.
* subversion/tests/cmdline/diff_tests.py
  (diff_invalid_change_arg): New test.
  (test_list): Run new test.
]]]

Best regards,
Timofei Zhakov
Index: C:/tima/svn-trunk/subversion/svn/svn.c
===================================================================
--- C:/tima/svn-trunk/subversion/svn/svn.c      (revision 1917823)
+++ C:/tima/svn-trunk/subversion/svn/svn.c      (working copy)
@@ -2391,6 +2391,14 @@ sub_main(int *exit_code, int argc, const char *arg
                                           _("There is no change 0"));
                 }
 
+              /* The revision number cannot contain a double minus */
+              if (changeno < 0 && is_negative)
+                {
+                  return svn_error_createf(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+                                           _("Non-numeric change argument (%s) 
"
+                                             "given to -c"), change_str);
+                }
+
               if (is_negative)
                 changeno = -changeno;
 
Index: C:/tima/svn-trunk/subversion/tests/cmdline/diff_tests.py
===================================================================
--- C:/tima/svn-trunk/subversion/tests/cmdline/diff_tests.py    (revision 
1917823)
+++ C:/tima/svn-trunk/subversion/tests/cmdline/diff_tests.py    (working copy)
@@ -5329,7 +5329,21 @@ def diff_nonexistent_in_wc(sbox):
   svntest.actions.run_and_verify_svn(expected_output_head_base, [],
                                      'diff', '-r', '1')
 
+def diff_invalid_change_arg(sbox):
+  "invalid change argument"
 
+  sbox.build()
+
+  svntest.actions.run_and_verify_svn(
+    None,
+    (r'.*svn: E205000: Non-numeric change argument \(--1\) given to -c'),
+    'diff', sbox.wc_dir, '-c', '--1')
+
+  svntest.actions.run_and_verify_svn(
+    None,
+    (r'.*svn: E205000: Non-numeric change argument \(-r-1\) given to -c'),
+    'diff', sbox.wc_dir, '-c', '-r-1')
+
 ########################################################################
 #Run the tests
 
@@ -5431,6 +5445,7 @@ test_list = [ None,
               diff_file_replaced_by_symlink,
               diff_git_format_copy,
               diff_nonexistent_in_wc,
+              diff_invalid_change_arg,
               ]
 
 if __name__ == '__main__':

Reply via email to