summaryrefslogtreecommitdiff
path: root/ext/json/generator/generator.h
diff options
context:
space:
mode:
authorJean Boussier <[email protected]>2024-10-29 18:55:22 +0100
committerHiroshi SHIBATA <[email protected]>2024-11-01 13:04:24 +0900
commitd329896fb590de96832d522b475404cae1279767 (patch)
treed9d0950924ac1e97c10ebb58ccc5dcfa621d2e10 /ext/json/generator/generator.h
parent783dde2159a3689ad2d3ef6b7d0005a7cf80adba (diff)
[ruby/json] Fix a memory leak in #to_json methods
Fix: https://github.com/ruby/json/issues/460 The various `to_json` methods must rescue exceptions to free the buffer. ``` require 'json' data = 10_000.times.to_a << BasicObject.new 20.times do 100.times do begin data.to_json rescue NoMethodError end end puts `ps -o rss= -p #{$$}` end ``` ``` 20128 24992 29920 34672 39600 44336 49136 53936 58816 63616 68416 73232 78032 82896 87696 92528 97408 102208 107008 111808 ``` https://github.com/ruby/json/commit/d227d225ca
Diffstat (limited to 'ext/json/generator/generator.h')
-rw-r--r--ext/json/generator/generator.h14
1 files changed, 1 insertions, 13 deletions
diff --git a/ext/json/generator/generator.h b/ext/json/generator/generator.h
index 230c08a64d..05e8f0d809 100644
--- a/ext/json/generator/generator.h
+++ b/ext/json/generator/generator.h
@@ -54,18 +54,6 @@ typedef struct JSON_Generator_StateStruct {
JSON_Generator_State *state; \
GET_STATE_TO(self, state)
-#define GENERATE_JSON(type) \
- VALUE Vstate; \
- JSON_Generator_State *state; \
- \
- rb_scan_args(argc, argv, "01", &Vstate); \
- Vstate = cState_from_state_s(cState, Vstate); \
- TypedData_Get_Struct(Vstate, JSON_Generator_State, &JSON_Generator_State_type, state); \
- FBuffer buffer = {0}; \
- fbuffer_init(&buffer, state->buffer_initial_length); \
- generate_json_##type(&buffer, Vstate, state, self); \
- return fbuffer_to_s(&buffer)
-
static VALUE mHash_to_json(int argc, VALUE *argv, VALUE self);
static VALUE mArray_to_json(int argc, VALUE *argv, VALUE self);
#ifdef RUBY_INTEGER_UNIFICATION
@@ -99,7 +87,7 @@ static void generate_json_integer(FBuffer *buffer, VALUE Vstate, JSON_Generator_
static void generate_json_fixnum(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj);
static void generate_json_bignum(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj);
static void generate_json_float(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj);
-static VALUE cState_partial_generate(VALUE self, VALUE obj);
+static VALUE cState_partial_generate(VALUE self, VALUE obj, void (*func)(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj));
static VALUE cState_generate(VALUE self, VALUE obj);
static VALUE cState_from_state_s(VALUE self, VALUE opts);
static VALUE cState_indent(VALUE self);