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:
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
@@ -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,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user