[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 7/7] linux-user: fix print_syscall_err() when syscall returned val
From: |
Laurent Vivier |
Subject: |
[PULL 7/7] linux-user: fix print_syscall_err() when syscall returned value is negative |
Date: |
Tue, 14 Jul 2020 09:32:59 +0200 |
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: c84be71f6854 ("linux-user: Extend strace support to enable argument
printing after syscall execution")
Cc: Filip.Bozuta@syrmia.com
Signed-off-by: Laurent Vivier <laurent@vivier.eu>
Message-Id: <20200708152435.706070-3-laurent@vivier.eu>
---
linux-user/strace.c | 36 +++++++++++++-----------------------
1 file changed, 13 insertions(+), 23 deletions(-)
diff --git a/linux-user/strace.c b/linux-user/strace.c
index 7769f53bd5ed..13981341b327 100644
--- a/linux-user/strace.c
+++ b/linux-user/strace.c
@@ -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");
--
2.26.2
- [PULL 0/7] Linux user for 5.1 patches, Laurent Vivier, 2020/07/14
- [PULL 1/7] linux-user: Use EPROTONOSUPPORT for unimplemented netlink protocols, Laurent Vivier, 2020/07/14
- [PULL 3/7] linux-user: Fix Coverity CID 1430271 / CID 1430272, Laurent Vivier, 2020/07/14
- [PULL 2/7] linux-user: refactor ipc syscall and support of semtimedop syscall, Laurent Vivier, 2020/07/14
- [PULL 5/7] linux-user: add netlink RTM_SETLINK command, Laurent Vivier, 2020/07/14
- [PULL 4/7] linux-user: add new netlink types, Laurent Vivier, 2020/07/14
- [PULL 7/7] linux-user: fix print_syscall_err() when syscall returned value is negative,
Laurent Vivier <=
- [PULL 6/7] linux-user: fix the errno value in print_syscall_err(), Laurent Vivier, 2020/07/14
- Re: [PULL 0/7] Linux user for 5.1 patches, no-reply, 2020/07/14
- Re: [PULL 0/7] Linux user for 5.1 patches, Peter Maydell, 2020/07/14