Skip to content
This repository was archived by the owner on Jun 9, 2020. It is now read-only.

Commit 506d5bd

Browse files
committed
Fix sendto() to use sockaddr
sendto() did not use the sockaddr parameter, so implemented it.
1 parent 1434bc5 commit 506d5bd

1 file changed

Lines changed: 25 additions & 10 deletions

File tree

src/net/net.c

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -246,21 +246,36 @@ DEFINE_SYSCALL(shutdown, int, socket, int, how)
246246
return syswrap(shutdown(socket, how));
247247
}
248248

249-
DEFINE_SYSCALL(sendto, int, socket, gaddr_t, buf_ptr, int, length, int, flags, gaddr_t, dest_addr, socklen_t, dest_len)
249+
DEFINE_SYSCALL(sendto, int, socket, gaddr_t, buf_ptr, int, length, int, flags, gaddr_t, addr_ptr, socklen_t, addrlen)
250250
{
251-
warnk("sendto: dest_addr is not used! (dest_addr = 0x%llx, dest_len = %d)\n", dest_addr, dest_len);
252-
int r;
251+
int ret;
252+
struct sockaddr *sockaddr = NULL;
253+
struct l_sockaddr l_sockaddr;
254+
255+
if (addr_ptr != 0) {
256+
if (copy_from_user(&l_sockaddr, addr_ptr, addrlen))
257+
return -LINUX_EFAULT;
258+
if (linux_to_darwin_sockaddr(&sockaddr, &l_sockaddr, addrlen) < 0)
259+
return -LINUX_EINVAL;
260+
}
253261
char *buf = malloc(length);
254-
255-
if (copy_from_user(buf, buf_ptr, length)) {
256-
r = -LINUX_EFAULT;
262+
if (buf == NULL) {
263+
ret = -LINUX_ENOMEM;
264+
goto err;
265+
}
266+
ret = copy_from_user(buf, buf_ptr, length);
267+
if (ret < 0) {
268+
ret = -LINUX_EFAULT;
257269
goto out;
258270
}
259-
r = syswrap(sendto(socket, buf, length, flags, NULL, 0));
260-
261-
out:
271+
ret = syswrap(sendto(socket, buf, length, flags, sockaddr, addrlen));
272+
273+
out:
262274
free(buf);
263-
return r;
275+
err:
276+
if (sockaddr)
277+
free(sockaddr);
278+
return ret;
264279
}
265280

266281
int

0 commit comments

Comments
 (0)