Module Name: src
Committed By: rmind
Date: Sat Jul 21 17:11:02 UTC 2012
Modified Files:
src/sys/net/npf: npf_inet.c npf_state.c npf_state_tcp.c
src/usr.sbin/npf/npftest: npfstream.c
src/usr.sbin/npf/npftest/libnpftest: npf_test_subr.c
Log Message:
- npf_fetch_tcpopts: fix off-by-one when validating TCP option length
against the maximum allowed.
- npf_tcp_inwindow: be more liberal with npf_fetch_tcpopts().
- Few minor improvements to npftest.
To generate a diff of this commit:
cvs rdiff -u -r1.15 -r1.16 src/sys/net/npf/npf_inet.c
cvs rdiff -u -r1.9 -r1.10 src/sys/net/npf/npf_state.c \
src/sys/net/npf/npf_state_tcp.c
cvs rdiff -u -r1.1 -r1.2 src/usr.sbin/npf/npftest/npfstream.c
cvs rdiff -u -r1.1 -r1.2 src/usr.sbin/npf/npftest/libnpftest/npf_test_subr.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/net/npf/npf_inet.c
diff -u src/sys/net/npf/npf_inet.c:1.15 src/sys/net/npf/npf_inet.c:1.16
--- src/sys/net/npf/npf_inet.c:1.15 Thu Jul 19 21:52:29 2012
+++ src/sys/net/npf/npf_inet.c Sat Jul 21 17:11:01 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: npf_inet.c,v 1.15 2012/07/19 21:52:29 spz Exp $ */
+/* $NetBSD: npf_inet.c,v 1.16 2012/07/21 17:11:01 rmind Exp $ */
/*-
* Copyright (c) 2009-2012 The NetBSD Foundation, Inc.
@@ -39,7 +39,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: npf_inet.c,v 1.15 2012/07/19 21:52:29 spz Exp $");
+__KERNEL_RCSID(0, "$NetBSD: npf_inet.c,v 1.16 2012/07/21 17:11:01 rmind Exp $");
#include <sys/param.h>
#include <sys/types.h>
@@ -277,7 +277,7 @@ next:
if (nbuf_advfetch(&nbuf, &n_ptr, 1, sizeof(val), &val)) {
return false;
}
- if (val < 2 || val >= topts_len) {
+ if (val < 2 || val > topts_len) {
return false;
}
topts_len -= val;
Index: src/sys/net/npf/npf_state.c
diff -u src/sys/net/npf/npf_state.c:1.9 src/sys/net/npf/npf_state.c:1.10
--- src/sys/net/npf/npf_state.c:1.9 Sun Jul 1 23:21:06 2012
+++ src/sys/net/npf/npf_state.c Sat Jul 21 17:11:01 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: npf_state.c,v 1.9 2012/07/01 23:21:06 rmind Exp $ */
+/* $NetBSD: npf_state.c,v 1.10 2012/07/21 17:11:01 rmind Exp $ */
/*-
* Copyright (c) 2010-2012 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: npf_state.c,v 1.9 2012/07/01 23:21:06 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: npf_state.c,v 1.10 2012/07/21 17:11:01 rmind Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -107,6 +107,7 @@ npf_state_init(const npf_cache_t *npc, n
default:
ret = false;
}
+ NPF_TCP_STATE_SAMPLE(nst, ret);
return ret;
}
Index: src/sys/net/npf/npf_state_tcp.c
diff -u src/sys/net/npf/npf_state_tcp.c:1.9 src/sys/net/npf/npf_state_tcp.c:1.10
--- src/sys/net/npf/npf_state_tcp.c:1.9 Sun Jul 15 00:23:00 2012
+++ src/sys/net/npf/npf_state_tcp.c Sat Jul 21 17:11:02 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: npf_state_tcp.c,v 1.9 2012/07/15 00:23:00 rmind Exp $ */
+/* $NetBSD: npf_state_tcp.c,v 1.10 2012/07/21 17:11:02 rmind Exp $ */
/*-
* Copyright (c) 2010-2012 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: npf_state_tcp.c,v 1.9 2012/07/15 00:23:00 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: npf_state_tcp.c,v 1.10 2012/07/21 17:11:02 rmind Exp $");
#include <sys/param.h>
#include <sys/types.h>
@@ -300,7 +300,7 @@ npf_tcp_inwindow(const npf_cache_t *npc,
const struct tcphdr * const th = &npc->npc_l4.tcp;
const int tcpfl = th->th_flags;
npf_tcpstate_t *fstate, *tstate;
- int tcpdlen, wscale, ackskew;
+ int tcpdlen, ackskew;
tcp_seq seq, ack, end;
uint32_t win;
@@ -359,11 +359,9 @@ npf_tcp_inwindow(const npf_cache_t *npc,
* Handle TCP Window Scaling (RFC 1323). Both sides may
* send this option in their SYN packets.
*/
- if (npf_fetch_tcpopts(npc, nbuf, NULL, &wscale)) {
- fstate->nst_wscale = wscale;
- } else {
- fstate->nst_wscale = 0;
- }
+ fstate->nst_wscale = 0;
+ (void)npf_fetch_tcpopts(npc, nbuf, NULL, &fstate->nst_wscale);
+
tstate->nst_wscale = 0;
/* Done. */
@@ -377,12 +375,12 @@ npf_tcp_inwindow(const npf_cache_t *npc,
fstate->nst_end = end;
fstate->nst_maxend = end + 1;
fstate->nst_maxwin = win;
+ fstate->nst_wscale = 0;
/* Handle TCP Window Scaling (must be ignored if no SYN). */
if (tcpfl & TH_SYN) {
- fstate->nst_wscale =
- npf_fetch_tcpopts(npc, nbuf, NULL, &wscale) ?
- wscale : 0;
+ (void)npf_fetch_tcpopts(npc, nbuf, NULL,
+ &fstate->nst_wscale);
}
}
Index: src/usr.sbin/npf/npftest/npfstream.c
diff -u src/usr.sbin/npf/npftest/npfstream.c:1.1 src/usr.sbin/npf/npftest/npfstream.c:1.2
--- src/usr.sbin/npf/npftest/npfstream.c:1.1 Wed May 30 21:38:04 2012
+++ src/usr.sbin/npf/npftest/npfstream.c Sat Jul 21 17:11:02 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: npfstream.c,v 1.1 2012/05/30 21:38:04 rmind Exp $ */
+/* $NetBSD: npfstream.c,v 1.2 2012/07/21 17:11:02 rmind Exp $ */
/*
* NPF stream processor.
@@ -67,7 +67,7 @@ process_tcpip(const void *data, size_t l
forw = (initial_ip.s_addr == ip->ip_src.s_addr);
packetno = forw ? ++snd_packet_no : ++rcv_packet_no;
- int64_t result[9];
+ int64_t result[11];
memset(result, 0, sizeof(result));
len = ntohs(ip->ip_len);
@@ -76,7 +76,7 @@ process_tcpip(const void *data, size_t l
fprintf(fp, "%s%2x %5d %3d %11u %11u %11u %11u %12lx",
forw ? ">" : "<", (th->th_flags & (TH_SYN | TH_ACK | TH_FIN)),
packetno, error, (u_int)seq, (u_int)ntohl(th->th_ack),
- (u_int)(seq + tcpdlen), ntohs(th->th_win), (uintptr_t)result[0]);
+ tcpdlen, ntohs(th->th_win), (uintptr_t)result[0]);
for (unsigned i = 1; i < __arraycount(result); i++) {
fprintf(fp, "%11" PRIu64 " ", result[i]);
@@ -101,9 +101,12 @@ process_stream(const char *input, const
if (fp == NULL) {
err(EXIT_FAILURE, "fopen");
}
- fprintf(fp, "# %5s %3s %11s %11s %11s %11s %11s %11s %11s\n",
+ fprintf(fp, "#FL %5s %3s %11s %11s %11s %11s %11s %11s %11s "
+ "%11s %11s %11s %5s %11s %11s %11s %5s\n",
"No", "Err", "Seq", "Ack", "TCP Len", "Win",
- "Stream", "RetVal", "State");
+ "Stream", "RetVal", "State",
+ "F.END", "F.MAXEND", "F.MAXWIN", "F.WSC",
+ "T.END", "T.MAXEND", "T.MAXWIN", "T.WSC");
while (pcap_next_ex(pcap, &phdr, &data) > 0) {
if (phdr->len != phdr->caplen) {
warnx("process_stream: truncated packet");
Index: src/usr.sbin/npf/npftest/libnpftest/npf_test_subr.c
diff -u src/usr.sbin/npf/npftest/libnpftest/npf_test_subr.c:1.1 src/usr.sbin/npf/npftest/libnpftest/npf_test_subr.c:1.2
--- src/usr.sbin/npf/npftest/libnpftest/npf_test_subr.c:1.1 Wed May 30 21:38:04 2012
+++ src/usr.sbin/npf/npftest/libnpftest/npf_test_subr.c Sat Jul 21 17:11:02 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: npf_test_subr.c,v 1.1 2012/05/30 21:38:04 rmind Exp $ */
+/* $NetBSD: npf_test_subr.c,v 1.2 2012/07/21 17:11:02 rmind Exp $ */
/*
* NPF initialisation and handler routines.
@@ -65,10 +65,12 @@ npf_test_handlepkt(const void *data, siz
result[i++] = fstate->nst_end;
result[i++] = fstate->nst_maxend;
result[i++] = fstate->nst_maxwin;
+ result[i++] = fstate->nst_wscale;
result[i++] = tstate->nst_end;
result[i++] = tstate->nst_maxend;
result[i++] = tstate->nst_maxwin;
+ result[i++] = tstate->nst_wscale;
return 0;
}