qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] linux-user: fix readlinkat handling with magic exe symlink


From: Laurent Vivier
Subject: Re: [PATCH] linux-user: fix readlinkat handling with magic exe symlink
Date: Fri, 23 Sep 2022 23:41:38 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.2.1

Le 08/08/2022 à 21:07, Jameson Nash a écrit :
Exactly the same as f17f4989fa193fa8279474c5462289a3cfe69aea before was
for readlink. I suppose this was simply missed at the time.

Signed-off-by: Jameson Nash <vtjnash@gmail.com>
---
  linux-user/syscall.c | 15 +++++++++++++--
  1 file changed, 13 insertions(+), 2 deletions(-)

diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index ef53feb5ab..6ef4e42b21 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -9894,11 +9894,22 @@ static abi_long do_syscall1(CPUArchState *cpu_env, int 
num, abi_long arg1,
              p2 = lock_user(VERIFY_WRITE, arg3, arg4, 0);
              if (!p || !p2) {
                  ret = -TARGET_EFAULT;
+            } else if (!arg4) {
+                /* Short circuit this for the magic exe check. */
+                ret = -TARGET_EINVAL;
              } else if (is_proc_myself((const char *)p, "exe")) {
                  char real[PATH_MAX], *temp;
                  temp = realpath(exec_path, real);
-                ret = temp == NULL ? get_errno(-1) : strlen(real) ;
-                snprintf((char *)p2, arg4, "%s", real);
+                /* Return value is # of bytes that we wrote to the buffer. */
+                if (temp == NULL) {
+                    ret = get_errno(-1);
+                } else {
+                    /* Don't worry about sign mismatch as earlier mapping
+                     * logic would have thrown a bad address error. */
+                    ret = MIN(strlen(real), arg4);
+                    /* We cannot NUL terminate the string. */
+                    memcpy(p2, real, ret);
+                }
              } else {
                  ret = get_errno(readlinkat(arg1, path(p), p2, arg4));
              }

Reviewed-by: Laurent Vivier <laurent@vivier.eu>



reply via email to

[Prev in Thread] Current Thread [Next in Thread]