Skip to content

Commit da4bd3b

Browse files
committed
Fix memory leak when RUBYOPT is invalid
When RUBYOPT is invalid, it raises an error which causes moreswitches to leak memory. It can be seen when building with LSAN enabled: $ RUBY_FREE_AT_EXIT=1 RUBYOPT=f ruby ruby: invalid option -f (-h will show valid options) (RuntimeError) Direct leak of 16 byte(s) in 1 object(s) allocated from: #0 0x618cef8efa23 in malloc (miniruby+0x64a23) #1 0x618cefa0e8d8 in rb_gc_impl_malloc gc/default/default.c:8182:5 #2 0x618cef9f7f01 in ruby_xmalloc2_body gc.c:5182:12 #3 0x618cef9f7eac in ruby_xmalloc2 gc.c:5176:34 Shopify#4 0x618cefb547b2 in moreswitches ruby.c:919:18 Shopify#5 0x618cefb526fe in process_options ruby.c:2350:9 Shopify#6 0x618cefb524ac in ruby_process_options ruby.c:3202:12 Shopify#7 0x618cef9dc11f in ruby_options eval.c:119:16 Shopify#8 0x618cef8f2fb5 in rb_main main.c:42:26 Shopify#9 0x618cef8f2f59 in main main.c:62:12
1 parent dfcb79c commit da4bd3b

File tree

1 file changed

+5
-2
lines changed

1 file changed

+5
-2
lines changed

ruby.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -916,7 +916,9 @@ moreswitches(const char *s, ruby_cmdline_options_t *opt, int envopt)
916916
argc = RSTRING_LEN(argary) / sizeof(ap);
917917
ap = 0;
918918
rb_str_cat(argary, (char *)&ap, sizeof(ap));
919-
argv = ptr = ALLOC_N(char *, argc);
919+
920+
VALUE ptr_obj;
921+
argv = ptr = RB_ALLOCV_N(char *, ptr_obj, argc);
920922
MEMMOVE(argv, RSTRING_PTR(argary), char *, argc);
921923

922924
while ((i = proc_options(argc, argv, opt, envopt)) > 1 && envopt && (argc -= i) > 0) {
@@ -948,7 +950,8 @@ moreswitches(const char *s, ruby_cmdline_options_t *opt, int envopt)
948950
opt->crash_report = crash_report;
949951
}
950952

951-
ruby_xfree(ptr);
953+
RB_ALLOCV_END(ptr_obj);
954+
952955
/* get rid of GC */
953956
rb_str_resize(argary, 0);
954957
rb_str_resize(argstr, 0);

0 commit comments

Comments
 (0)