Skip to content

fopen: fix narrowing conversion warning on 32-bit Android - #12998

Closed
kiefer-andreas wants to merge 1 commit into
curl:masterfrom
kiefer-andreas:fopen_android_warning_regression
Closed

kiefer-andreas wants to merge 1 commit into
curl:masterfrom
kiefer-andreas:fopen_android_warning_regression

Conversation

@kiefer-andreas

@kiefer-andreas kiefer-andreas commented Feb 26, 2024 •

Copy link
Copy Markdown
Contributor

This was fixed in commit 06dc599, but came back in commit 03cb1ff.

When building for 32-bit ARM or x86 Android, st_mode is defined as unsigned int instead of mode_t, resulting in a -Wimplicit-int-conversion clang warning because mode_t is unsigned short. Add a cast to silence the warning, but only for Android builds, because other architectures and platforms are not affected.

Ref: https://android.googlesource.com/platform/bionic/+/refs/tags/ndk-r25c/libc/include/sys/stat.h#86

@bagder

bagder commented Feb 26, 2024

Copy link
Copy Markdown
Member

The description says "on 32-bit Android" but the code is clearly done unconditionally for all Android builds. I presume that is what is intended even though there is no mention of non-32 bit?

@kiefer-andreas

Copy link
Copy Markdown
Contributor Author

Ah, yes. Sorry. For 64-bit st_mode is defined as mode_t, so the cast is not necessary. Will update the commit.

This was fixed in commit 06dc599, but came back in commit
03cb1ff.

When building for 32-bit ARM or x86 Android, `st_mode` is defined as
`unsigned int` instead of `mode_t`, resulting in a
`-Wimplicit-int-conversion` clang warning because `mode_t` is
`unsigned short`. Add a cast to silence the warning, but only for
Android builds, because other architectures and platforms are not
affected.

Ref: https://android.googlesource.com/platform/bionic/+/refs/tags/ndk-r25c/libc/include/sys/stat.h#86
@MarcelRaad

Copy link
Copy Markdown
Member

Thanks Andreas!

vszakats added a commit that referenced this pull request Sep 29, 2026
Add `CURLX_FILE_MODE(mode)` macro which casts the value to `mode_t` on
32-bit Android and passes it through as-is on other platforms.

Replace existing workaround with it, and apply to the recently
reintroduced `fchmod()` call that missed it.

Fixing:
```
lib/curl_fopen.c:146:24: error: implicit conversion loses integer precision: 'unsigned int' to 'mode_t' (aka 'unsigned short') [-Wimplicit-int-conversion]
  146 |       if(fchmod(fd, sb.st_mode) == -1)
      |          ~~~~~~     ~~~^~~~~~~
```
Ref: https://github.com/curl/curl/actions/runs/36549680315/job/109344511716?pr=23159#step:8:30

Ref: https://android.googlesource.com/platform/bionic/+/refs/tags/ndk-r25c/libc/include/sys/stat.h#86

Reported-by: Marcel Raad
Fixes #23157

Follow-up to 83b7ad0 #22843
Follow-up to f0eacd9 #12998
Follow-up to 03cb1ff #12395 #12299
Follow-up to 06dc599 #11313

Closes #23158
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

3 participants