Byte-swapping issue in getresuid on qemu-user-sparc64
Host environment
- Operating system: Debian bookworm/sid
- OS/kernel version: Linux 6.0.10-2 (2022-12-01) x86_64 (Debian 6.0.0-5-amd64)
- Architecture: x86_64
- QEMU flavor: qemu-sparc64-static (user/binfmt_misc mode)
- QEMU version: qemu-sparc64 version 7.1.0 (Debian 1:7.1+dfsg-2+b3)
- QEMU command line: (see test case below)
Emulated/Virtualized environment
- Operating system: Debian sid
- OS/kernel version: Linux 6.0.10-2 (2022-12-01) sparc64 (Debian 6.0.0-5-amd64)
- Architecture: sparc64
Description of problem
When calling getresuid() in the big-endian sparc64 guest, the uid_t values are written with their 16-bit halves reversed.
For example, the UID 0x000003e8 (1000) becomes 0x03e80000.
Steps to reproduce
A minimal test case looks like this:
#define _GNU_SOURCE
#include <stdio.h>
#include <sys/types.h>
#include <pwd.h>
#include <unistd.h>
int main(int argc, char **argv) {
struct passwd *pw = getpwuid(geteuid());
if (pw == NULL) {
perror("getpwuid failure");
return 1;
}
printf("getpwuid()->pw_uid=0x%08x\n", pw->pw_uid);
uid_t ruid = 0, euid = 0, suid = 0;
if (getresuid(&ruid, &euid, &suid) != 0) {
perror("getresuid failure");
return 1;
}
printf("getresuid()->suid=0x%08x\n", suid);
return 0;
}
Compile and run with:
$ sparc64-linux-gnu-gcc -Wall -O0 -g -o sid-sparc64/test test.c
$ sudo chroot sid-sparc64
[chroot] $ qemu-sparc64-static ./test
Alternatively, static compilation without a chroot is also possible (despite a warning about getpwuid()
):
$ sparc64-linux-gnu-gcc -static -Wall -O0 -g -o test test.c
$ qemu-sparc64-static ./test
Expected output:
$ ./test
getpwuid()->pw_uid=0x000003e8
getresuid()->suid=0x000003e8
Actual output:
$ ./test
getpwuid()->pw_uid=0x000003e8
getresuid()->suid=0x03e80000
Additional information
I'm not sure if this is a glibc, qemu or kernel issue, but it doesn't occur outside qemu.