Subject: [ruby-ffi] Re: Problem with AutoPointer and ManagedStruct |
From: zenChild |
Date: 12/10/10 8:48 AM |
To: ruby-ffi |
This seems to work for my issue. Is there any reason why this shouldn't be done? output_token = LibGSSAPI::GssBufferDesc.new output_token[:length] = 0 output_token[:value] = nil @o_buff = LibGSSAPI::MGssBufferDesc.new(FFI::Pointer.new(output_token.pointer)) ... method call that fills the output_token ... the release now happens automatically during GC without SegFault and I can use the ManagedStruct the way I could the old Struct. Cheers, Dan Wanek On Dec 9, 3:24 pm, zenChild <dan.wa...@gmail.com> wrote:
https://github.com/zenchild/gssapi Thanks for your input! ------------------snip ------------------- $: << 'lib' require 'gssapi' include GSSAPI @host_name = 'mytesthost.example.org' @int_name = nil buff_str = LibGSSAPI::GssBufferDesc.new host_str = "host@#{@host_name}" buff_str[:length] = host_str.length buff_val = FFI::MemoryPointer.from_string(host_str) # assign to var so it isn't garbage collected buff_str[:value] = buff_val name = FFI::MemoryPointer.new :pointer # gss_name_t min_stat = FFI::MemoryPointer.new :uint32 maj_stat = LibGSSAPI.gss_import_name(min_stat, buff_str.pointer, LibGSSAPI.GSS_C_NT_HOSTBASED_SERVICE, name) @int_name = name.get_pointer(0) LibGSSAPI::GssNameT.new(@int_name) min_stat = FFI::MemoryPointer.new :uint32 no_cred = FFI::MemoryPointer.new :pointer # GSS_C_NO_CREDENTIAL no_cred.write_int 0 ctx = FFI::MemoryPointer.new :pointer # GSS_C_NO_CONTEXT ctx.write_int 0 no_chn_bind = FFI::MemoryPointer.new :pointer # no_chn_bind.write_int 0 input_token = LibGSSAPI::GssBufferDesc.new input_token[:length] = 0 input_token[:value] = nil output_token = FFI::MemoryPointer.new :pointer mech = LibGSSAPI.gss_mech_krb5 maj_stat = LibGSSAPI.gss_init_sec_context(min_stat, nil, ctx, @int_name, mech, (LibGSSAPI::GSS_C_MUTUAL_FLAG | LibGSSAPI::GSS_C_SEQUENCE_FLAG), 0, nil, input_token.pointer, nil, output_token, nil, nil) if(maj_stat == 0 || maj_stat == 1) @context = ctx.get_pointer(0) LibGSSAPI::MGssBufferDesc.new(output_token.get_pointer(0)) end ----------------- snip ------------------- ---------------backtrace-------------- ruby 1.9.2p0 (2010-08-18 revision 29036) [x86_64-linux] -- control frame ---------- c:0007 p:---- s:0025 b:0025 l:000024 d:000024 CFUNC :gss_release_buffer c:0006 p:0065 s:0020 b:0020 l:000019 d:000019 METHOD /home/dwanek/ Coding/gssapi/lib/gssapi/lib_gssapi.rb:46 c:0005 p:---- s:0014 b:0014 l:000013 d:000013 FINISH c:0004 p:---- s:0012 b:0012 l:000011 d:000011 CFUNC :call c:0003 p:0028 s:0008 b:0008 l:000007 d:000007 METHOD /home/dwanek/.rvm/ gems/ruby-1.9.2-p0/gems/ffi-1.0.1/lib/ffi/autopointer.rb:107 c:0002 p:---- s:0004 b:0004 l:000003 d:000003 FINISH c:0001 p:0000 s:0002 b:0002 l:001578 d:001578 TOP --------------------------- -- Ruby level backtrace information ---------------------------------------- /home/dwanek/.rvm/gems/ruby-1.9.2-p0/gems/ffi-1.0.1/lib/ffi/ autopointer.rb:107:in `call' /home/dwanek/.rvm/gems/ruby-1.9.2-p0/gems/ffi-1.0.1/lib/ffi/ autopointer.rb:107:in `call' /home/dwanek/Coding/gssapi/lib/gssapi/lib_gssapi.rb:46:in `release' /home/dwanek/Coding/gssapi/lib/gssapi/lib_gssapi.rb:46:in `gss_release_buffer' -- C level backtrace information ------------------------------------------- /home/dwanek/.rvm/rubies/ruby-1.9.2-p0/lib/libruby.so. 1.9(rb_vm_bugreport+0x5f) [0x7f78aa22bb2f] /home/dwanek/.rvm/rubies/ruby-1.9.2-p0/lib/libruby.so.1.9(+0x62b96) [0x7f78aa113b96] /home/dwanek/.rvm/rubies/ruby-1.9.2-p0/lib/libruby.so.1.9(rb_bug+0xb3) [0x7f78aa113d33] /home/dwanek/.rvm/rubies/ruby-1.9.2-p0/lib/libruby.so.1.9(+0x10bea5) [0x7f78aa1bcea5] /lib/libpthread.so.0(+0xfb40) [0x7f78a9ea3b40] /usr/lib/libgssapi_krb5.so(gss_release_buffer+0x14) [0x7f78a8454ed4] /home/dwanek/.rvm/gems/ruby-1.9.2-p0/gems/ffi-1.0.1/lib/ ffi_c.so(ffi_call_unix64+0x4c) [0x7f78a868e44c] /home/dwanek/.rvm/gems/ruby-1.9.2-p0/gems/ffi-1.0.1/lib/ ffi_c.so(ffi_call+0x3ef) [0x7f78a868debc] /home/dwanek/.rvm/gems/ruby-1.9.2-p0/gems/ffi-1.0.1/lib/ ffi_c.so(rbffi_CallFunction+0xbb) [0x7f78a868d06b] /home/dwanek/.rvm/rubies/ruby-1.9.2-p0/lib/libruby.so.1.9(+0x175fe8) [0x7f78aa226fe8] /home/dwanek/.rvm/rubies/ruby-1.9.2-p0/lib/libruby.so.1.9(+0x1689c9) [0x7f78aa2199c9] /home/dwanek/.rvm/rubies/ruby-1.9.2-p0/lib/libruby.so.1.9(+0x16fb49) [0x7f78aa220b49] /home/dwanek/.rvm/rubies/ruby-1.9.2-p0/lib/libruby.so.1.9(+0x171444) [0x7f78aa222444] /home/dwanek/.rvm/rubies/ruby-1.9.2-p0/lib/libruby.so. 1.9(rb_method_call+0x163) [0x7f78aa11dcd3] /home/dwanek/.rvm/rubies/ruby-1.9.2-p0/lib/libruby.so.1.9(+0x175fe8) [0x7f78aa226fe8] /home/dwanek/.rvm/rubies/ruby-1.9.2-p0/lib/libruby.so.1.9(+0x1689c9) [0x7f78aa2199c9] /home/dwanek/.rvm/rubies/ruby-1.9.2-p0/lib/libruby.so.1.9(+0x16fb49) [0x7f78aa220b49] /home/dwanek/.rvm/rubies/ruby-1.9.2-p0/lib/libruby.so.1.9(+0x171444) [0x7f78aa222444] /home/dwanek/.rvm/rubies/ruby-1.9.2-p0/lib/libruby.so.1.9(rb_eval_cmd +0x101) [0x7f78aa227541] /home/dwanek/.rvm/rubies/ruby-1.9.2-p0/lib/libruby.so.1.9(+0x78e64) [0x7f78aa129e64] /home/dwanek/.rvm/rubies/ruby-1.9.2-p0/lib/libruby.so.1.9(rb_protect +0xf1) [0x7f78aa117dc1] /home/dwanek/.rvm/rubies/ruby-1.9.2-p0/lib/libruby.so.1.9(+0x78dfd) [0x7f78aa129dfd] /home/dwanek/.rvm/rubies/ruby-1.9.2-p0/lib/libruby.so.1.9(+0x79671) [0x7f78aa12a671] /home/dwanek/.rvm/rubies/ruby-1.9.2-p0/lib/libruby.so.1.9(ruby_cleanup +0x1ec) [0x7f78aa119bbc] /home/dwanek/.rvm/rubies/ruby-1.9.2-p0/lib/libruby.so.1.9(ruby_run_node +0x25) [0x7f78aa119e05] ruby(main+0x4b) [0x4009fb] /lib/libc.so.6(__libc_start_main+0xfe) [0x7f78a9267d8e] ruby() [0x4008e9] [NOTE] You may have encountered a bug in the Ruby interpreter or extension libraries. Bug reports are welcome. For details:http://www.ruby-lang.org/bugreport.html Aborted ---------------backtrace-------------- On Dec 9, 2:24 pm, Wayne Meissner <wmeiss...@gmail.com> wrote:Still no go. The custom method to release the GssBufferDesc struct (gss_release_buffer) assumes it's getting the struct as the argument to release so I don't think passing just the :value would work anyway. (I did try it though and still got the backtrace). The :value param of GssBufferDesc is of type (void *) and that is why I think it requires the library specific gss_release_buffer call. Any other ideas? Here is the full post of what I would like to work: (below that is the backtrace) The LibGSSAPI code is out on github:<dan.wa...@gmail.com> wrote:On 10 December 2010 00:36, zenChild
# --------- Example One --------- class GssBufferDesc < FFI::Struct layout :length => :size_t, :value => :pointer # pointer of :void end output_token = FFI::MemoryPointer.new :pointer maj_stat = LibGSSAPI.gss_init_sec_context(..., output_token, ...) LibGSSAPI::GssBufferT.new(output_token.get_pointer(0))
I suspect what you're passing in as output_token is the problem. Do the same as you were in example One - allocate a GssBufferDesc and use it as output_token, then construct the AutoPointer using its :value field as the pointer.
e.g. output_token = GssBufferDesc.new maj_stat = LibGSSAPI.gss_init_sec_context(..., output_token, ...) LibGSSAPI::GssBufferT.new(output_token[:value])