Subject: [ruby-ffi] Problem with AutoPointer and ManagedStruct |
From: zenChild |
Date: 12/9/10 8:36 AM |
To: ruby-ffi |
I'm trying to use AutoPointer or ManagedStruct to free some memory for
a gss_buffer_desc struct in the GSSAPI. It seems I can free the
object manually, but when wrapped in an AutoPointer or ManagedStruct I
get a SegFault.
This is working, but I need to be able to free the memory in an
automatic fashion.
# --------- Example One ---------
class GssBufferDesc < FFI::Struct
layout :length => :size_t,
:value => :pointer # pointer of :void
end
.... misc code
output_token = LibGSSAPI::GssBufferDesc.new
output_token[:length] = 0
output_token[:value] = nil
maj_stat = LibGSSAPI.gss_init_sec_context(...,
output_token.pointer,...)
... do work
maj_stat = LibGSSAPI.gss_release_buffer(min_stat,
output_token.pointer)
# gss_release_buffer exists with success:w
# --------- Example Two --------- This example gets a SegFault
class GssBufferT < FFI::AutoPointer
def self.release(buffer_ptr)
puts "Releasing gss_buffer_t at #{buffer_ptr.address}" if $DEBUG
min_stat = FFI::MemoryPointer.new :uint32
maj_stat = LibGSSAPI.gss_release_buffer(min_stat, buffer_ptr)
end
end
.... misc code
output_token = FFI::MemoryPointer.new :pointer
maj_stat = LibGSSAPI.gss_init_sec_context(..., output_token, ...)
LibGSSAPI::GssBufferT.new(output_token.get_pointer(0))
# on exit the release method in GssBufferT causes a segfault and if I
wrap it in a ManagedStruct the same thing happens. Does anyone have
any ideas for me?
Cheers,
Dan Wanek