* [ruby-core:103389] [Ruby master Bug#17793] `shorten-64-to-32` error for 32-bit Android due to `struct stat` definition
2021-04-11 17:39 [ruby-core:103386] [Ruby master Bug#17793] `shorten-64-to-32` error for 32-bit Android due to `struct stat` definition xtkoba+ruby
@ 2021-04-12 3:53 ` nobu
2021-04-12 4:55 ` [ruby-core:103391] " xtkoba+ruby
` (5 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: nobu @ 2021-04-12 3:53 UTC (permalink / raw)
To: ruby-core
Issue #17793 has been updated by nobu (Nobuyoshi Nakada).
Do these work?
```diff
diff --git i/configure.ac w/configure.ac
index 6fe43bfc8dd..f08597a007c 100644
--- i/configure.ac
+++ w/configure.ac
@@ -1703,6 +1703,10 @@ AS_IF([test "$ac_cv_member_struct_stat_st_blocks" = yes], [
RUBY_CHECK_SIZEOF([struct stat.st_blocks], [off_t int long "long long"], [], [@%:@include <sys/stat.h>])
])
RUBY_CHECK_SIZEOF([struct stat.st_ino], [long "long long"], [], [@%:@include <sys/stat.h>])
+RUBY_CHECK_SIZEOF([struct stat.st_dev], [dev_t int long "long long"], [], [@%:@include <sys/stat.h>])
+AS_IF([test "$ac_cv_member_struct_stat_st_rdev" = yes], [
+ RUBY_CHECK_SIZEOF([struct stat.st_rdev], [dev_t int long "long long"], [], [@%:@include <sys/stat.h>])
+])
AC_CHECK_MEMBERS([struct stat.st_atim])
AC_CHECK_MEMBERS([struct stat.st_atimespec])
AC_CHECK_MEMBERS([struct stat.st_atimensec])
diff --git i/file.c w/file.c
index 6e6dfbca172..07f59b6de31 100644
--- i/file.c
+++ w/file.c
@@ -577,7 +577,13 @@ rb_stat_cmp(VALUE self, VALUE other)
static VALUE
rb_stat_dev(VALUE self)
{
+#if SIZEOF_STRUCT_STAT_ST_DEV <= SIZEOF_DEVT
return DEVT2NUM(get_stat(self)->st_dev);
+#elif SIZEOF_STRUCT_STAT_ST_DEV <= SIZEOF_LONG
+ return ULONG2NUM(get_stat(self)->st_dev);
+#else
+ return ULL2NUM(get_stat(self)->st_dev);
+#endif
}
/*
@@ -747,7 +753,13 @@ static VALUE
rb_stat_rdev(VALUE self)
{
#ifdef HAVE_STRUCT_STAT_ST_RDEV
+# if SIZEOF_STRUCT_STAT_ST_RDEV <= SIZEOF_DEVT
return DEVT2NUM(get_stat(self)->st_rdev);
+# elif SIZEOF_STRUCT_STAT_ST_RDEV <= SIZEOF_LONG
+ return ULONG2NUM(get_stat(self)->st_rdev);
+# else
+ return ULL2NUM(get_stat(self)->st_rdev);
+# endif
#else
return Qnil;
#endif
```
```diff
diff --git i/file.c w/file.c
index 6e6dfbca172..07f59b6de31 100644
--- i/file.c
+++ w/file.c
@@ -6253,9 +6253,17 @@ path_check_0(VALUE path)
&& !(p && (st.st_mode & S_ISVTX))
#endif
&& !access(p0, W_OK)) {
+#if SIZEOF_DEVT > SIZEOF_INT
+# define PRI_ST_MODE_PREFIX PRI_MODET_PREFIX
+ rb_dev_t mode;
+#else
+# define PRI_ST_MODE_PREFIX ""
+ unsigned int mode;
+#endif
+ mode = st.st_mode;
rb_enc_warn(enc, "Insecure world writable dir %s in PATH, mode 0%"
- PRI_MODET_PREFIX"o",
- p0, st.st_mode);
+ PRI_ST_MODE_PREFIX"o",
+ p0, mode);
if (p) *p = '/';
RB_GC_GUARD(path);
return 0;
```
----------------------------------------
Bug #17793: `shorten-64-to-32` error for 32-bit Android due to `struct stat` definition
https://bugs.ruby-lang.org/issues/17793#change-91484
* Author: xtkoba (Tee KOBAYASHI)
* Status: Open
* Priority: Normal
* Backport: 2.6: UNKNOWN, 2.7: UNKNOWN, 3.0: UNKNOWN
----------------------------------------
[Here is a failure log for armv7a-android from CI.](http://rubyci.s3.amazonaws.com/crossruby/crossruby-master-armv7a-android30/log/20210411T143751Z.fail.html.gz)
This failure is because `struct stat` for 32-bit Android is defined as follows. Note that the member `st_dev` is of type `unsigned long long` (instead of `dev_t`), and `st_mode` is of type `unsigned int` (instead of `mode_t`).
```c
struct stat {
unsigned long long st_dev;
unsigned char __pad0[4];
unsigned long __st_ino;
unsigned int st_mode;
nlink_t st_nlink;
uid_t st_uid;
gid_t st_gid;
unsigned long long st_rdev;
unsigned char __pad3[4];
long long st_size;
unsigned long st_blksize;
unsigned long long st_blocks;
struct timespec st_atim;
struct timespec st_mtim;
struct timespec st_ctim;
unsigned long long st_ino;
};
```
I personally avoid these errors by passing the following two arguments to `./configure`. I am not 100% sure this results in no other problems.
```
rb_cv_dev_t_convertible=ULL
rb_cv_mode_t_convertible=UINT
```
--
https://bugs.ruby-lang.org/
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [ruby-core:103391] [Ruby master Bug#17793] `shorten-64-to-32` error for 32-bit Android due to `struct stat` definition
2021-04-11 17:39 [ruby-core:103386] [Ruby master Bug#17793] `shorten-64-to-32` error for 32-bit Android due to `struct stat` definition xtkoba+ruby
2021-04-12 3:53 ` [ruby-core:103389] " nobu
@ 2021-04-12 4:55 ` xtkoba+ruby
2021-04-12 5:30 ` [ruby-core:103392] " nobu
` (4 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: xtkoba+ruby @ 2021-04-12 4:55 UTC (permalink / raw)
To: ruby-core
Issue #17793 has been updated by xtkoba (Tee KOBAYASHI).
user:nobu Thanks, it builds for armv7a-android without error or format warning.
----------------------------------------
Bug #17793: `shorten-64-to-32` error for 32-bit Android due to `struct stat` definition
https://bugs.ruby-lang.org/issues/17793#change-91485
* Author: xtkoba (Tee KOBAYASHI)
* Status: Open
* Priority: Normal
* Backport: 2.6: UNKNOWN, 2.7: UNKNOWN, 3.0: UNKNOWN
----------------------------------------
[Here is a failure log for armv7a-android from CI.](http://rubyci.s3.amazonaws.com/crossruby/crossruby-master-armv7a-android30/log/20210411T143751Z.fail.html.gz)
This failure is because `struct stat` for 32-bit Android is defined as follows. Note that the member `st_dev` is of type `unsigned long long` (instead of `dev_t`), and `st_mode` is of type `unsigned int` (instead of `mode_t`).
```c
struct stat {
unsigned long long st_dev;
unsigned char __pad0[4];
unsigned long __st_ino;
unsigned int st_mode;
nlink_t st_nlink;
uid_t st_uid;
gid_t st_gid;
unsigned long long st_rdev;
unsigned char __pad3[4];
long long st_size;
unsigned long st_blksize;
unsigned long long st_blocks;
struct timespec st_atim;
struct timespec st_mtim;
struct timespec st_ctim;
unsigned long long st_ino;
};
```
I personally avoid these errors by passing the following two arguments to `./configure`. I am not 100% sure this results in no other problems.
```
rb_cv_dev_t_convertible=ULL
rb_cv_mode_t_convertible=UINT
```
--
https://bugs.ruby-lang.org/
^ permalink raw reply [flat|nested] 8+ messages in thread
* [ruby-core:103392] [Ruby master Bug#17793] `shorten-64-to-32` error for 32-bit Android due to `struct stat` definition
2021-04-11 17:39 [ruby-core:103386] [Ruby master Bug#17793] `shorten-64-to-32` error for 32-bit Android due to `struct stat` definition xtkoba+ruby
2021-04-12 3:53 ` [ruby-core:103389] " nobu
2021-04-12 4:55 ` [ruby-core:103391] " xtkoba+ruby
@ 2021-04-12 5:30 ` nobu
2021-04-12 5:48 ` [ruby-core:103394] " nobu
` (3 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: nobu @ 2021-04-12 5:30 UTC (permalink / raw)
To: ruby-core
Issue #17793 has been updated by nobu (Nobuyoshi Nakada).
Sorry, the second patch had a typo, `SIZEOF_DEVT` should be `SIZEOF_DEV_T`.
Is it fine?
----------------------------------------
Bug #17793: `shorten-64-to-32` error for 32-bit Android due to `struct stat` definition
https://bugs.ruby-lang.org/issues/17793#change-91486
* Author: xtkoba (Tee KOBAYASHI)
* Status: Open
* Priority: Normal
* Backport: 2.6: UNKNOWN, 2.7: UNKNOWN, 3.0: UNKNOWN
----------------------------------------
[Here is a failure log for armv7a-android from CI.](http://rubyci.s3.amazonaws.com/crossruby/crossruby-master-armv7a-android30/log/20210411T143751Z.fail.html.gz)
This failure is because `struct stat` for 32-bit Android is defined as follows. Note that the member `st_dev` is of type `unsigned long long` (instead of `dev_t`), and `st_mode` is of type `unsigned int` (instead of `mode_t`).
```c
struct stat {
unsigned long long st_dev;
unsigned char __pad0[4];
unsigned long __st_ino;
unsigned int st_mode;
nlink_t st_nlink;
uid_t st_uid;
gid_t st_gid;
unsigned long long st_rdev;
unsigned char __pad3[4];
long long st_size;
unsigned long st_blksize;
unsigned long long st_blocks;
struct timespec st_atim;
struct timespec st_mtim;
struct timespec st_ctim;
unsigned long long st_ino;
};
```
I personally avoid these errors by passing the following two arguments to `./configure`. I am not 100% sure this results in no other problems.
```
rb_cv_dev_t_convertible=ULL
rb_cv_mode_t_convertible=UINT
```
--
https://bugs.ruby-lang.org/
^ permalink raw reply [flat|nested] 8+ messages in thread
* [ruby-core:103394] [Ruby master Bug#17793] `shorten-64-to-32` error for 32-bit Android due to `struct stat` definition
2021-04-11 17:39 [ruby-core:103386] [Ruby master Bug#17793] `shorten-64-to-32` error for 32-bit Android due to `struct stat` definition xtkoba+ruby
` (2 preceding siblings ...)
2021-04-12 5:30 ` [ruby-core:103392] " nobu
@ 2021-04-12 5:48 ` nobu
2021-04-12 6:00 ` [ruby-core:103395] " xtkoba+ruby
` (2 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: nobu @ 2021-04-12 5:48 UTC (permalink / raw)
To: ruby-core
Issue #17793 has been updated by nobu (Nobuyoshi Nakada).
All `SIZEOF_DEVT` were typo.
----------------------------------------
Bug #17793: `shorten-64-to-32` error for 32-bit Android due to `struct stat` definition
https://bugs.ruby-lang.org/issues/17793#change-91488
* Author: xtkoba (Tee KOBAYASHI)
* Status: Open
* Priority: Normal
* Backport: 2.6: UNKNOWN, 2.7: UNKNOWN, 3.0: UNKNOWN
----------------------------------------
[Here is a failure log for armv7a-android from CI.](http://rubyci.s3.amazonaws.com/crossruby/crossruby-master-armv7a-android30/log/20210411T143751Z.fail.html.gz)
This failure is because `struct stat` for 32-bit Android is defined as follows. Note that the member `st_dev` is of type `unsigned long long` (instead of `dev_t`), and `st_mode` is of type `unsigned int` (instead of `mode_t`).
```c
struct stat {
unsigned long long st_dev;
unsigned char __pad0[4];
unsigned long __st_ino;
unsigned int st_mode;
nlink_t st_nlink;
uid_t st_uid;
gid_t st_gid;
unsigned long long st_rdev;
unsigned char __pad3[4];
long long st_size;
unsigned long st_blksize;
unsigned long long st_blocks;
struct timespec st_atim;
struct timespec st_mtim;
struct timespec st_ctim;
unsigned long long st_ino;
};
```
I personally avoid these errors by passing the following two arguments to `./configure`. I am not 100% sure this results in no other problems.
```
rb_cv_dev_t_convertible=ULL
rb_cv_mode_t_convertible=UINT
```
--
https://bugs.ruby-lang.org/
^ permalink raw reply [flat|nested] 8+ messages in thread
* [ruby-core:103395] [Ruby master Bug#17793] `shorten-64-to-32` error for 32-bit Android due to `struct stat` definition
2021-04-11 17:39 [ruby-core:103386] [Ruby master Bug#17793] `shorten-64-to-32` error for 32-bit Android due to `struct stat` definition xtkoba+ruby
` (3 preceding siblings ...)
2021-04-12 5:48 ` [ruby-core:103394] " nobu
@ 2021-04-12 6:00 ` xtkoba+ruby
2021-04-12 6:36 ` [ruby-core:103396] " nobu
2021-04-12 6:56 ` [ruby-core:103398] " xtkoba+ruby
6 siblings, 0 replies; 8+ messages in thread
From: xtkoba+ruby @ 2021-04-12 6:00 UTC (permalink / raw)
To: ruby-core
Issue #17793 has been updated by xtkoba (Tee KOBAYASHI).
It makes no difference because neither `SIZEOF_DEVT` nor `SIZEOF_DEV_T` is defined on Android (both for 32- and 64-bit). Is this as expected?
For armv7a-android16:
```
$ clang (...snip...) -o file.o -c ../file.c -Wundef
../file.c:580:34: warning: 'SIZEOF_DEV_T' is not defined, evaluates to 0 [-Wundef]
#if SIZEOF_STRUCT_STAT_ST_DEV <= SIZEOF_DEV_T
^
../file.c:756:36: warning: 'SIZEOF_DEV_T' is not defined, evaluates to 0 [-Wundef]
# if SIZEOF_STRUCT_STAT_ST_RDEV <= SIZEOF_DEV_T
^
../file.c:6269:5: warning: 'SIZEOF_DEV_T' is not defined, evaluates to 0 [-Wundef]
#if SIZEOF_DEV_T > SIZEOF_INT
^
3 warnings generated.
```
For aarch64-android21:
```
$ clang (...snip...) -o file.o -c ../file.c -Wundef
../file.c:580:5: warning: 'SIZEOF_DEV_T' is not defined, evaluates to 0 [-Wundef]
#if SIZEOF_STRUCT_STAT_ST_DEV <= SIZEOF_DEV_T
^
.ext/include/aarch64-linux-android/ruby/config.h:170:35: note: expanded from macro 'SIZEOF_STRUCT_STAT_ST_DEV'
#define SIZEOF_STRUCT_STAT_ST_DEV SIZEOF_DEV_T
^
../file.c:580:34: warning: 'SIZEOF_DEV_T' is not defined, evaluates to 0 [-Wundef]
#if SIZEOF_STRUCT_STAT_ST_DEV <= SIZEOF_DEV_T
^
../file.c:756:6: warning: 'SIZEOF_DEV_T' is not defined, evaluates to 0 [-Wundef]
# if SIZEOF_STRUCT_STAT_ST_RDEV <= SIZEOF_DEV_T
^
.ext/include/aarch64-linux-android/ruby/config.h:171:36: note: expanded from macro 'SIZEOF_STRUCT_STAT_ST_RDEV'
#define SIZEOF_STRUCT_STAT_ST_RDEV SIZEOF_DEV_T
^
../file.c:756:36: warning: 'SIZEOF_DEV_T' is not defined, evaluates to 0 [-Wundef]
# if SIZEOF_STRUCT_STAT_ST_RDEV <= SIZEOF_DEV_T
^
../file.c:6269:5: warning: 'SIZEOF_DEV_T' is not defined, evaluates to 0 [-Wundef]
#if SIZEOF_DEV_T > SIZEOF_INT
^
5 warnings generated.
```
----------------------------------------
Bug #17793: `shorten-64-to-32` error for 32-bit Android due to `struct stat` definition
https://bugs.ruby-lang.org/issues/17793#change-91489
* Author: xtkoba (Tee KOBAYASHI)
* Status: Open
* Priority: Normal
* Backport: 2.6: UNKNOWN, 2.7: UNKNOWN, 3.0: UNKNOWN
----------------------------------------
[Here is a failure log for armv7a-android from CI.](http://rubyci.s3.amazonaws.com/crossruby/crossruby-master-armv7a-android30/log/20210411T143751Z.fail.html.gz)
This failure is because `struct stat` for 32-bit Android is defined as follows. Note that the member `st_dev` is of type `unsigned long long` (instead of `dev_t`), and `st_mode` is of type `unsigned int` (instead of `mode_t`).
```c
struct stat {
unsigned long long st_dev;
unsigned char __pad0[4];
unsigned long __st_ino;
unsigned int st_mode;
nlink_t st_nlink;
uid_t st_uid;
gid_t st_gid;
unsigned long long st_rdev;
unsigned char __pad3[4];
long long st_size;
unsigned long st_blksize;
unsigned long long st_blocks;
struct timespec st_atim;
struct timespec st_mtim;
struct timespec st_ctim;
unsigned long long st_ino;
};
```
I personally avoid these errors by passing the following two arguments to `./configure`. I am not 100% sure this results in no other problems.
```
rb_cv_dev_t_convertible=ULL
rb_cv_mode_t_convertible=UINT
```
--
https://bugs.ruby-lang.org/
^ permalink raw reply [flat|nested] 8+ messages in thread
* [ruby-core:103396] [Ruby master Bug#17793] `shorten-64-to-32` error for 32-bit Android due to `struct stat` definition
2021-04-11 17:39 [ruby-core:103386] [Ruby master Bug#17793] `shorten-64-to-32` error for 32-bit Android due to `struct stat` definition xtkoba+ruby
` (4 preceding siblings ...)
2021-04-12 6:00 ` [ruby-core:103395] " xtkoba+ruby
@ 2021-04-12 6:36 ` nobu
2021-04-12 6:56 ` [ruby-core:103398] " xtkoba+ruby
6 siblings, 0 replies; 8+ messages in thread
From: nobu @ 2021-04-12 6:36 UTC (permalink / raw)
To: ruby-core
Issue #17793 has been updated by nobu (Nobuyoshi Nakada).
File 0001-Bug-17793-Support-non-standard-struct-stat.patch added
Patch updated.
----------------------------------------
Bug #17793: `shorten-64-to-32` error for 32-bit Android due to `struct stat` definition
https://bugs.ruby-lang.org/issues/17793#change-91490
* Author: xtkoba (Tee KOBAYASHI)
* Status: Open
* Priority: Normal
* Backport: 2.6: UNKNOWN, 2.7: UNKNOWN, 3.0: UNKNOWN
----------------------------------------
[Here is a failure log for armv7a-android from CI.](http://rubyci.s3.amazonaws.com/crossruby/crossruby-master-armv7a-android30/log/20210411T143751Z.fail.html.gz)
This failure is because `struct stat` for 32-bit Android is defined as follows. Note that the member `st_dev` is of type `unsigned long long` (instead of `dev_t`), and `st_mode` is of type `unsigned int` (instead of `mode_t`).
```c
struct stat {
unsigned long long st_dev;
unsigned char __pad0[4];
unsigned long __st_ino;
unsigned int st_mode;
nlink_t st_nlink;
uid_t st_uid;
gid_t st_gid;
unsigned long long st_rdev;
unsigned char __pad3[4];
long long st_size;
unsigned long st_blksize;
unsigned long long st_blocks;
struct timespec st_atim;
struct timespec st_mtim;
struct timespec st_ctim;
unsigned long long st_ino;
};
```
I personally avoid these errors by passing the following two arguments to `./configure`. I am not 100% sure this results in no other problems.
```
rb_cv_dev_t_convertible=ULL
rb_cv_mode_t_convertible=UINT
```
---Files--------------------------------
0001-Bug-17793-Support-non-standard-struct-stat.patch (2.73 KB)
--
https://bugs.ruby-lang.org/
^ permalink raw reply [flat|nested] 8+ messages in thread
* [ruby-core:103398] [Ruby master Bug#17793] `shorten-64-to-32` error for 32-bit Android due to `struct stat` definition
2021-04-11 17:39 [ruby-core:103386] [Ruby master Bug#17793] `shorten-64-to-32` error for 32-bit Android due to `struct stat` definition xtkoba+ruby
` (5 preceding siblings ...)
2021-04-12 6:36 ` [ruby-core:103396] " nobu
@ 2021-04-12 6:56 ` xtkoba+ruby
6 siblings, 0 replies; 8+ messages in thread
From: xtkoba+ruby @ 2021-04-12 6:56 UTC (permalink / raw)
To: ruby-core
Issue #17793 has been updated by xtkoba (Tee KOBAYASHI).
With the patch in #note-6 applied, `file.c` is compiled without any error or warning (including `-Wundef`) for armv7a- and aarch64-android.
----------------------------------------
Bug #17793: `shorten-64-to-32` error for 32-bit Android due to `struct stat` definition
https://bugs.ruby-lang.org/issues/17793#change-91492
* Author: xtkoba (Tee KOBAYASHI)
* Status: Open
* Priority: Normal
* Backport: 2.6: UNKNOWN, 2.7: UNKNOWN, 3.0: UNKNOWN
----------------------------------------
[Here is a failure log for armv7a-android from CI.](http://rubyci.s3.amazonaws.com/crossruby/crossruby-master-armv7a-android30/log/20210411T143751Z.fail.html.gz)
This failure is because `struct stat` for 32-bit Android is defined as follows. Note that the member `st_dev` is of type `unsigned long long` (instead of `dev_t`), and `st_mode` is of type `unsigned int` (instead of `mode_t`).
```c
struct stat {
unsigned long long st_dev;
unsigned char __pad0[4];
unsigned long __st_ino;
unsigned int st_mode;
nlink_t st_nlink;
uid_t st_uid;
gid_t st_gid;
unsigned long long st_rdev;
unsigned char __pad3[4];
long long st_size;
unsigned long st_blksize;
unsigned long long st_blocks;
struct timespec st_atim;
struct timespec st_mtim;
struct timespec st_ctim;
unsigned long long st_ino;
};
```
I personally avoid these errors by passing the following two arguments to `./configure`. I am not 100% sure this results in no other problems.
```
rb_cv_dev_t_convertible=ULL
rb_cv_mode_t_convertible=UINT
```
---Files--------------------------------
0001-Bug-17793-Support-non-standard-struct-stat.patch (2.73 KB)
--
https://bugs.ruby-lang.org/
^ permalink raw reply [flat|nested] 8+ messages in thread