Author: glebius
Date: Fri Jun  9 15:54:48 2017
New Revision: 319754
URL: https://svnweb.freebsd.org/changeset/base/319754

Log:
  Fix stat(2) on a listening socket.

Modified:
  head/sys/kern/sys_socket.c

Modified: head/sys/kern/sys_socket.c
==============================================================================
--- head/sys/kern/sys_socket.c  Fri Jun  9 15:47:14 2017        (r319753)
+++ head/sys/kern/sys_socket.c  Fri Jun  9 15:54:48 2017        (r319754)
@@ -285,7 +285,6 @@ soo_stat(struct file *fp, struct stat *ub, struct ucre
     struct thread *td)
 {
        struct socket *so = fp->f_data;
-       struct sockbuf *sb;
 #ifdef MAC
        int error;
 #endif
@@ -297,22 +296,26 @@ soo_stat(struct file *fp, struct stat *ub, struct ucre
        if (error)
                return (error);
 #endif
-       /*
-        * If SBS_CANTRCVMORE is set, but there's still data left in the
-        * receive buffer, the socket is still readable.
-        */
-       sb = &so->so_rcv;
-       SOCKBUF_LOCK(sb);
-       if ((sb->sb_state & SBS_CANTRCVMORE) == 0 || sbavail(sb))
-               ub->st_mode |= S_IRUSR | S_IRGRP | S_IROTH;
-       ub->st_size = sbavail(sb) - sb->sb_ctl;
-       SOCKBUF_UNLOCK(sb);
+       if (!SOLISTENING(so)) {
+               struct sockbuf *sb;
 
-       sb = &so->so_snd;
-       SOCKBUF_LOCK(sb);
-       if ((sb->sb_state & SBS_CANTSENDMORE) == 0)
-               ub->st_mode |= S_IWUSR | S_IWGRP | S_IWOTH;
-       SOCKBUF_UNLOCK(sb);
+               /*
+                * If SBS_CANTRCVMORE is set, but there's still data left
+                * in the receive buffer, the socket is still readable.
+                */
+               sb = &so->so_rcv;
+               SOCKBUF_LOCK(sb);
+               if ((sb->sb_state & SBS_CANTRCVMORE) == 0 || sbavail(sb))
+                       ub->st_mode |= S_IRUSR | S_IRGRP | S_IROTH;
+               ub->st_size = sbavail(sb) - sb->sb_ctl;
+               SOCKBUF_UNLOCK(sb);
+       
+               sb = &so->so_snd;
+               SOCKBUF_LOCK(sb);
+               if ((sb->sb_state & SBS_CANTSENDMORE) == 0)
+                       ub->st_mode |= S_IWUSR | S_IWGRP | S_IWOTH;
+               SOCKBUF_UNLOCK(sb);
+       }
        ub->st_uid = so->so_cred->cr_uid;
        ub->st_gid = so->so_cred->cr_gid;
        return (*so->so_proto->pr_usrreqs->pru_sense)(so, ub);
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"

Reply via email to