Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 17 Apr 2001 10:58:24 +0100
From:      Brian Somers <brian@Awfulhak.org>
To:        Dima Dorfman <dima@unixfreak.org>
Cc:        Brian Somers <brian@Awfulhak.org>, hackers@FreeBSD.ORG, brian@Awfulhak.org
Subject:   Re: Patch to make snp(4) devfs-friendly 
Message-ID:  <200104170958.f3H9wOr62584@hak.lan.Awfulhak.org>
In-Reply-To: Message from Dima Dorfman <dima@unixfreak.org>  of "Tue, 17 Apr 2001 02:22:23 PDT." <20010417092223.9AC973E09@bazooka.unixfreak.org> 

next in thread | previous in thread | raw e-mail | index | archive | help
This looks good.  I'd say you should commit the change yourself - 
feel free to say it's reviewed by me.

As an aside, when I did this to if_tun, I chose to do all the 
destroy_dev()s at module unload time (I guess the snp device could do 
with a MODULE_DECLARE).  This allows the administrator to relax the 
driver-chosen permissions on tun devices with something like

  kldload if_tun
  >/dev/tun0
  chmod blah /dev/tun0

The destroy_dev() added to snpclose() prevents this.

Having said all that, it's unlikely that anyone would want to relax 
the permissions a snoop device that wasn't already opened, so the 
destroy_dev() looks ok here in practice.

> Brian Somers <brian@Awfulhak.org> writes:
> > I haven't actually tested the code, but looking at the patch, I think 
> > there's a problem with it...
> > 
> > Specifically, on a non-devfs system - where the device nodes are 
> > created with mknod(1), snp_clone() isn't going to be called before 
> > snpopen().
> > 
> > I've (ab)used drv2 as a flag to say whether make_dev() has been 
> > called in net/if_tun.c, but I'm not sure if this is the right answer 
> > either :*]
> 
> I think the correct approach is to check for !(si_flags & SI_NAMED) as
> done in rev. 1.68 of sys/net/bpf.c (that rev. has a precedence bug,
> which has since been fixed).  That was written by phk, who I take to
> be pretty authoritative on the subject; looking at the places SI_NAMED
> is used also supports this conclusion.
> 
> A corrected patch is attached (although I didn't test it in the
> non-devfs case).
> 
> Thanks!
> 
> 					Dima Dorfman
> 					dima@unixfreak.org
> 
> 
> Index: tty_snoop.c
> ===================================================================
> RCS file: /st/src/FreeBSD/src/sys/kern/tty_snoop.c,v
> retrieving revision 1.52
> diff -u -r1.52 tty_snoop.c
> --- tty_snoop.c	2001/03/26 12:41:01	1.52
> +++ tty_snoop.c	2001/04/17 09:16:52
> @@ -287,10 +287,10 @@
>  		return (error);
>  
>  	if (dev->si_drv1 == NULL) {
> -		int mynor = minor(dev);
> -
> +		if (!(dev->si_flags & SI_NAMED))
> +			make_dev(&snp_cdevsw, minor(dev), UID_ROOT, GID_WHEEL,
> +			    0600, "snp%d", dev2unit(dev));
>  		dev->si_drv1 = snp = malloc(sizeof(*snp), M_SNP, M_WAITOK|M_ZERO);
> -		make_dev(&snp_cdevsw, mynor, 0, 0, 0600, "snp%d", mynor);
>  	} else
>  		return (EBUSY);
>  
> @@ -365,6 +365,7 @@
>  	free(snp->snp_buf, M_SNP);
>  	snp->snp_flags &= ~SNOOP_OPEN;
>  	dev->si_drv1 = NULL;
> +	destroy_dev(dev);
>  
>  	return (snp_detach(snp));
>  }
> @@ -505,10 +506,25 @@
>  static void snp_drvinit __P((void *unused));
>  
>  static void
> +snp_clone(void *arg, char *name, int namelen, dev_t *dev)
> +{
> +	int u;
> +
> +	if (*dev != NODEV)
> +		return;
> +	if (dev_stdclone(name, NULL, "snp", &u) != 1)
> +		return;
> +	*dev = make_dev(&snp_cdevsw, unit2minor(u), UID_ROOT, GID_WHEEL, 0600,
> +	    "snp%d", u);
> +	return;
> +}
> +
> +static void
>  snp_drvinit(unused)
>  	void *unused;
>  {
>  
> +	EVENTHANDLER_REGISTER(dev_clone, snp_clone, 0, 1000);
>  	cdevsw_add(&snp_cdevsw);
>  }
>  

-- 
Brian <brian@Awfulhak.org>                        <brian@[uk.]FreeBSD.org>
      <http://www.Awfulhak.org>;                   <brian@[uk.]OpenBSD.org>
Don't _EVER_ lose your sense of humour !



To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200104170958.f3H9wOr62584>