Hello,

when passing a revision string in the form of "{DATE}" to the Perl
bindings, the passed string is unexpectedly modified during parsing and
the closing brace will be removed. Here is a Perl script reproducing the
issue with an example:

---8<---

use SVN::Client;

my $ctx = SVN::Client->new();

my $repo = "http://svn.apache.org/repos/asf/subversion/trunk";;
my $rev = "{2016-11-02 12:34:56}";

print "Before: $rev\n";

$ctx->info($repo, "HEAD", $rev, sub { print $_[1]->rev . "\n"; }, 0);

print "After:  $rev\n";

--->8---

Running this script will give the following output, note the missing
close brace at the end of the third line:

Before: {2016-11-02 12:34:56}
1767638
After:  {2016-11-02 12:34:56

I experienced and reproduced this problem with perl 5.20 and 5.24. Due
to different internal memory handling, perl <= 5.18 might not be
affected by this.

This problem originates in the function svn_swig_pl_set_revision in
subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.c. I am
attaching a patch that solves this problem by undoing the null byte
insertion, after the modified string was passed to svn_parse_date.

[[
* subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.c:
  (svn_swig_pl_set_revision): Undo revision variable modifications
  when using "{DATE}" syntax.
]]

Rainer
Index: subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.c
===================================================================
--- subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.c        
(revision 1767623)
+++ subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.c        
(working copy)
@@ -470,9 +470,11 @@ svn_opt_revision_t *svn_swig_pl_set_revision(svn_o
             if (!end)
                 maybe_croak(("unknown opt_revision_t string \"%s\": "
                              "missing closing brace for \"{DATE}\"", input));
+            char saved = *end;
             *end = '\0';
             err = svn_parse_date (&matched, &tm,
                                   input + 1, apr_time_now(), pool);
+            *end = saved;
             if (err) {
                 svn_error_clear (err);
                 maybe_croak(("unknown opt_revision_t string \"{%s}\": "

Reply via email to