diff options
author | Lamont Granquist <lamont@scriptkiddie.org> | 2013-12-04 21:10:16 -0800 |
---|---|---|
committer | Lamont Granquist <lamont@scriptkiddie.org> | 2013-12-04 21:10:16 -0800 |
commit | ba6debbf28a2de3313f9fce7bfebd9931d2be190 (patch) | |
tree | 300bca8f220f5bdc8b607c85fab13e7af2539bdb /ext/ffi_yajl/ext | |
parent | b518d764586aec0c01fee6273f0a77ad2dcc0b20 (diff) | |
download | ffi-yajl-ba6debbf28a2de3313f9fce7bfebd9931d2be190.tar.gz |
NaN and Inifity in Bignum and Fixnum as well
Diffstat (limited to 'ext/ffi_yajl/ext')
-rw-r--r-- | ext/ffi_yajl/ext/encoder/encoder.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/ext/ffi_yajl/ext/encoder/encoder.c b/ext/ffi_yajl/ext/encoder/encoder.c index ebfd1bb..047ab62 100644 --- a/ext/ffi_yajl/ext/encoder/encoder.c +++ b/ext/ffi_yajl/ext/encoder/encoder.c @@ -113,11 +113,15 @@ static VALUE rb_cFalseClass_ffi_yajl(VALUE self, VALUE yajl_gen, VALUE state) { static VALUE rb_cFixnum_ffi_yajl(VALUE self, VALUE yajl_gen, VALUE state) { ID sym_to_s = rb_intern("to_s"); - VALUE str; + VALUE str = rb_funcall(self, sym_to_s, 0); + char *cptr = RSTRING_PTR(str); + int len = RSTRING_LEN(str); + if (memcmp(cptr, "NaN", 3) == 0 || memcmp(cptr, "Infinity", 8) == 0 || memcmp(cptr, "-Infinity", 9) == 0) { + rb_raise(cEncodeError, "'%s' is an invalid number", cptr); + } if ( ((ffi_state_t *)state)->processing_key ) { - str = rb_funcall(self, sym_to_s, 0); - yajl_gen_string((struct yajl_gen_t *) yajl_gen, (unsigned char *)RSTRING_PTR(str), RSTRING_LEN(str)); + yajl_gen_string((struct yajl_gen_t *) yajl_gen, (unsigned char *)cptr, len); } else { yajl_gen_integer((struct yajl_gen_t *) yajl_gen, NUM2INT(self)); } @@ -125,6 +129,12 @@ static VALUE rb_cFixnum_ffi_yajl(VALUE self, VALUE yajl_gen, VALUE state) { } static VALUE rb_cBignum_ffi_yajl(VALUE self, VALUE yajl_gen, VALUE state) { + ID sym_to_s = rb_intern("to_s"); + VALUE str = rb_funcall(self, sym_to_s, 0); + char *cptr = RSTRING_PTR(str); + if (memcmp(cptr, "NaN", 3) == 0 || memcmp(cptr, "Infinity", 8) == 0 || memcmp(cptr, "-Infinity", 9) == 0) { + rb_raise(cEncodeError, "'%s' is an invalid number", cptr); + } rb_raise( rb_eNotImpError, "Bignum#ffi_yajl not implemented"); return Qnil; } |