diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-06-19 08:51:57 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-06-19 08:51:57 +0000 |
commit | 52b497d8b7f5f05b7420b8200423304bb0c85ef9 (patch) | |
tree | b0df2e5b026c08d5e05943d66b9e0fcbb766e973 /process.c | |
parent | 6696fd0c49eca936c9f76738df587cda564fca90 (diff) | |
download | ruby-52b497d8b7f5f05b7420b8200423304bb0c85ef9.tar.gz |
process.c: no method calls in async-signal-safe
* process.c (rb_execarg_run_options): do not call any methods in the
async-signal-safe function. mask has been checked with NUM2MODET()
already and converted with LONG2NUM().
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@36134 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'process.c')
-rw-r--r-- | process.c | 5 |
1 files changed, 4 insertions, 1 deletions
@@ -17,6 +17,8 @@ #include "internal.h" #include "vm_core.h" +#define STATIC_ASSERT(name, expr) typedef int static_assert_##name##_check[1 - 2*!(expr)] + #include <stdio.h> #include <errno.h> #include <signal.h> @@ -1595,6 +1597,7 @@ rb_execarg_addopt(struct rb_exec_arg *e, VALUE key, VALUE val) hide_obj(rb_str_dup(val))); } else if (id == rb_intern("umask")) { + STATIC_ASSERT(sizeof_mode_t, sizeof(long) >= sizeof(mode_t)); /* for LONG2NUM */ mode_t cmask = NUM2MODET(val); if (!NIL_P(rb_ary_entry(options, EXEC_OPTION_UMASK))) { rb_raise(rb_eArgError, "umask option specified twice"); @@ -2707,7 +2710,7 @@ rb_execarg_run_options(const struct rb_exec_arg *e, struct rb_exec_arg *s, char obj = rb_ary_entry(options, EXEC_OPTION_UMASK); if (!NIL_P(obj)) { - mode_t mask = NUM2MODET(obj); + mode_t mask = (mode_t)FIX2LONG(obj); /* no method calls */ mode_t oldmask = umask(mask); /* never fail */ /* async-signal-safe */ if (!NIL_P(soptions)) rb_ary_store(soptions, EXEC_OPTION_UMASK, MODET2NUM(oldmask)); |