D
Daniel Berger
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 <ruby.h>
#include <errno.h>
#include <strings.h>
#include <krb5.h>
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
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 <ruby.h>
#include <errno.h>
#include <strings.h>
#include <krb5.h>
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