Subject: Syn cache corrupts kernel data!!
To: None <current-users@NetBSD.ORG, thorpej@NetBSD.ORG>
From: Juergen Hannken-Illjes <hannken@serv1.eis.cs.tu-bs.de>
List: current-users
Date: 07/27/1997 19:00:22
I found a severe bug due to the new `syn_cache' functionality in netinet/tcp_input.c
The problem:
A mbuf comes into `tcp_input' and goes through line 601 where TCP, IP headers and TCP
options are dropped from the mbuf.
At line 815 a `goto findpcb' occurs and the (now stripped down) mbuf comes to line 465
and enters `syn_cache_add()'.
This function treats the mbuf as a complete tcpip header and therefore modifies data
AFTER the mbuf.
In the best case I get `Data modified on freelist' messages, but most time the system
panics.
I don't know how to fix this problem in a clean way. The following patch makes things
better by saving the mbuf's data and length before `findpcb:' and restoring them just
after the label.
--- tcp_input.c- Fri Jul 25 18:45:26 1997
+++ tcp_input.c Sun Jul 27 18:41:32 1997
@@ -291,4 +291,6 @@
struct tcp_opt_info opti;
int iphlen;
+/*YYY*/ caddr_t initial_data;
+/*YYY*/ int initial_len;
va_list ap;
@@ -383,5 +385,9 @@
* Locate pcb for segment.
*/
+/*YYY*/ initial_data = m->m_data;
+/*YYY*/ initial_len = m->m_len;
findpcb:
+/*YYY*/ m->m_data = initial_data;
+/*YYY*/ m->m_len = initial_len;
inp = in_pcblookup_connect(&tcbtable, ti->ti_src, ti->ti_sport,
ti->ti_dst, ti->ti_dport);
--
Juergen Hannken-Illjes - hannken@eis.cs.tu-bs.de - TU Braunschweig (Germany)