]> git.ipfire.org Git - thirdparty/qemu.git/commitdiff
linux-user: Check for EFAULT failure in nanosleep
authorPeter Maydell <peter.maydell@linaro.org>
Thu, 10 Jul 2025 16:43:54 +0000 (17:43 +0100)
committerRichard Henderson <richard.henderson@linaro.org>
Thu, 10 Jul 2025 17:55:34 +0000 (11:55 -0600)
target_to_host_timespec() returns an error if the memory the guest
passed us isn't actually readable.  We check for this everywhere
except the callsite in the TARGET_NR_nanosleep case, so this mistake
was caught by a Coverity heuristic.

Add the missing error checks to the calls that convert between the
host and target timespec structs.

Coverity: CID 1507104
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Message-ID: <20250710164355.1296648-1-peter.maydell@linaro.org>

linux-user/syscall.c

index e1b1476936ceb9e20d82c8fde296d3acfef73906..38dd5631666b9be1d9f48f402034be7b9045a3b2 100644 (file)
@@ -11643,10 +11643,14 @@ static abi_long do_syscall1(CPUArchState *cpu_env, int num, abi_long arg1,
     case TARGET_NR_nanosleep:
         {
             struct timespec req, rem;
-            target_to_host_timespec(&req, arg1);
+            if (target_to_host_timespec(&req, arg1)) {
+                return -TARGET_EFAULT;
+            }
             ret = get_errno(safe_nanosleep(&req, &rem));
             if (is_error(ret) && arg2) {
-                host_to_target_timespec(arg2, &rem);
+                if (host_to_target_timespec(arg2, &rem)) {
+                    return -TARGET_EFAULT;
+                }
             }
         }
         return ret;