Browse Source

🐞 fix(components/lwp/lwp_syscall.c): fix sys_readlink

xqyjlj 2 years ago
parent
commit
63c7d0ceb4
1 changed files with 17 additions and 4 deletions
  1. 17 4
      components/lwp/lwp_syscall.c

+ 17 - 4
components/lwp/lwp_syscall.c

@@ -4157,7 +4157,7 @@ sysret_t sys_getrandom(void *buf, size_t buflen, unsigned int flags)
 ssize_t sys_readlink(char* path, char *buf, size_t bufsz)
 ssize_t sys_readlink(char* path, char *buf, size_t bufsz)
 {
 {
     size_t len, copy_len;
     size_t len, copy_len;
-    int err;
+    int err, rtn;
     int fd = -1;
     int fd = -1;
     struct dfs_fd *d;
     struct dfs_fd *d;
     char *copy_path;
     char *copy_path;
@@ -4184,12 +4184,25 @@ ssize_t sys_readlink(char* path, char *buf, size_t bufsz)
 
 
     /* musl __procfdname */
     /* musl __procfdname */
     err = sscanf(copy_path, "/proc/self/fd/%d", &fd);
     err = sscanf(copy_path, "/proc/self/fd/%d", &fd);
-    rt_free(copy_path);
 
 
     if (err != 1)
     if (err != 1)
     {
     {
-        LOG_E("readlink: path not is /proc/self/fd/* , call by musl __procfdname()?");
-        return -EINVAL;
+        rtn = 0;
+        if (access(copy_path, 0))
+        {
+            rtn = -ENOENT;
+            LOG_E("readlink: path not is /proc/self/fd/* and path not exits, call by musl __procfdname()?");
+        }
+        else
+        {
+            rtn = lwp_put_to_user(buf, copy_path, copy_len);
+        }
+        rt_free(copy_path);
+        return rtn;
+    }
+    else
+    {
+        rt_free(copy_path);
     }
     }
 
 
     d = fd_get(fd);
     d = fd_get(fd);