changeset 13148:f06a0a75d5b1 v8.0.1448

patch 8.0.1448: segfault with exception inside :rubyfile command commit https://github.com/vim/vim/commit/37badc898b8d167e11553b6d05908ffd35928a6e Author: Bram Moolenaar <Bram@vim.org> Date: Wed Jan 31 20:15:30 2018 +0100 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)
author Christian Brabandt <cb@256bit.org>
date Wed, 31 Jan 2018 20:30:06 +0100
parents e50172c69e4f
children 46794b7ab97a
files src/if_ruby.c src/testdir/test_ruby.vim src/version.c
diffstat 3 files changed, 21 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/if_ruby.c
+++ b/src/if_ruby.c
@@ -377,7 +377,7 @@ static unsigned long (*dll_rb_num2uint) 
 # endif
 static VALUE (*dll_rb_lastline_get) (void);
 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 long (*dll_rb_num2long) (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)
 {
     int state;
 
     if (ensure_ruby_initialized())
     {
-	rb_protect((VALUE (*)(VALUE))rb_load, rb_str_new2((char *)eap->arg),
-								       &state);
-	if (state) error_print(state);
+	VALUE file_to_load = rb_str_new2((const char *)eap->arg);
+	rb_protect(rb_load_wrap, file_to_load, &state);
+	if (state)
+	    error_print(state);
     }
 }
 
--- a/src/testdir/test_ruby.vim
+++ b/src/testdir/test_ruby.vim
@@ -49,3 +49,11 @@ func Test_rubydo()
   bwipe!
   bwipe!
 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
--- a/src/version.c
+++ b/src/version.c
@@ -772,6 +772,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1448,
+/**/
     1447,
 /**/
     1446,