From 20f84468e28d9615149d3ecbdde97da185b0e2ff Mon Sep 17 00:00:00 2001 From: "Erik S. Chang" Date: Wed, 9 Dec 2009 01:49:45 +0000 Subject: [PATCH] extra argument checking because users can be careless git-svn-id: https://lwes.svn.sourceforge.net/svnroot/lwes/lwes-ruby/trunk@358 a2f82657-cdd2-4550-bd36-68a8e7111808 --- ext/lwes/emitter.c | 24 +++++++++++++++++------- ext/lwes/lwes_ruby.h | 2 ++ ext/lwes/type_db.c | 2 +- test/unit/test_emit_struct.rb | 16 ++++++++++++++++ 4 files changed, 36 insertions(+), 8 deletions(-) diff --git a/ext/lwes/emitter.c b/ext/lwes/emitter.c index fb7ae4f..d57a7f1 100644 --- a/ext/lwes/emitter.c +++ b/ext/lwes/emitter.c @@ -132,10 +132,14 @@ static VALUE _emit_struct(VALUE _argv) VALUE self = argv[0]; VALUE _event = argv[1]; struct lwes_event *event = (struct lwes_event *)argv[2]; - VALUE type_list = rb_const_get(CLASS_OF(_event), id_TYPE_LIST); - long i = RARRAY_LEN(type_list); + VALUE type_list = argv[3]; + long i; VALUE *tmp; + if (TYPE(type_list) != T_ARRAY) + rb_raise(rb_eArgError, "could not get TYPE_LIST const"); + + i = RARRAY_LEN(type_list); for (tmp = RARRAY_PTR(type_list); --i >= 0; tmp++) { /* inner: [ :field_sym, "field_name", type ] */ VALUE *inner = RARRAY_PTR(*tmp); @@ -195,19 +199,24 @@ static struct lwes_event_type_db * get_type_db(VALUE event) { VALUE type_db = rb_const_get(CLASS_OF(event), id_TYPE_DB); + if (CLASS_OF(type_db) != cLWES_TypeDB) + rb_raise(rb_eArgError, "class does not have valid TYPE_DB"); + return lwesrb_get_type_db(type_db); } static VALUE emit_struct(VALUE self, VALUE _event) { - VALUE argv[3]; + VALUE argv[4]; struct lwes_event_type_db *db = get_type_db(_event); struct lwes_event *event; - VALUE name = rb_const_get(CLASS_OF(_event), id_NAME); + VALUE event_class = CLASS_OF(_event); + VALUE name = rb_const_get(event_class, id_NAME); + VALUE type_list = rb_const_get(event_class, id_TYPE_LIST); - if (TYPE(name) != T_STRING) + if (TYPE(name) != T_STRING || TYPE(type_list) != T_ARRAY) rb_raise(rb_eArgError, - "could not get event NAME from Struct: %s", + "could not get class NAME or TYPE_LIST from: %s", RSTRING_PTR(rb_inspect(_event))); event = lwes_event_create(db, RSTRING_PTR(name)); @@ -217,6 +226,7 @@ static VALUE emit_struct(VALUE self, VALUE _event) argv[0] = self; argv[1] = _event; argv[2] = (VALUE)event; + argv[3] = type_list; rb_ensure(_emit_struct, (VALUE)&argv, _destroy_event, (VALUE)event); return _event; @@ -227,7 +237,7 @@ static VALUE emitter_ltlt(VALUE self, VALUE event) if (TYPE(event) != T_STRUCT) rb_raise(rb_eArgError, "Must be a Struct: %s", - RSTRING_PTR(rb_inspect(event))); + RSTRING_PTR(rb_inspect(event))); return emit_struct(self, event); } diff --git a/ext/lwes/lwes_ruby.h b/ext/lwes/lwes_ruby.h index d8f4b09..0657fcf 100644 --- a/ext/lwes/lwes_ruby.h +++ b/ext/lwes/lwes_ruby.h @@ -9,6 +9,8 @@ #define LWESRB_MKSYM(SYM) sym_##SYM = ID2SYM(rb_intern(#SYM)) #define LWESRB_MKID(NAME) id_##NAME = rb_intern(#NAME) +extern VALUE cLWES_TypeDB; + struct lwes_event_type_db * lwesrb_get_type_db(VALUE self); void lwesrb_init_type_db(void); diff --git a/ext/lwes/type_db.c b/ext/lwes/type_db.c index 31f695e..1c34862 100644 --- a/ext/lwes/type_db.c +++ b/ext/lwes/type_db.c @@ -1,6 +1,6 @@ #include "lwes_ruby.h" -static VALUE cLWES_TypeDB; +VALUE cLWES_TypeDB; struct _tdb { struct lwes_event_type_db *db; diff --git a/test/unit/test_emit_struct.rb b/test/unit/test_emit_struct.rb index f58b88b..235f7ba 100644 --- a/test/unit/test_emit_struct.rb +++ b/test/unit/test_emit_struct.rb @@ -1,5 +1,9 @@ require "#{File.dirname(__FILE__)}/../test_helper" +class InvalidStruct1 < Struct.new(:invalid) + TYPE_DB = [] +end + class TestEmitStruct < Test::Unit::TestCase def setup @@ -8,6 +12,18 @@ class TestEmitStruct < Test::Unit::TestCase @options = LISTENER_DEFAULTS.dup end + def test_emit_non_lwes_struct + emitter = LWES::Emitter.new(@options) + assert_raise(ArgumentError) { emitter << InvalidStruct1.new } + end + + def test_emit_crap + emitter = LWES::Emitter.new(@options) + assert_raise(ArgumentError) { emitter << "HHI" } + assert_raise(ArgumentError) { emitter << [] } + assert_raise(ArgumentError) { emitter << {} } + end + def test_emit_struct_full s = nil out = lwes_listener do -- 2.11.4.GIT