Browse Source

linux-user: fix O_TMPFILE handling

Since O_TMPFILE might differ between guest and host,
add it to the bitmask_transtbl. While at it, fix the definitions
of O_DIRECTORY etc which should arm32 according to kernel sources.

This fixes open14 and openat03 ltp testcases. Fixes:

https://bugs.launchpad.net/qemu/+bug/1709170
pull/59/head
Riku Voipio 9 years ago
parent
commit
5f9cee46cd
  1. 4
      linux-user/strace.c
  2. 3
      linux-user/syscall.c
  3. 8
      linux-user/syscall_defs.h

4
linux-user/strace.c

@ -837,6 +837,10 @@ UNUSED static struct flags open_flags[] = {
#endif
#ifdef O_PATH
FLAG_TARGET(O_PATH),
#endif
#ifdef O_TMPFILE
FLAG_TARGET(O_TMPFILE),
FLAG_TARGET(__O_TMPFILE),
#endif
FLAG_END,
};

3
linux-user/syscall.c

@ -341,6 +341,9 @@ static bitmask_transtbl fcntl_flags_tbl[] = {
#endif
#if defined(O_PATH)
{ TARGET_O_PATH, TARGET_O_PATH, O_PATH, O_PATH },
#endif
#if defined(O_TMPFILE)
{ TARGET_O_TMPFILE, TARGET_O_TMPFILE, O_TMPFILE, O_TMPFILE },
#endif
/* Don't terminate the list prematurely on 64-bit host+guest. */
#if TARGET_O_LARGEFILE != 0 || O_LARGEFILE != 0

8
linux-user/syscall_defs.h

@ -2416,7 +2416,7 @@ struct target_statfs64 {
#define TARGET_O_CLOEXEC 010000000
#define TARGET___O_SYNC 000100000
#define TARGET_O_PATH 020000000
#elif defined(TARGET_ARM) || defined(TARGET_M68K)
#elif defined(TARGET_ARM) || defined(TARGET_M68K) || defined(TARGET_AARCH64)
#define TARGET_O_DIRECTORY 040000 /* must be a directory */
#define TARGET_O_NOFOLLOW 0100000 /* don't follow links */
#define TARGET_O_DIRECT 0200000 /* direct disk access hint */
@ -2513,6 +2513,12 @@ struct target_statfs64 {
#ifndef TARGET_O_PATH
#define TARGET_O_PATH 010000000
#endif
#ifndef TARGET___O_TMPFILE
#define TARGET___O_TMPFILE 020000000
#endif
#ifndef TARGET_O_TMPFILE
#define TARGET_O_TMPFILE (TARGET___O_TMPFILE | TARGET_O_DIRECTORY)
#endif
#ifndef TARGET_O_NDELAY
#define TARGET_O_NDELAY TARGET_O_NONBLOCK
#endif

Loading…
Cancel
Save