svn commit: r319754 - head/sys/kern
Gleb Smirnoff
glebius at FreeBSD.org
Fri Jun 9 15:54:49 UTC 2017
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);
More information about the svn-src-all
mailing list