Skip to content

Commit 4b7b7b7

Browse files
Free memory in rb_version_compare when exception is thrown
1 parent b7ccd8c commit 4b7b7b7

1 file changed

Lines changed: 28 additions & 5 deletions

File tree

ext/version_sorter/version_sorter.c

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -266,16 +266,39 @@ rb_version_sort_r_bang(VALUE rb_self, VALUE rb_versions)
266266
return rb_version_sort_1(rb_self, rb_versions, version_compare_cb_r);
267267
}
268268

269+
struct compare_context {
270+
VALUE rb_version_a, rb_version_b;
271+
struct version_number *version_a, *version_b;
272+
};
273+
274+
static VALUE
275+
rb_version_compare_cb(VALUE arg)
276+
{
277+
struct compare_context *context = (struct compare_context *)arg;
278+
279+
context->version_a = parse_version_number(StringValueCStr(context->rb_version_a));
280+
context->version_b = parse_version_number(StringValueCStr(context->rb_version_b));
281+
282+
return INT2NUM(version_compare_cb(&context->version_a, &context->version_b));
283+
}
284+
269285
static VALUE
270286
rb_version_compare(VALUE rb_self, VALUE rb_version_a, VALUE rb_version_b)
271287
{
272-
struct version_number *version_a = parse_version_number(StringValueCStr(rb_version_a));
273-
struct version_number *version_b = parse_version_number(StringValueCStr(rb_version_b));
288+
int exception;
289+
struct compare_context context = {
290+
rb_version_a, rb_version_b,
291+
NULL, NULL,
292+
};
293+
294+
VALUE result = rb_protect(rb_version_compare_cb, (VALUE)&context, &exception);
274295

275-
VALUE result = INT2NUM(version_compare_cb(&version_a, &version_b));
296+
xfree(context.version_a);
297+
xfree(context.version_b);
276298

277-
xfree(version_a);
278-
xfree(version_b);
299+
if (exception) {
300+
rb_jump_tag(exception);
301+
}
279302

280303
return result;
281304
}

0 commit comments

Comments
 (0)