diff options
author | Denys Vlasenko <dvlasenk@redhat.com> | 2013-07-18 18:10:13 +0200 |
---|---|---|
committer | Denys Vlasenko <dvlasenk@redhat.com> | 2013-07-18 18:10:13 +0200 |
commit | 8a1ebbbee95a3412a3c7bfee21f6d33c11293d30 (patch) | |
tree | d92a07decdc72d4c8979951f026a47113c0677f8 /desc.c | |
parent | e600ac67ee7b11600773e73ab9772392dd6e6d04 (diff) | |
download | strace-8a1ebbbee95a3412a3c7bfee21f6d33c11293d30.tar.gz strace-8a1ebbbee95a3412a3c7bfee21f6d33c11293d30.tar.bz2 strace-8a1ebbbee95a3412a3c7bfee21f6d33c11293d30.tar.xz |
Add compat support for sys_pselect6
Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
Diffstat (limited to 'desc.c')
-rw-r--r-- | desc.c | 19 |
1 files changed, 16 insertions, 3 deletions
@@ -1048,16 +1048,29 @@ sys_pselect6(struct tcb *tcp) { int rc = decode_select(tcp, tcp->u_arg, BITNESS_CURRENT); if (entering(tcp)) { + long r; struct { - void *ss; + unsigned long ptr; unsigned long len; } data; - if (umove(tcp, tcp->u_arg[5], &data) < 0) +#if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4 + if (current_wordsize == 4) { + struct { + uint32_t ptr; + uint32_t len; + } data32; + r = umove(tcp, tcp->u_arg[5], &data32); + data.ptr = data32.ptr; + data.len = data32.len; + } else +#endif + r = umove(tcp, tcp->u_arg[5], &data); + if (r < 0) tprintf(", %#lx", tcp->u_arg[5]); else { tprints(", {"); /* NB: kernel requires data.len == NSIG / 8 */ - print_sigset_addr_len(tcp, (long)data.ss, data.len); + print_sigset_addr_len(tcp, data.ptr, data.len); tprintf(", %lu}", data.len); } } |