On Sat, Jan 31, 2009 at 12:45 AM, Kouhei Sutou <kou_at_cozmixng.org> wrote:
> Hi,
>
> In <497F4B21.5030008_at_mail.utexas.edu>
> "Segfault in ruby tests" on Tue, 27 Jan 2009 11:57:53 -0600,
> "Hyrum K. Wright" <hyrum_wright_at_mail.utexas.edu> wrote:
>
>> The ruby bindings tests are segfaulting on the buildbot. I can reproduce locally:
>
> I don't know about the detail of the problem but this patch
> will solve the problem:
>
> Index: subversion/libsvn_delta/text_delta.c
> ===================================================================
> --- subversion/libsvn_delta/text_delta.c (revision 35611)
> +++ subversion/libsvn_delta/text_delta.c (working copy)
> @@ -788,8 +788,11 @@
> apr_pool_t *pool)
> {
> svn_txdelta_stream_t *txstream;
> + apr_pool_t *sub_pool;
> svn_error_t *err;
>
> + sub_pool = svn_pool_create(pool);
> +
> /* ### this is a hack. we should simply read from the stream, construct
> ### some windows, and pass those to the handler. there isn't any reason
> ### to crank up a full "diff" algorithm just to copy a stream.
> @@ -798,8 +801,8 @@
>
> /* Create a delta stream which converts an *empty* bytestream into the
> target bytestream. */
> - svn_txdelta(&txstream, svn_stream_empty(pool), stream, pool);
> - err = svn_txdelta_send_txstream(txstream, handler, handler_baton, pool);
> + svn_txdelta(&txstream, svn_stream_empty(sub_pool), stream, sub_pool);
> + err = svn_txdelta_send_txstream(txstream, handler, handler_baton, sub_pool);
>
> if (digest && (! err))
> {
> @@ -809,6 +812,8 @@
> memcpy(digest, result_md5, APR_MD5_DIGESTSIZE);
> }
>
> + svn_pool_destroy(sub_pool);
> +
> return err;
> }
>
>
In the spirit of kou's patch, but in the bindings area:
Index: subversion/bindings/swig/svn_delta.i
===================================================================
--- subversion/bindings/swig/svn_delta.i (revision 35664)
+++ subversion/bindings/swig/svn_delta.i (working copy)
@@ -232,8 +232,10 @@
void **handler_baton,
apr_pool_t *pool)
{
+ apr_pool_t *sub_pool = sub_pool = svn_pool_create(pool);
svn_txdelta_apply(source, target, result_digest, error_info,
pool, handler, handler_baton);
+ svn_pool_destroy(sub_pool);
}
static svn_error_t *
Disclaimer: since I'm not reproducing the error, I'm not sure it will work.
Looking around a little in libsvn_delta, it seems to me that the
subpool created in svn_txdelta_apply that isn't destroyed there should
have a comment explaining why? Or if the subpool was destroyed, does
that help with the segfault? Or maybe I just don't know what I'm
talking about :-)
--
Joe
------------------------------------------------------
http://subversion.tigris.org/ds/viewMessage.do?dsForumId=462&dsMessageId=1109238
Received on 2009-02-05 22:53:06 CET