The device numbers in struct statx may be larger than dev_t

`dev_t` is already 64-bit in glibc, but on some platforms like Alpine
Linux and Android NDK, `makedev` is defined as more than 32-bit (
promoting to `unsigned long long` then left-shifting by 32bit), while
`dev_t` is still 32-bit.
This commit is contained in:
Nobuyoshi Nakada 2025-06-11 23:29:41 +09:00 committed by Nobuyoshi Nakada
parent 071aa02a4a
commit c7f5ae981a
Notes: git 2025-06-13 10:36:05 +00:00

4
file.c
View file

@ -662,7 +662,7 @@ rb_stat_dev(VALUE self)
#if RUBY_USE_STATX
unsigned int m = get_stat(self)->stx_dev_major;
unsigned int n = get_stat(self)->stx_dev_minor;
return DEVT2NUM(makedev(m, n));
return ULL2NUM(makedev(m, n));
#elif SIZEOF_STRUCT_STAT_ST_DEV <= SIZEOF_DEV_T
return DEVT2NUM(get_stat(self)->st_dev);
#elif SIZEOF_STRUCT_STAT_ST_DEV <= SIZEOF_LONG
@ -833,7 +833,7 @@ rb_stat_rdev(VALUE self)
#if RUBY_USE_STATX
unsigned int m = get_stat(self)->stx_rdev_major;
unsigned int n = get_stat(self)->stx_rdev_minor;
return DEVT2NUM(makedev(m, n));
return ULL2NUM(makedev(m, n));
#elif !defined(HAVE_STRUCT_STAT_ST_RDEV)
return Qnil;
#elif SIZEOF_STRUCT_STAT_ST_RDEV <= SIZEOF_DEV_T