From 1096be5ac6540c204047c7c9e6d58bfcef90e167 Mon Sep 17 00:00:00 2001 From: shyouhei Date: Fri, 4 May 2018 15:18:42 +0000 Subject: [PATCH] passing rb_thread_sleep to rb_protect is IMHO dangerous rb_thread_sleep's argument is int, while rb_protect expects the function to take VALUE. Depending on ABI this could be a problem. We should wrap rb_thread_sleep here. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@63339 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- process.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/process.c b/process.c index b6a0245163..a1154bda8e 100644 --- a/process.c +++ b/process.c @@ -3270,6 +3270,13 @@ pipe_nocrash(int filedes[2], VALUE fds) #define O_BINARY 0 #endif +static VALUE +rb_thread_sleep_that_takes_VALUE_as_sole_argument(VALUE n) +{ + rb_thread_sleep(NUM2INT(n)); + return Qundef; +} + static int handle_fork_error(int err, int *status, int *ep, volatile int *try_gc_p) { @@ -3291,7 +3298,7 @@ handle_fork_error(int err, int *status, int *ep, volatile int *try_gc_p) return 0; } else { - rb_protect((VALUE (*)())rb_thread_sleep, 1, &state); + rb_protect(rb_thread_sleep_that_takes_VALUE_as_sole_argument, 1, &state); if (status) *status = state; if (!state) return 0; }