@@ -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
266281int
0 commit comments