]> granicus.if.org Git - vim/commitdiff
patch 8.0.1448: segfault with exception inside :rubyfile command v8.0.1448
authorBram Moolenaar <Bram@vim.org>
Wed, 31 Jan 2018 19:15:30 +0000 (20:15 +0100)
committerBram Moolenaar <Bram@vim.org>
Wed, 31 Jan 2018 19:15:30 +0000 (20:15 +0100)
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)

src/if_ruby.c
src/testdir/test_ruby.vim
src/version.c

index ca31c1a052dd0ae16b1cd1885ba6318ac3a31241..5905424a3eb264e03cbf43072550e6354674370c 100644 (file)
@@ -377,7 +377,7 @@ static unsigned long (*dll_rb_num2uint) (VALUE);
 # 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);
     }
 }
 
index 174467f71f0e2bd2fc85b8f5d03cd2731e1658de..0017f73aefae8a191e38c84fc262e20a443cf880 100644 (file)
@@ -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
index 94d58f84f653c63bae7c86daf62c596bcac39378..1da5bbdc3b4b82abd99954423d9f3c2bd4dadfe6 100644 (file)
@@ -771,6 +771,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1448,
 /**/
     1447,
 /**/