Skip to content

Commit e1f4224

Browse files
authored
Merge pull request #882 from rhenium/ky/generate-fix-fbuffer-leak
Fix memory leak when exception is raised during JSON generation part 2
2 parents 5f43f9f + 9b7b648 commit e1f4224

File tree

2 files changed

+6
-17
lines changed

2 files changed

+6
-17
lines changed

ext/json/ext/fbuffer/fbuffer.h

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -283,13 +283,10 @@ static VALUE fbuffer_finalize(FBuffer *fb)
283283
{
284284
if (fb->io) {
285285
fbuffer_flush(fb);
286-
fbuffer_free(fb);
287286
rb_io_flush(fb->io);
288287
return fb->io;
289288
} else {
290-
VALUE result = rb_utf8_str_new(FBUFFER_PTR(fb), FBUFFER_LEN(fb));
291-
fbuffer_free(fb);
292-
return result;
289+
return rb_utf8_str_new(FBUFFER_PTR(fb), FBUFFER_LEN(fb));
293290
}
294291
}
295292

ext/json/ext/generator/generator.c

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1444,16 +1444,14 @@ static VALUE generate_json_try(VALUE d)
14441444

14451445
data->func(data->buffer, data, data->obj);
14461446

1447-
return Qnil;
1447+
return fbuffer_finalize(data->buffer);
14481448
}
14491449

1450-
static VALUE generate_json_rescue(VALUE d, VALUE exc)
1450+
static VALUE generate_json_ensure(VALUE d)
14511451
{
14521452
struct generate_json_data *data = (struct generate_json_data *)d;
14531453
fbuffer_free(data->buffer);
14541454

1455-
rb_exc_raise(exc);
1456-
14571455
return Qundef;
14581456
}
14591457

@@ -1474,9 +1472,7 @@ static VALUE cState_partial_generate(VALUE self, VALUE obj, generator_func func,
14741472
.obj = obj,
14751473
.func = func
14761474
};
1477-
rb_rescue(generate_json_try, (VALUE)&data, generate_json_rescue, (VALUE)&data);
1478-
1479-
return fbuffer_finalize(&buffer);
1475+
return rb_ensure(generate_json_try, (VALUE)&data, generate_json_ensure, (VALUE)&data);
14801476
}
14811477

14821478
/* call-seq:
@@ -1522,9 +1518,7 @@ static VALUE cState_generate_new(int argc, VALUE *argv, VALUE self)
15221518
.obj = obj,
15231519
.func = generate_json
15241520
};
1525-
rb_rescue(generate_json_try, (VALUE)&data, generate_json_rescue, (VALUE)&data);
1526-
1527-
return fbuffer_finalize(&buffer);
1521+
return rb_ensure(generate_json_try, (VALUE)&data, generate_json_ensure, (VALUE)&data);
15281522
}
15291523

15301524
static VALUE cState_initialize(int argc, VALUE *argv, VALUE self)
@@ -2030,9 +2024,7 @@ static VALUE cState_m_generate(VALUE klass, VALUE obj, VALUE opts, VALUE io)
20302024
.obj = obj,
20312025
.func = generate_json,
20322026
};
2033-
rb_rescue(generate_json_try, (VALUE)&data, generate_json_rescue, (VALUE)&data);
2034-
2035-
return fbuffer_finalize(&buffer);
2027+
return rb_ensure(generate_json_try, (VALUE)&data, generate_json_ensure, (VALUE)&data);
20362028
}
20372029

20382030
/*

0 commit comments

Comments
 (0)