From 22e34b98578b8fab6be7fb608579e4fc601b2ed0 Mon Sep 17 00:00:00 2001 From: Elliott Hughes Date: Tue, 23 Sep 2014 19:09:50 -0700 Subject: [PATCH] Don't risk truncating open flags by using mode_t On Android, 32-bit arm and x86 use __kernel_mode_t (an unsigned short) as their mode_t. The open(2) flags are actually an int, so high ones like O_CLOEXEC get truncated if you coerce them to mode_t. * defs.h (tprint_open_modes, sprint_open_modes): Change argument type from mode_t to int. * file.c (tprint_open_modes, sprint_open_modes): Likewise. Signed-off-by: Elliott Hughes Signed-off-by: Dmitry V. Levin --- defs.h | 4 ++-- file.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/defs.h b/defs.h index cd9817b8..5bfeb6b4 100644 --- a/defs.h +++ b/defs.h @@ -708,8 +708,8 @@ extern void print_sigset_addr_len(struct tcb *, long, long); extern void printsignal(int); extern void tprint_iov(struct tcb *, unsigned long, unsigned long, int decode_iov); extern void tprint_iov_upto(struct tcb *, unsigned long, unsigned long, int decode_iov, unsigned long); -extern void tprint_open_modes(mode_t); -extern const char *sprint_open_modes(mode_t); +extern void tprint_open_modes(int); +extern const char *sprint_open_modes(int); extern void print_loff_t(struct tcb *, long); extern const struct_ioctlent *ioctl_lookup(unsigned long); diff --git a/file.c b/file.c index c2bf6d3a..0ec1d4b6 100644 --- a/file.c +++ b/file.c @@ -237,7 +237,7 @@ print_dirfd(struct tcb *tcp, int fd) * other bits are real flags. */ const char * -sprint_open_modes(mode_t flags) +sprint_open_modes(int flags) { static char outstr[(1 + ARRAY_SIZE(open_mode_flags)) * sizeof("O_LARGEFILE")]; char *p; @@ -274,7 +274,7 @@ sprint_open_modes(mode_t flags) } void -tprint_open_modes(mode_t flags) +tprint_open_modes(int flags) { tprints(sprint_open_modes(flags) + sizeof("flags")); } -- 2.40.0