On Wed, May 20, 2015 at 6:19 AM, James McCoy <jamessan_at_debian.org> wrote:
> I'm still experiencing the crash in 1.9.0-rc1 unless I apply the
> original change I suggested to the generated
> subversion/bindings/swig/perl/native/svn_delta.c. I'm not sure how that
> specific part of the file is generated, so I'll just attach a diff of
> the generated file.
Looking at your patch, the offending line may very well be the cause of the
it stores something onto the top (thats the argvi index) of the Perl
argument stack (which
is also used to hold a Perl sub's return values), but doesn't make sure
the stack is large enough. Typically you should see generated code like this
if (argvi >= items) EXTEND(sp,1); /* grow the stack by one if we're
arguments (which are guaranteed
ST(argvi++) = ... /* push a return value
on top of the stack */
But the problem is deeper: the handling of svn_txdelta_apply's parameter
result_digest is wrong. It's a weird kind of output parameter: it's the
of an array of bytes for an MD5 checksum. But svn_txdelta_apply doesn't
actually store something in there, this address is "remembered" by the
handler and baton and is filled in by the final call to the handler.
This is NOT how output parameters are handled in the Perl bindings:
output parameters in C become actual return values in Perl (since Perl can
return multiple values from a sub).
The generated code treats result_digest as a regular output parameter
(which won't work - at least it won't give you the actual MD5), but
also generates the offending line. The easiest fix would be to ignore
the passed in result_digest and set it to NULL when actually calling
svn_txdelta_apply (meaning: we're not interested). I think that's
what the Python bindings do.
I'll work on this over the weekend if nobody beats me too it.
Received on 2015-05-20 10:12:59 CEST