Subject: Re: kern/34648: Kernel panic when using NFS root and configuring an interface that needs firmware
To: None <gnats-bugs@NetBSD.org>
From: Jason Thorpe <thorpej@shagadelic.org>
List: netbsd-bugs
Date: 09/30/2006 16:53:05
On Sep 30, 2006, at 3:30 AM, Elad Efrat wrote:

>  I attached the patch I sent to Nino for testing.

firmload needs to use the equivalent of super-user creds.

If NOCRED and FSCRED are no longer valid to be used in the kernel,  
then please create an appropriate kauth_cred_*() routine to replace  
their functionality.

>
>  -e.
>
>  --
>  Elad Efrat
>
>  --Boundary_(ID_f7yPnOkye6SCbWj9Ar2dYQ)
>  Content-type: text/plain; name=firmload.c.diff
>  Content-transfer-encoding: 7BIT
>  Content-disposition: inline; filename=firmload.c.diff
>
>  Index: firmload.c
>  ===================================================================
>  RCS file: /cvsroot/src/sys/dev/firmload.c,v
>  retrieving revision 1.3
>  diff -u -p -r1.3 firmload.c
>  --- firmload.c	14 May 2006 21:42:26 -0000	1.3
>  +++ firmload.c	29 Sep 2006 21:10:24 -0000
>  @@ -258,17 +258,17 @@ firmware_open(const char *drvname, const
>
>   	vp = nd.ni_vp;
>
>  -	error = VOP_GETATTR(vp, &va, FSCRED, curlwp);
>  +	error = VOP_GETATTR(vp, &va, kauth_cred_get(), curlwp);
>   	if (error) {
>   		VOP_UNLOCK(vp, 0);
>  -		(void)vn_close(vp, FREAD, FSCRED, curlwp);
>  +		(void)vn_close(vp, FREAD, kauth_cred_get(), curlwp);
>   		firmware_handle_free(fh);
>   		return (error);
>   	}
>
>   	if (va.va_type != VREG) {
>   		VOP_UNLOCK(vp, 0);
>  -		(void)vn_close(vp, FREAD, FSCRED, curlwp);
>  +		(void)vn_close(vp, FREAD, kauth_cred_get(), curlwp);
>   		firmware_handle_free(fh);
>   		return (EINVAL);
>   	}
>  @@ -294,7 +294,7 @@ firmware_close(firmware_handle_t fh)
>   {
>   	int error;
>
>  -	error = vn_close(fh->fh_vp, FREAD, FSCRED, curlwp);
>  +	error = vn_close(fh->fh_vp, FREAD, kauth_cred_get(), curlwp);
>   	firmware_handle_free(fh);
>   	return (error);
>   }
>  @@ -322,7 +322,7 @@ firmware_read(firmware_handle_t fh, off_
>   {
>
>   	return (vn_rdwr(UIO_READ, fh->fh_vp, buf, len, offset,
>  -			UIO_SYSSPACE, 0, FSCRED, NULL, curlwp));
>  +			UIO_SYSSPACE, 0, kauth_cred_get(), NULL, curlwp));
>   }
>
>   /*
>
>  --Boundary_(ID_f7yPnOkye6SCbWj9Ar2dYQ)--
>

-- thorpej