Author: dchagin
Date: Mon Jun  1 20:44:58 2009
New Revision: 193263
URL: http://svn.freebsd.org/changeset/base/193263

Log:
  Implement a variation of the accept_common() which takes
  a flags argument.
  
  Do not preserve td_retval before kern_fcntl(F_SETFL) as it does not
  changed.
  
  Approved by:  kib (mentor)
  MFC after:    1 month

Modified:
  head/sys/compat/linux/linux_socket.c

Modified: head/sys/compat/linux/linux_socket.c
==============================================================================
--- head/sys/compat/linux/linux_socket.c        Mon Jun  1 20:42:27 2009        
(r193262)
+++ head/sys/compat/linux/linux_socket.c        Mon Jun  1 20:44:58 2009        
(r193263)
@@ -772,7 +772,10 @@ linux_accept_common(struct thread *td, i
                struct sockaddr * __restrict name;
                socklen_t * __restrict anamelen;
        } */ bsd_args;
-       int error, fd;
+       int error;
+
+       if (flags & ~(LINUX_SOCK_CLOEXEC | LINUX_SOCK_NONBLOCK))
+               return (EINVAL);
 
        bsd_args.s = s;
        /* XXX: */
@@ -785,23 +788,27 @@ linux_accept_common(struct thread *td, i
                        return (EINVAL);
                return (error);
        }
-       if (addr) {
-               error = linux_sa_put(PTRIN(addr));
-               if (error) {
-                       (void)kern_close(td, td->td_retval[0]);
-                       return (error);
-               }
-       }
 
        /*
         * linux appears not to copy flags from the parent socket to the
-        * accepted one, so we must clear the flags in the new descriptor.
-        * Ignore any errors, because we already have an open fd.
+        * accepted one, so we must clear the flags in the new descriptor
+        * and apply the requested flags.
         */
-       fd = td->td_retval[0];
-       (void)kern_fcntl(td, fd, F_SETFL, 0);
-       td->td_retval[0] = fd;
-       return (0);
+       error = kern_fcntl(td, td->td_retval[0], F_SETFL, 0);
+       if (error)
+               goto out;
+       error = linux_set_socket_flags(td, td->td_retval[0], flags);
+       if (error)
+               goto out;
+       if (addr)
+               error = linux_sa_put(PTRIN(addr));
+
+out:
+       if (error) {
+               (void)kern_close(td, td->td_retval[0]);
+               td->td_retval[0] = 0;
+       }
+       return (error);
 }
 
 struct linux_accept_args {
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to