Return to BSD News archive
Xref: sserve comp.os.386bsd.bugs:570 comp.bugs.4bsd:1946
Newsgroups: comp.os.386bsd.bugs,comp.bugs.4bsd
Path: sserve!newshost.anu.edu.au!munnari.oz.au!news.Hawaii.Edu!ames!saimiri.primate.wisc.edu!zaphod.mps.ohio-state.edu!cs.utexas.edu!uunet!emba-news.uvm.edu!sadye.emba.uvm.edu!wollman
From: wollman@sadye.emba.uvm.edu (Garrett Wollman)
Subject: socreate() will call protocol's usrreq even if it is NULL
Message-ID: <1993Apr26.165813.172@uvm.edu>
Sender: news@uvm.edu
Organization: University of Vermont, EMBA Computer Facility
Date: Mon, 26 Apr 1993 16:58:13 GMT
Lines: 48
I found this while debugging IP multicast routing... If a protocol
has a no pr_usrreq entry point specified, such as the EON does (and my
encapsulation protocol used to), a call such as:
s = socket(PF_INET, SOCK_RAW, IPPROTO_ENCAP);
will result in socreate() calling through the null usrreq pointer,
thus crashing the system. Here is a patch which causes socreate to
return EINVAL instead. (EPROTONOSUPPORT might be a better choice, but
EINVAL was what came immediately to my head.)
*** uipc_socket.c~ Wed Mar 17 19:02:33 1993
--- uipc_socket.c Mon Apr 26 12:49:39 1993
***************
*** 80,88 ****
if (p->p_ucred->cr_uid == 0)
so->so_state = SS_PRIV;
so->so_proto = prp;
! error =
! (*prp->pr_usrreq)(so, PRU_ATTACH,
! (struct mbuf *)0, (struct mbuf *)proto, (struct mbuf *)0);
if (error) {
so->so_state |= SS_NOFDREF;
sofree(so);
--- 80,94 ----
if (p->p_ucred->cr_uid == 0)
so->so_state = SS_PRIV;
so->so_proto = prp;
!
! if(prp->pr_usrreq) {
! error =
! (*prp->pr_usrreq)(so, PRU_ATTACH, (struct mbuf *)0,
! (struct mbuf *)proto, (struct mbuf *)0);
! } else {
! error = EINVAL;
! }
!
if (error) {
so->so_state |= SS_NOFDREF;
sofree(so);
-GAWollman
--
Garrett A. Wollman | Shashish is simple, it's discreet, it's brief. ...
wollman@emba.uvm.edu | Shashish is the bonding of hearts in spite of distance.
uvm-gen!wollman | It is a bond more powerful than absence. We like people
UVM disagrees. | who like Shashish. - Claude McKenzie + Florent Vollant