there is no guarantee that mode_t is as wide as int

POSIX only defines mode_t to be "an integer typea", and in fact
MacOS defines it to be uint16_t.  We didn't have NUM2USHORT before
so it did not make sense but now that we have it.  Why not check
apptopriately.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@61950 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
shyouhei 2018-01-19 09:12:06 +00:00
parent 26b08ed144
commit de9d264026
4 changed files with 11 additions and 4 deletions

View File

@ -1611,6 +1611,8 @@ AC_DEFUN([RUBY_REPLACE_TYPE], [dnl
t=LL], t=LL],
[*" long "*], [ [*" long "*], [
t=LONG], t=LONG],
[*" short "*], [
t=SHORT],
[ [
t=INT]) t=INT])
rb_cv_[$1]_convertible=${u}${t}]) rb_cv_[$1]_convertible=${u}${t}])
@ -1620,6 +1622,7 @@ AC_DEFUN([RUBY_REPLACE_TYPE], [dnl
AS_CASE(["${rb_cv_[$1]_convertible}"], AS_CASE(["${rb_cv_[$1]_convertible}"],
[*LL], [n="long long"], [*LL], [n="long long"],
[*LONG], [n="long"], [*LONG], [n="long"],
[*SHORT], [n="short"],
[n="int"]) [n="int"])
AS_CASE(["${rb_cv_[$1]_convertible}"], AS_CASE(["${rb_cv_[$1]_convertible}"],
[U*], [n="unsigned $n"]) [U*], [n="unsigned $n"])
@ -1637,7 +1640,7 @@ RUBY_REPLACE_TYPE(uid_t, int, UIDT)
RUBY_REPLACE_TYPE(gid_t, int, GIDT) RUBY_REPLACE_TYPE(gid_t, int, GIDT)
RUBY_REPLACE_TYPE(time_t, [], TIMET, [@%:@include <time.h>]) RUBY_REPLACE_TYPE(time_t, [], TIMET, [@%:@include <time.h>])
RUBY_REPLACE_TYPE(dev_t, [int long "long long"], DEVT) RUBY_REPLACE_TYPE(dev_t, [int long "long long"], DEVT)
RUBY_REPLACE_TYPE(mode_t, ["unsigned int" long], MODET, [@%:@include <sys/stat.h>]) RUBY_REPLACE_TYPE(mode_t, ["unsigned short" "unsigned int" long], MODET, [@%:@include <sys/stat.h>])
RUBY_REPLACE_TYPE(rlim_t, [int long "long long"], RLIM, [ RUBY_REPLACE_TYPE(rlim_t, [int long "long long"], RLIM, [
@%:@ifdef HAVE_SYS_TYPES_H @%:@ifdef HAVE_SYS_TYPES_H
@%:@include <sys/types.h> @%:@include <sys/types.h>

4
file.c
View File

@ -2384,12 +2384,12 @@ static VALUE
rb_file_chmod(VALUE obj, VALUE vmode) rb_file_chmod(VALUE obj, VALUE vmode)
{ {
rb_io_t *fptr; rb_io_t *fptr;
int mode; mode_t mode;
#if !defined HAVE_FCHMOD || !HAVE_FCHMOD #if !defined HAVE_FCHMOD || !HAVE_FCHMOD
VALUE path; VALUE path;
#endif #endif
mode = NUM2INT(vmode); mode = NUM2MODET(vmode);
GetOpenFile(obj, fptr); GetOpenFile(obj, fptr);
#ifdef HAVE_FCHMOD #ifdef HAVE_FCHMOD

View File

@ -113,6 +113,9 @@ typedef char ruby_check_sizeof_voidp[SIZEOF_VOIDP == sizeof(void*) ? 1 : -1];
#ifndef PRI_LONG_PREFIX #ifndef PRI_LONG_PREFIX
#define PRI_LONG_PREFIX "l" #define PRI_LONG_PREFIX "l"
#endif #endif
#ifndef PRI_SHORT_PREFIX
#define PRI_SHORT_PREFIX "h"
#endif
#if SIZEOF_LONG == 8 #if SIZEOF_LONG == 8
#define PRI_64_PREFIX PRI_LONG_PREFIX #define PRI_64_PREFIX PRI_LONG_PREFIX
@ -1571,6 +1574,7 @@ rb_num2char_inline(VALUE x)
#define LONG2NUM(x) RB_LONG2NUM(x) #define LONG2NUM(x) RB_LONG2NUM(x)
#define ULONG2NUM(x) RB_ULONG2NUM(x) #define ULONG2NUM(x) RB_ULONG2NUM(x)
#define USHORT2NUM(x) RB_INT2FIX(x)
#define NUM2CHR(x) RB_NUM2CHR(x) #define NUM2CHR(x) RB_NUM2CHR(x)
#define CHR2FIX(x) RB_CHR2FIX(x) #define CHR2FIX(x) RB_CHR2FIX(x)

View File

@ -2348,7 +2348,7 @@ rb_execarg_parent_start1(VALUE execarg_obj)
VALUE param = RARRAY_AREF(elt, 1); VALUE param = RARRAY_AREF(elt, 1);
VALUE vpath = RARRAY_AREF(param, 0); VALUE vpath = RARRAY_AREF(param, 0);
int flags = NUM2INT(RARRAY_AREF(param, 1)); int flags = NUM2INT(RARRAY_AREF(param, 1));
int perm = NUM2INT(RARRAY_AREF(param, 2)); mode_t perm = NUM2MODET(RARRAY_AREF(param, 2));
VALUE fd2v = RARRAY_AREF(param, 3); VALUE fd2v = RARRAY_AREF(param, 3);
int fd2; int fd2;
if (NIL_P(fd2v)) { if (NIL_P(fd2v)) {