Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
posix: mqueue: pop mode as int with va_arg()
There was some discussion about whether it was suitable to have an architecture-specific workaround in mqueue.c after that workaround was copied to a different source file in a PR. The original issue was that newlib and picolibc declare mode_t to be unsigned short instead of unsigned long when __svr4__ is not defined along with __sparc__. This is specifically impactful, because va_arg() deals (mainly) with 32-bit and 64-bit values that are all naturally aligned to 4 bytes. #if defined(__sparc__) && !defined(__sparc_v9__) #ifdef __svr4__ typedef unsigned long __mode_t; #else typedef unsigned short __mode_t; #endif A uint16_t is naturally aligned to 2 bytes, so not only would a 16-bit mode_t be corrupted, it would also generate a warning with recent gcc versions which is promoted to error (rightfully so) when run through CI. mqueue.c:61:35: error: 'mode_t' {aka 'short unsigned int'} is promoted to 'int' when passed through '...' [-Werror] 61 | mode = va_arg(va, mode_t); Instead of using an architecture-specific workaround, simply add a build assert that the size of mode_t is less than or equal to the size of an int, and use an int to retrieve it via va_arg(). Signed-off-by: Christopher Friedt <cfriedt@meta.com> # Please enter the commit message for your changes. Lines starting # with '#' will be kept; you may remove them yourself if you want to. # An empty message aborts the commit. # # Date: Fri Dec 29 10:06:44 2023 -0500 # # On branch posix-mqueue-always-use-int-for-mode-t-va-arg # Changes to be committed: # modified: lib/posix/mqueue.c # modified: tests/posix/common/testcase.yaml #
- Loading branch information