From: Daniel Berger Date: 2010-01-30T01:01:49+09:00 Subject: kerberos context binding, segfault in test Hi, Ruby 1.8.7-p243 test-unit 2.0.6 Snow Leopard I'm wrapping a Kerberos context object, but I'm getting a segfault. Specifically, one test in particular (an expected error test) seems to be causing the segfault. Here's the source: #include #include #include #include VALUE cContextError; typedef struct { krb5_context context; } rcontext; void rkrb5_context_free(rcontext* ptr){ if(!ptr) return; if(ptr->context) krb5_free_context(ptr->context); free(ptr); } static VALUE rcontext_allocate(VALUE klass){ rcontext* ptr = malloc(sizeof(rcontext)); return Data_Wrap_Struct(klass, 0, rkrb5_context_free, ptr); } /* * call-seq: * Kerberos::Context.new * * Creates and returns a new Kerberos::Context object. */ static VALUE rcontext_initialize(VALUE self){ rcontext* ptr; Data_Get_Struct(self, rcontext, ptr); errno = krb5_init_context(&ptr->context); if(errno) rb_raise(cContextError, "%s", error_message(errno)); return self; } /* * call-seq: * * Releases the context. Returns true when closed the first time, false if * the object has already been closed. */ static VALUE rcontext_close(VALUE self){ rcontext* ptr; VALUE v_bool = Qfalse; Data_Get_Struct(self, rcontext, ptr); if(ptr && ptr->context){ krb5_free_context(ptr->context); v_bool = Qtrue; } ptr->context = NULL; return v_bool; } void Init_context(){ /* The Kerberos module serves as a namespace only. */ VALUE mKerberos = rb_define_module("Kerberos"); /* The Context class encapsulates a Kerberos context. */ VALUE cContext = rb_define_class_under(mKerberos, "Context", rb_cObject); /* The Context::Error class is raised if any of the Context methods fail. */ cContextError = rb_define_class_under(cContext, "Error", rb_eStandardError); rb_define_alloc_func(cContext, rcontext_allocate); rb_define_method(cContext, "initialize", rcontext_initialize, 0); rb_define_method(cContext, "close", rcontext_close, 0); } Nothing too fancy. Here's a short test suite I have for it. They all pass, but it seems the last test is causing a segfault: ######################################################################## # test_kerberos_context.rb # # Tests for the Kerberos::Context class. ######################################################################## require 'rubygems' gem 'test-unit' require 'test/unit' require 'rkerberos' class TC_Kerberos_Context < Test::Unit::TestCase def setup @ctx = Kerberos::Context.new end test "close basic functionality" do assert_respond_to(@ctx, :close) assert_nothing_raised{ @ctx.close } end test "calling close multiple times is a no-op" do assert_nothing_raised{ @ctx.close } assert_nothing_raised{ @ctx.close } assert_nothing_raised{ @ctx.close } end test "close returns true the first time it is called" do assert_true(@ctx.close) end test "close returns false if already closed" do assert_true(@ctx.close) assert_false(@ctx.close) end test "close does not accept any arguments" do assert_raise(ArgumentError){ @ctx.close(true) } end # This seems to be the culprit test "constructor does not accept arguments" do assert_raise(ArgumentError){ Kerberos::Context.new(true) } end def teardown @ctx = nil end end 6 tests, 10 assertions, 0 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications 100% passed /usr/local/lib/ruby/gems/1.8/gems/test-unit-2.0.6/lib/test/unit.rb: 321: [BUG] Segmentation fault ruby 1.8.7 (2009-12-24 patchlevel 248) [i686-darwin10.2.0] Line 321 of unit.rb is simply "exit Test::Unit::AutoRunner.run". Any ideas? Regards, Dan