From: Elliott Hughes Date: Wed, 24 Sep 2014 02:09:50 +0000 (-0700) Subject: Don't risk truncating open flags by using mode_t X-Git-Tag: v4.10~381 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=22e34b98578b8fab6be7fb608579e4fc601b2ed0;p=strace 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 --- 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")); }