From owner-freebsd-current Wed Dec 24 23:08:20 1997 Return-Path: Received: (from root@localhost) by hub.freebsd.org (8.8.7/8.8.7) id XAA26622 for current-outgoing; Wed, 24 Dec 1997 23:08:20 -0800 (PST) (envelope-from owner-freebsd-current) Received: from implode.root.com (implode.root.com [198.145.90.17]) by hub.freebsd.org (8.8.7/8.8.7) with ESMTP id XAA26615 for ; Wed, 24 Dec 1997 23:08:15 -0800 (PST) (envelope-from root@implode.root.com) Received: from implode.root.com (localhost [127.0.0.1]) by implode.root.com (8.8.5/8.8.5) with ESMTP id XAA16844; Wed, 24 Dec 1997 23:09:26 -0800 (PST) Message-Id: <199712250709.XAA16844@implode.root.com> To: Gary Palmer cc: current@FreeBSD.ORG Subject: Re: crash (in networking code?) In-reply-to: Your message of "Fri, 19 Dec 1997 20:02:16 EST." <349B1918.794BDF32@erols.com> From: David Greenman Reply-To: dg@root.com Date: Wed, 24 Dec 1997 23:09:25 -0800 Sender: owner-freebsd-current@FreeBSD.ORG X-Loop: FreeBSD.org Precedence: bulk >We have a weird proxying system here running 100% custom code. ...... >Anyone have any ideas what is going on? I know its pretty vague The problem might be fixed with the attached diff. I have also committed this in rev 1.37 of in_pcb.c. -DG David Greenman Core-team/Principal Architect, The FreeBSD Project Index: in_pcb.c =================================================================== RCS file: /home/ncvs/src/sys/netinet/in_pcb.c,v retrieving revision 1.36 diff -c -r1.36 in_pcb.c *** in_pcb.c 1997/12/23 01:40:40 1.36 --- in_pcb.c 1997/12/25 06:49:31 *************** *** 470,489 **** register struct inpcb *inp; register struct sockaddr_in *sin; s = splnet(); inp = sotoinpcb(so); if (!inp) { splx(s); return EINVAL; } - MALLOC(sin, struct sockaddr_in *, sizeof *sin, M_SONAME, M_WAITOK); - *nam = (struct sockaddr *)sin; - bzero(sin, sizeof *sin); - sin->sin_family = AF_INET; - sin->sin_len = sizeof(*sin); sin->sin_port = inp->inp_lport; sin->sin_addr = inp->inp_laddr; splx(s); return 0; } --- 482,504 ---- register struct inpcb *inp; register struct sockaddr_in *sin; + MALLOC(sin, struct sockaddr_in *, sizeof *sin, M_SONAME, M_WAITOK); + bzero(sin, sizeof *sin); + sin->sin_family = AF_INET; + sin->sin_len = sizeof(*sin); + s = splnet(); inp = sotoinpcb(so); if (!inp) { splx(s); + free(sin, M_SONAME); return EINVAL; } sin->sin_port = inp->inp_lport; sin->sin_addr = inp->inp_laddr; splx(s); + + *nam = (struct sockaddr *)sin; return 0; } *************** *** 496,515 **** struct inpcb *inp; register struct sockaddr_in *sin; s = splnet(); inp = sotoinpcb(so); if (!inp) { splx(s); return EINVAL; } - MALLOC(sin, struct sockaddr_in *, sizeof *sin, M_SONAME, M_WAITOK); - *nam = (struct sockaddr *)sin; - bzero((caddr_t)sin, sizeof (*sin)); - sin->sin_family = AF_INET; - sin->sin_len = sizeof(*sin); sin->sin_port = inp->inp_fport; sin->sin_addr = inp->inp_faddr; splx(s); return 0; } --- 511,533 ---- struct inpcb *inp; register struct sockaddr_in *sin; + MALLOC(sin, struct sockaddr_in *, sizeof *sin, M_SONAME, M_WAITOK); + bzero((caddr_t)sin, sizeof (*sin)); + sin->sin_family = AF_INET; + sin->sin_len = sizeof(*sin); + s = splnet(); inp = sotoinpcb(so); if (!inp) { splx(s); + free(sin, M_SONAME); return EINVAL; } sin->sin_port = inp->inp_fport; sin->sin_addr = inp->inp_faddr; splx(s); + + *nam = (struct sockaddr *)sin; return 0; }