You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@subversion.apache.org by "HAYASHI, Shinpei" <ha...@rerecode.net> on 2008/03/30 11:23:50 UTC

[PATCH] (Ruby bindings) Svn::Ra::Session#open doesn't set callback_baton correctly

Hi,

I found following code causes a NoMethodError on subversion-1.4.6 with
ruby-1.8.6.

  $ svn --version
  svn, version 1.4.6 (r28521)
     compiled Mar 10 2008, 14:18:48

  $ cat svn_test.rb
  require 'svn/ra'
  context = Svn::Client::Context.new
  callbacks = Svn::Ra::Callbacks.new(context.auth_baton)
  session = Svn::Ra::Session.open("http://localhost/", {}, callbacks)
  session.commit_editor2("commit log") {}

  $ ruby -v svn_test.rb
  ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-freebsd6]
  /usr/local/lib/ruby/site_ruby/1.8/svn/util.rb:60:in `svn_ra_get_commit_editor2': undefined method `get_wc_prop' for false:FalseClass (NoMethodError)
         from /usr/local/lib/ruby/site_ruby/1.8/svn/util.rb:60:in `call'
         from /usr/local/lib/ruby/site_ruby/1.8/svn/util.rb:60:in `get_commit_editor2'
         from /usr/local/lib/ruby/site_ruby/1.8/svn/ra.rb:64:in `commit_editor2'
         from svn_test.rb:5

In this test, localhost:80 is set up by Apache with mod_dav_svn as follows:

  <Directory /home/hayashi/svn_test>
      Order allow,deny
      Allow from all
  </Directory>
  <Location />
      DAV svn
      SVNPath /home/hayashi/svn_test
  </Location>

Above behavior may be from a bug of svn_swig_rb_setup_ra_callbacks.
The call-flow of above code fragment is following:

  Svn::Ra:Session.open                  (Ruby   svn/ra.rb)
    -> Svn::Ra.open2/_wrap_svn_ra_open2 (Ruby/C svn_ra.c)
      -> svn_swig_rb_setup_ra_callbacks (C      libsvn_swig_ruby/swigutil_rb.c)
    -> svn_ra_open2

4th argument of svn_ra_open2 (the callback_baton) doesn't set up successfully. 
The value is send to svn_ra_open2 as an initial, (void *)0.
 As a result, in a callbacking the baton is passed to a callback function
 (e.g. ra_callbacks_get_wc_prop) as `false' because (void*)0 == Qfalse.

In my observation, the problem is not fixed in trunk.
Following patch (for trunk) will be a solution.


[[[
Fix a bug that Svn::Ra::Session#open doesn't set callback_baton correctly.

* subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.c
  (svn_swig_rb_setup_ra_callbacks): initialize the baton.
]]]


Index: subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.c
===================================================================
--- subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.c        (revision 30116)
+++ subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.c        (working copy)
@@ -2628,6 +2628,7 @@
   }

   *callbacks = apr_pcalloc(pool, sizeof(**callbacks));
+  *baton = (void *)rb_callbacks;

   (*callbacks)->open_tmp_file = ra_callbacks_open_tmp_file;
   (*callbacks)->auth_baton = auth_baton;


Thanks,
-- 
HAYASHI, Shinpei <ha...@rerecode.net>


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org

Re: [PATCH] (Ruby bindings) Svn::Ra::Session#open doesn't set callback_baton correctly

Posted by Kouhei Sutou <ko...@cozmixng.org>.
Hi,

In <20...@rerecode.net>
  "[PATCH] (Ruby bindings) Svn::Ra::Session#open doesn't set callback_baton correctly" on Sun, 30 Mar 2008 20:23:50 +0900,
  "HAYASHI, Shinpei" <ha...@rerecode.net> wrote:

> [[[
> Fix a bug that Svn::Ra::Session#open doesn't set callback_baton correctly.
> 
> * subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.c
>   (svn_swig_rb_setup_ra_callbacks): initialize the baton.
> ]]]

Thanks for reporting. I've committed your patch into trunk.

--
kou

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org