diff options
author | 卜部昌平 <[email protected]> | 2019-08-23 12:14:06 +0900 |
---|---|---|
committer | 卜部昌平 <[email protected]> | 2019-08-26 13:01:58 +0900 |
commit | 5e86b005c0f2ef30df2f9906c7e2f3abefe286a2 (patch) | |
tree | c3294605f5ba0246b69a10753a1d48b5a1fa93f2 /process.c | |
parent | 48131a46730b76bdb252d24507980ea90c0166ad (diff) |
uid_t and gid_t are narrower than VALUE.
Often uid / gid are 16 bit or 32 bit integers, while VALUE are 32
to 64 bits. They tend to differ in size. Because rb_ensure expects
its callbacks to take VALUE arguments, narrowing must be done by
hand, otherwise data corruption can happen depending on machine ABI.
Diffstat (limited to 'process.c')
-rw-r--r-- | process.c | 6 |
1 files changed, 4 insertions, 2 deletions
@@ -7133,8 +7133,9 @@ p_uid_have_saved_id(void) #if defined(HAVE_SETRESUID) || defined(HAVE_SETEUID) || defined(_POSIX_SAVED_IDS) static VALUE -p_uid_sw_ensure(rb_uid_t id) +p_uid_sw_ensure(VALUE i) { + rb_uid_t id = (rb_uid_t/* narrowing */)i; under_uid_switch = 0; id = rb_seteuid_core(id); return UIDT2NUM(id); @@ -7246,8 +7247,9 @@ p_gid_have_saved_id(void) #if defined(HAVE_SETRESGID) || defined(HAVE_SETEGID) || defined(_POSIX_SAVED_IDS) static VALUE -p_gid_sw_ensure(rb_gid_t id) +p_gid_sw_ensure(VALUE i) { + rb_gid_t id = (rb_gid_t/* narrowing */)i; under_gid_switch = 0; id = rb_setegid_core(id); return GIDT2NUM(id); |