提交 42b16184 编写于 作者: L Laurent Vivier

linux-user: fix print_syscall_err() when syscall returned value is negative

print_syscall_err() relies on the sign of the returned value to know
if it is an errno value or not.

But in some cases the returned value can have the most signicant bit
set without being an errno.

This patch restores previous behaviour that was also checking if
we can decode the errno to validate it.

This patch fixes this kind of problem (qemu-m68k):

  root@sid:/# QEMU_STRACE= ls
  3 brk(NULL) = -1 errno=21473607683 uname(0x407fff8a) = 0

to become:

  root@sid:/# QEMU_STRACE= ls
  3 brk(NULL) = 0x8001e000
  3 uname(0xffffdf8a) = 0

Fixes: c84be71f ("linux-user: Extend strace support to enable argument printing after syscall execution")
Cc: Filip.Bozuta@syrmia.com
Signed-off-by: NLaurent Vivier <laurent@vivier.eu>
Message-Id: <20200708152435.706070-3-laurent@vivier.eu>
上级 6733d570
......@@ -724,19 +724,20 @@ print_ipc(const struct syscallname *name,
* Variants for the return value output function
*/
static void
static bool
print_syscall_err(abi_long ret)
{
const char *errstr = NULL;
const char *errstr;
qemu_log(" = ");
if (ret < 0) {
qemu_log("-1 errno=%d", (int)-ret);
errstr = target_strerror(-ret);
if (errstr) {
qemu_log(" (%s)", errstr);
qemu_log("-1 errno=%d (%s)", (int)-ret, errstr);
return true;
}
}
return false;
}
static void
......@@ -744,11 +745,10 @@ print_syscall_ret_addr(const struct syscallname *name, abi_long ret,
abi_long arg0, abi_long arg1, abi_long arg2,
abi_long arg3, abi_long arg4, abi_long arg5)
{
print_syscall_err(ret);
if (ret >= 0) {
qemu_log("0x" TARGET_ABI_FMT_lx "\n", ret);
if (!print_syscall_err(ret)) {
qemu_log("0x" TARGET_ABI_FMT_lx, ret);
}
qemu_log("\n");
}
#if 0 /* currently unused */
......@@ -765,9 +765,7 @@ print_syscall_ret_newselect(const struct syscallname *name, abi_long ret,
abi_long arg0, abi_long arg1, abi_long arg2,
abi_long arg3, abi_long arg4, abi_long arg5)
{
print_syscall_err(ret);
if (ret >= 0) {
if (!print_syscall_err(ret)) {
qemu_log(" = 0x" TARGET_ABI_FMT_lx " (", ret);
print_fdset(arg0, arg1);
qemu_log(",");
......@@ -796,9 +794,7 @@ print_syscall_ret_adjtimex(const struct syscallname *name, abi_long ret,
abi_long arg0, abi_long arg1, abi_long arg2,
abi_long arg3, abi_long arg4, abi_long arg5)
{
print_syscall_err(ret);
if (ret >= 0) {
if (!print_syscall_err(ret)) {
qemu_log(TARGET_ABI_FMT_ld, ret);
switch (ret) {
case TARGET_TIME_OK:
......@@ -833,9 +829,7 @@ print_syscall_ret_listxattr(const struct syscallname *name, abi_long ret,
abi_long arg0, abi_long arg1, abi_long arg2,
abi_long arg3, abi_long arg4, abi_long arg5)
{
print_syscall_err(ret);
if (ret >= 0) {
if (!print_syscall_err(ret)) {
qemu_log(TARGET_ABI_FMT_ld, ret);
qemu_log(" (list = ");
if (arg1 != 0) {
......@@ -866,9 +860,7 @@ print_syscall_ret_ioctl(const struct syscallname *name, abi_long ret,
abi_long arg0, abi_long arg1, abi_long arg2,
abi_long arg3, abi_long arg4, abi_long arg5)
{
print_syscall_err(ret);
if (ret >= 0) {
if (!print_syscall_err(ret)) {
qemu_log(TARGET_ABI_FMT_ld, ret);
const IOCTLEntry *ie;
......@@ -3197,9 +3189,7 @@ print_syscall_ret(int num, abi_long ret,
arg1, arg2, arg3,
arg4, arg5, arg6);
} else {
print_syscall_err(ret);
if (ret >= 0) {
if (!print_syscall_err(ret)) {
qemu_log(TARGET_ABI_FMT_ld, ret);
}
qemu_log("\n");
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册