0
0
mirror of https://github.com/vim/vim.git synced 2025-09-23 03:43:49 -04:00

patch 8.0.1448: segfault with exception inside :rubyfile command

Problem:    Segmentation fault when Ruby throws an exception inside :rubyfile
            command.
Solution:   Use rb_protect() instead of rb_load_protect(). (ujihisa,
            closes #2147, greywolf, closes #2512, #2511)
This commit is contained in:
Bram Moolenaar
2018-01-31 20:15:30 +01:00
parent cada78975e
commit 37badc898b
3 changed files with 21 additions and 4 deletions

View File

@@ -377,7 +377,7 @@ static unsigned long (*dll_rb_num2uint) (VALUE);
# endif # endif
static VALUE (*dll_rb_lastline_get) (void); static VALUE (*dll_rb_lastline_get) (void);
static void (*dll_rb_lastline_set) (VALUE); static void (*dll_rb_lastline_set) (VALUE);
static void (*dll_rb_protect) (VALUE (*)(VALUE), int, int*); static VALUE (*dll_rb_protect) (VALUE (*)(VALUE), VALUE, int*);
static void (*dll_rb_load) (VALUE, int); static void (*dll_rb_load) (VALUE, int);
static long (*dll_rb_num2long) (VALUE); static long (*dll_rb_num2long) (VALUE);
static unsigned long (*dll_rb_num2ulong) (VALUE); static unsigned long (*dll_rb_num2ulong) (VALUE);
@@ -828,15 +828,22 @@ void ex_rubydo(exarg_T *eap)
} }
} }
VALUE rb_load_wrap(VALUE file_to_load)
{
rb_load(file_to_load, 0);
return Qnil;
}
void ex_rubyfile(exarg_T *eap) void ex_rubyfile(exarg_T *eap)
{ {
int state; int state;
if (ensure_ruby_initialized()) if (ensure_ruby_initialized())
{ {
rb_protect((VALUE (*)(VALUE))rb_load, rb_str_new2((char *)eap->arg), VALUE file_to_load = rb_str_new2((const char *)eap->arg);
&state); rb_protect(rb_load_wrap, file_to_load, &state);
if (state) error_print(state); if (state)
error_print(state);
} }
} }

View File

@@ -49,3 +49,11 @@ func Test_rubydo()
bwipe! bwipe!
bwipe! bwipe!
endfunc endfunc
func Test_rubyfile()
" Check :rubyfile does not SEGV with Ruby level exception but just fails
let tempfile = tempname() . '.rb'
call writefile(['raise "vim!"'], tempfile)
call assert_fails('rubyfile ' . tempfile)
call delete(tempfile)
endfunc

View File

@@ -771,6 +771,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1448,
/**/ /**/
1447, 1447,
/**/ /**/