Date: Sun, 20 Jan 2002 15:08:56 -0800 (PST) From: Archie Cobbs <archie@dellroad.org> To: Florent Parent <Florent.Parent@viagenie.qc.ca> Cc: freebsd-net@FreeBSD.ORG, julian@elischer.org Subject: Re: netgraph: how to setsockopt on ksocket node ? Message-ID: <200201202308.g0KN8uc09321@arch20m.dellroad.org> In-Reply-To: <135740000.1011562445@blues.viagenie.qc.ca> "from Florent Parent at Jan 20, 2002 04:34:05 pm"
next in thread | previous in thread | raw e-mail | index | archive | help
Florent Parent writes: > 'struct proc' member in the struct sockopt can be NULL. As per the comment > in that structure, NULL means that the calling entity is the kernel, not a > user process (my interpretation): > > struct sockopt { > enum sopt_dir sopt_dir; /* is this a get or a set? */ > int sopt_level; /* second arg of [gs]etsockopt */ > int sopt_name; /* third arg of [gs]etsockopt */ > void *sopt_val; /* fourth arg of [gs]etsockopt */ > size_t sopt_valsize; /* (almost) fifth arg of [gs]etsockopt */ > struct proc *sopt_p; /* calling process or null if kernel */ > }; > > This doesn't apply to socreate() since it isn't passed a 'struct sockopt' > as argument. From a quick glance, the socket functions that are concerned > are sosetopt() and sogetopt(). But socreate() does take a struct proc directly... perhaps it can be NULL too..? [ looks at code ... ] Nope, it doesn't appear that it can... > int > socreate(dom, aso, type, proto, p) > int dom; > struct socket **aso; > register int type; > int proto; > struct proc *p; > { > register struct protosw *prp; > register struct socket *so; > register int error; > > if (proto) > prp = pffindproto(dom, proto, type); > else > prp = pffindtype(dom, type); > > if (prp == 0 || prp->pr_usrreqs->pru_attach == 0) > return (EPROTONOSUPPORT); > > if (p->p_prison && jail_socket_unixiproute_only && > prp->pr_domain->dom_family != PF_LOCAL && > prp->pr_domain->dom_family != PF_INET && > prp->pr_domain->dom_family != PF_ROUTE) { > return (EPROTONOSUPPORT); > } > > if (prp->pr_type != type) > return (EPROTOTYPE); > so = soalloc(p != 0); > if (so == 0) > return (ENOBUFS); > > TAILQ_INIT(&so->so_incomp); > TAILQ_INIT(&so->so_comp); > so->so_type = type; > so->so_cred = p->p_ucred; > crhold(so->so_cred); > so->so_proto = prp; > error = (*prp->pr_usrreqs->pru_attach)(so, proto, p); > if (error) { > so->so_state |= SS_NOFDREF; > sofree(so); > return (error); > } > *aso = so; > return (0); > } But it's interesting the soalloc() is called with 'p != 0' as an argument. p is never 0 or else you would have already panic'd... you'd panic later on, too, referencing 'p->p_ucred'. -Archie __________________________________________________________________________ Archie Cobbs * Packet Design * http://www.packetdesign.com To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-net" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200201202308.g0KN8uc09321>