diff --git a/system.c b/system.c index 54984494..c44a0168 100644 --- a/system.c +++ b/system.c @@ -501,37 +501,37 @@ sys_capget(struct tcb *tcp) /* cap_user_ types are _pointers_ to (small) structs. */ /* Structs themselves have no names defined. */ /* Have to use ugly hack to place them on stack. */ - cap_user_header_t arg0; - cap_user_data_t arg1; - long a0[sizeof(*arg0) / sizeof(long) + 1]; - long a1[sizeof(*arg1) / sizeof(long) + 1]; - arg0 = (cap_user_header_t) a0; - arg1 = (cap_user_data_t ) a1; + union { cap_user_header_t p; long *a; char *c; } arg0; + union { cap_user_data_t p; long *a; char *c; } arg1; + long a0[sizeof(*arg0.p) / sizeof(long) + 1]; + long a1[sizeof(*arg1.p) / sizeof(long) + 1]; + arg0.a = a0; + arg1.a = a1; if (!entering(tcp)) { if (!tcp->u_arg[0]) tprints("NULL"); else if (!verbose(tcp)) tprintf("%#lx", tcp->u_arg[0]); - else if (umoven(tcp, tcp->u_arg[0], sizeof(*arg0), (char *) arg0) < 0) + else if (umoven(tcp, tcp->u_arg[0], sizeof(*arg0.p), arg0.c) < 0) tprints("???"); else { - tprintf("%#x, %d", arg0->version, arg0->pid); + tprintf("%#x, %d", arg0.p->version, arg0.p->pid); } tprints(", "); if (!tcp->u_arg[1]) tprints("NULL"); else if (!verbose(tcp)) tprintf("%#lx", tcp->u_arg[1]); - else if (umoven(tcp, tcp->u_arg[1], sizeof(*arg1), (char *) arg1) < 0) + else if (umoven(tcp, tcp->u_arg[1], sizeof(*arg1.p), arg1.c) < 0) tprints("???"); else { tprints("{"); - printflags(capabilities, arg1->effective, "CAP_???"); + printflags(capabilities, arg1.p->effective, "CAP_???"); tprints(", "); - printflags(capabilities, arg1->permitted, "CAP_???"); + printflags(capabilities, arg1.p->permitted, "CAP_???"); tprints(", "); - printflags(capabilities, arg1->inheritable, "CAP_???"); + printflags(capabilities, arg1.p->inheritable, "CAP_???"); tprints("}"); } } @@ -541,37 +541,37 @@ sys_capget(struct tcb *tcp) int sys_capset(struct tcb *tcp) { - cap_user_header_t arg0; - cap_user_data_t arg1; - long a0[sizeof(*arg0) / sizeof(long) + 1]; - long a1[sizeof(*arg1) / sizeof(long) + 1]; - arg0 = (cap_user_header_t) a0; - arg1 = (cap_user_data_t ) a1; + union { cap_user_header_t p; long *a; char *c; } arg0; + union { cap_user_data_t p; long *a; char *c; } arg1; + long a0[sizeof(*arg0.p) / sizeof(long) + 1]; + long a1[sizeof(*arg1.p) / sizeof(long) + 1]; + arg0.a = a0; + arg1.a = a1; if (entering(tcp)) { if (!tcp->u_arg[0]) tprints("NULL"); else if (!verbose(tcp)) tprintf("%#lx", tcp->u_arg[0]); - else if (umoven(tcp, tcp->u_arg[0], sizeof(*arg0), (char *) arg0) < 0) + else if (umoven(tcp, tcp->u_arg[0], sizeof(*arg0.p), arg0.c) < 0) tprints("???"); else { - tprintf("%#x, %d", arg0->version, arg0->pid); + tprintf("%#x, %d", arg0.p->version, arg0.p->pid); } tprints(", "); if (!tcp->u_arg[1]) tprints("NULL"); else if (!verbose(tcp)) tprintf("%#lx", tcp->u_arg[1]); - else if (umoven(tcp, tcp->u_arg[1], sizeof(*arg1), (char *) arg1) < 0) + else if (umoven(tcp, tcp->u_arg[1], sizeof(*arg1.p), arg1.c) < 0) tprints("???"); else { tprints("{"); - printflags(capabilities, arg1->effective, "CAP_???"); + printflags(capabilities, arg1.p->effective, "CAP_???"); tprints(", "); - printflags(capabilities, arg1->permitted, "CAP_???"); + printflags(capabilities, arg1.p->permitted, "CAP_???"); tprints(", "); - printflags(capabilities, arg1->inheritable, "CAP_???"); + printflags(capabilities, arg1.p->inheritable, "CAP_???"); tprints("}"); } }