ソースを参照

!99 Fix accept system call issue.
Merge pull request !99 from bernard/bernard_rt-smart

bernard 5 年 前
コミット
1f73584605
1 ファイル変更22 行追加16 行削除
  1. 22 16
      components/lwp/lwp_syscall.c

+ 22 - 16
components/lwp/lwp_syscall.c

@@ -1190,32 +1190,38 @@ int sys_accept(int socket, struct musl_sockaddr *addr, socklen_t *addrlen)
     socklen_t uaddrlen;
     socklen_t kaddrlen;
 
-    if (!lwp_user_accessable(addrlen, sizeof (socklen_t *)))
+    if (addr)
     {
-        return -1;
-    }
-    lwp_get_from_user(&uaddrlen, addrlen, sizeof (socklen_t *));
-    if (!uaddrlen)
-    {
-        return -1;
-    }
+        if (!lwp_user_accessable(addrlen, sizeof (socklen_t *)))
+        {
+            return -1;
+        }
+        lwp_get_from_user(&uaddrlen, addrlen, sizeof (socklen_t *));
+        if (!uaddrlen)
+        {
+            return -1;
+        }
 
-    if (!lwp_user_accessable(addr, uaddrlen))
-    {
-        return -1;
+        if (!lwp_user_accessable(addr, uaddrlen))
+        {
+            return -1;
+        }
     }
 
     kaddrlen = sizeof(struct sockaddr);
     ret = accept(socket, &ksa, &kaddrlen);
     if (ret >= 0)
     {
-        sockaddr_tomusl(&ksa, &kmusladdr);
-        if (uaddrlen > sizeof(struct musl_sockaddr))
+        if (addr)
         {
-            uaddrlen = sizeof(struct musl_sockaddr);
+            sockaddr_tomusl(&ksa, &kmusladdr);
+            if (uaddrlen > sizeof(struct musl_sockaddr))
+            {
+                uaddrlen = sizeof(struct musl_sockaddr);
+            }
+            lwp_put_to_user(addr, &kmusladdr, uaddrlen);
+            lwp_put_to_user(addrlen, &uaddrlen, sizeof (socklen_t *));
         }
-        lwp_put_to_user(addr, &kmusladdr, uaddrlen);
-        lwp_put_to_user(addrlen, &uaddrlen, sizeof (socklen_t *));
     }
     return ret;
 }