Fix argument printing in sys_mmap64
* mem.c (sys_mmap64): Fix a bug where we used tcp->u_args[i] instead of argument values copied from memory. Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
This commit is contained in:
parent
4b887a5a9a
commit
d5e66c4b97
18
mem.c
18
mem.c
@ -334,6 +334,11 @@ sys_mmap(struct tcb *tcp)
|
|||||||
#endif /* !HAVE_LONG_LONG_OFF_T */
|
#endif /* !HAVE_LONG_LONG_OFF_T */
|
||||||
|
|
||||||
#if _LFS64_LARGEFILE || HAVE_LONG_LONG_OFF_T
|
#if _LFS64_LARGEFILE || HAVE_LONG_LONG_OFF_T
|
||||||
|
/* TODO: comment which arches use this routine.
|
||||||
|
* For one, does ALPHA on Linux use this??
|
||||||
|
* From code it seems that it might use 7 or 8 registers,
|
||||||
|
* which is strange - Linux syscalls can pass maximum of 6 parameters!
|
||||||
|
*/
|
||||||
int
|
int
|
||||||
sys_mmap64(struct tcb *tcp)
|
sys_mmap64(struct tcb *tcp)
|
||||||
{
|
{
|
||||||
@ -362,12 +367,17 @@ sys_mmap64(struct tcb *tcp)
|
|||||||
#endif
|
#endif
|
||||||
/* fd */
|
/* fd */
|
||||||
tprintf(", ");
|
tprintf(", ");
|
||||||
/* BUG?! should be u_arg[4] (without tcp->)? */
|
printfd(tcp, u_arg[4]);
|
||||||
printfd(tcp, tcp->u_arg[4]);
|
|
||||||
/* offset */
|
/* offset */
|
||||||
/* BUG?! on non-ALPHA linux, offset will be not in tcp->u_arg,
|
#if !defined(LINUX) || defined(ALPHA)
|
||||||
* but in local u_arg, but printllval prints tcp->u_arg! */
|
|
||||||
printllval(tcp, ", %#llx", 5);
|
printllval(tcp, ", %#llx", 5);
|
||||||
|
#else
|
||||||
|
/* NOTE: not verified that [5] and [6] should be used.
|
||||||
|
* It's possible that long long is 64-bit aligned in memory
|
||||||
|
* and we need to use [6] and [7] here instead:
|
||||||
|
*/
|
||||||
|
tprintf(", %#llx", LONG_LONG(u_arg[5], u_arg[6]));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
return RVAL_HEX;
|
return RVAL_HEX;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user