summaryrefslogtreecommitdiffstats
path: root/sys/kern/uipc_socket2.c
diff options
context:
space:
mode:
authorkurt <kurt@openbsd.org>2007-02-26 23:53:33 +0000
committerkurt <kurt@openbsd.org>2007-02-26 23:53:33 +0000
commite3cfaa0013d9a15cff03f418012bd6632611f1fd (patch)
tree753172fadefbfdd000d7e9a2ac724d6ecf931d60 /sys/kern/uipc_socket2.c
parentError out if the -t or -T options are specified without -a or -d. (diff)
downloadwireguard-openbsd-e3cfaa0013d9a15cff03f418012bd6632611f1fd.tar.xz
wireguard-openbsd-e3cfaa0013d9a15cff03f418012bd6632611f1fd.zip
exclude control data from the number of bytes returned by FIONREAD ioctl()
by adding a sb_datacc count to sockbuf that counts data excluding MT_CONTROL and MT_SONAME mbuf types. w/help from deraadt@. okay deraadt@ claudio@
Diffstat (limited to 'sys/kern/uipc_socket2.c')
-rw-r--r--sys/kern/uipc_socket2.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/sys/kern/uipc_socket2.c b/sys/kern/uipc_socket2.c
index b72b5ca7d43..8fc53f4bf18 100644
--- a/sys/kern/uipc_socket2.c
+++ b/sys/kern/uipc_socket2.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: uipc_socket2.c,v 1.41 2006/01/05 05:05:07 jsg Exp $ */
+/* $OpenBSD: uipc_socket2.c,v 1.42 2007/02/26 23:53:33 kurt Exp $ */
/* $NetBSD: uipc_socket2.c,v 1.11 1996/02/04 02:17:55 christos Exp $ */
/*
@@ -780,6 +780,8 @@ sbcompress(struct sockbuf *sb, struct mbuf *m, struct mbuf *n)
(unsigned)m->m_len);
n->m_len += m->m_len;
sb->sb_cc += m->m_len;
+ if (m->m_type != MT_CONTROL && m->m_type != MT_SONAME)
+ sb->sb_datacc += m->m_len;
m = m_free(m);
continue;
}
@@ -817,6 +819,7 @@ sbflush(struct sockbuf *sb)
sbdrop(sb, (int)sb->sb_cc);
KASSERT(sb->sb_cc == 0);
+ KASSERT(sb->sb_datacc == 0);
KASSERT(sb->sb_mb == NULL);
KASSERT(sb->sb_mbtail == NULL);
KASSERT(sb->sb_lastrecord == NULL);
@@ -844,6 +847,8 @@ sbdrop(struct sockbuf *sb, int len)
m->m_len -= len;
m->m_data += len;
sb->sb_cc -= len;
+ if (m->m_type != MT_CONTROL && m->m_type != MT_SONAME)
+ sb->sb_datacc -= len;
break;
}
len -= m->m_len;