From 5e86b005c0f2ef30df2f9906c7e2f3abefe286a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=9C=E9=83=A8=E6=98=8C=E5=B9=B3?= Date: Fri, 23 Aug 2019 12:14:06 +0900 Subject: [PATCH] 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. --- process.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/process.c b/process.c index db3f38de1b..8cd42db802 100644 --- a/process.c +++ b/process.c @@ -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);