Module Name:    src
Committed By:   christos
Date:           Sat Apr 11 23:05:26 UTC 2009

Modified Files:
        src/sys/dev/dmover: dmover_io.c
        src/sys/dev/putter: putter.c
        src/sys/kern: kern_drvctl.c sys_mqueue.c sys_pipe.c vfs_vnops.c
        src/sys/net: bpf.c if_tap.c
        src/sys/opencrypto: cryptodev.c

Log Message:
Fix locking as Andy explained. Also fill in uid and gid like sys_pipe did.


To generate a diff of this commit:
cvs rdiff -u -r1.33 -r1.34 src/sys/dev/dmover/dmover_io.c
cvs rdiff -u -r1.22 -r1.23 src/sys/dev/putter/putter.c
cvs rdiff -u -r1.25 -r1.26 src/sys/kern/kern_drvctl.c
cvs rdiff -u -r1.15 -r1.16 src/sys/kern/sys_mqueue.c
cvs rdiff -u -r1.111 -r1.112 src/sys/kern/sys_pipe.c
cvs rdiff -u -r1.164 -r1.165 src/sys/kern/vfs_vnops.c
cvs rdiff -u -r1.145 -r1.146 src/sys/net/bpf.c
cvs rdiff -u -r1.56 -r1.57 src/sys/net/if_tap.c
cvs rdiff -u -r1.48 -r1.49 src/sys/opencrypto/cryptodev.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/dmover/dmover_io.c
diff -u src/sys/dev/dmover/dmover_io.c:1.33 src/sys/dev/dmover/dmover_io.c:1.34
--- src/sys/dev/dmover/dmover_io.c:1.33	Sat Apr 11 11:47:33 2009
+++ src/sys/dev/dmover/dmover_io.c	Sat Apr 11 19:05:26 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: dmover_io.c,v 1.33 2009/04/11 15:47:33 christos Exp $	*/
+/*	$NetBSD: dmover_io.c,v 1.34 2009/04/11 23:05:26 christos Exp $	*/
 
 /*
  * Copyright (c) 2002, 2003 Wasabi Systems, Inc.
@@ -55,7 +55,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: dmover_io.c,v 1.33 2009/04/11 15:47:33 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dmover_io.c,v 1.34 2009/04/11 23:05:26 christos Exp $");
 
 #include <sys/param.h>
 #include <sys/queue.h>
@@ -585,6 +585,8 @@
 	st->st_atime = ds->ds_atime;
 	st->st_mtime = ds->ds_mtime;
 	st->st_ctime = st->st_birthtime = ds->ds_btime;
+	st->st_uid = kauth_cred_geteuid(fp->f_cred);
+	st->st_gid = kauth_cred_getegid(fp->f_cred);
 	KERNEL_UNLOCK(NULL);
 	return 0;
 }

Index: src/sys/dev/putter/putter.c
diff -u src/sys/dev/putter/putter.c:1.22 src/sys/dev/putter/putter.c:1.23
--- src/sys/dev/putter/putter.c:1.22	Sat Apr 11 11:47:33 2009
+++ src/sys/dev/putter/putter.c	Sat Apr 11 19:05:26 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: putter.c,v 1.22 2009/04/11 15:47:33 christos Exp $	*/
+/*	$NetBSD: putter.c,v 1.23 2009/04/11 23:05:26 christos Exp $	*/
 
 /*
  * Copyright (c) 2006, 2007  Antti Kantee.  All Rights Reserved.
@@ -35,7 +35,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: putter.c,v 1.22 2009/04/11 15:47:33 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: putter.c,v 1.23 2009/04/11 23:05:26 christos Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -47,6 +47,7 @@
 #include <sys/stat.h>
 #include <sys/socketvar.h>
 #include <sys/module.h>
+#include <sys/kauth.h>
 
 #include <dev/putter/putter_sys.h>
 
@@ -216,8 +217,8 @@
 	size_t origres, moved;
 	int error;
 
-	getnanotime(&pi->pi_atime);
 	KERNEL_LOCK(1, NULL);
+	getnanotime(&pi->pi_atime);
 
 	if (pi->pi_private == PUTTER_EMBRYO || pi->pi_private == PUTTER_DEAD) {
 		printf("putter_fop_read: private %d not inited\n", pi->pi_idx);
@@ -265,8 +266,8 @@
 	size_t frsize;
 	int error;
 
-	getnanotime(&pi->pi_mtime);
 	KERNEL_LOCK(1, NULL);
+	getnanotime(&pi->pi_mtime);
 
 	DPRINTF(("putter_fop_write (%p): writing response, resid %zu\n",
 	    pi->pi_private, uio->uio_resid));
@@ -416,6 +417,8 @@
 	st->st_atimespec = pi->pi_atime;
 	st->st_mtimespec = pi->pi_mtime;
 	st->st_ctimespec = st->st_birthtimespec = pi->pi_btime;
+	st->st_uid = kauth_cred_geteuid(fp->f_cred);
+	st->st_gid = kauth_cred_getegid(fp->f_cred);
 	KERNEL_UNLOCK_ONE(NULL);
 	return 0;
 }

Index: src/sys/kern/kern_drvctl.c
diff -u src/sys/kern/kern_drvctl.c:1.25 src/sys/kern/kern_drvctl.c:1.26
--- src/sys/kern/kern_drvctl.c:1.25	Sat Apr 11 11:47:33 2009
+++ src/sys/kern/kern_drvctl.c	Sat Apr 11 19:05:26 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: kern_drvctl.c,v 1.25 2009/04/11 15:47:33 christos Exp $ */
+/* $NetBSD: kern_drvctl.c,v 1.26 2009/04/11 23:05:26 christos Exp $ */
 
 /*
  * Copyright (c) 2004
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_drvctl.c,v 1.25 2009/04/11 15:47:33 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_drvctl.c,v 1.26 2009/04/11 23:05:26 christos Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -45,6 +45,7 @@
 #include <sys/drvctlio.h>
 #include <sys/devmon.h>
 #include <sys/stat.h>
+#include <sys/kauth.h>
 
 struct drvctl_event {
 	TAILQ_ENTRY(drvctl_event) dce_link;
@@ -375,6 +376,8 @@
 drvctl_stat(struct file *fp, struct stat *st)
 {
 	(void)memset(st, 0, sizeof(*st));
+	st->st_uid = kauth_cred_geteuid(fp->f_cred);
+	st->st_gid = kauth_cred_getegid(fp->f_cred);
 	return 0;
 }
 

Index: src/sys/kern/sys_mqueue.c
diff -u src/sys/kern/sys_mqueue.c:1.15 src/sys/kern/sys_mqueue.c:1.16
--- src/sys/kern/sys_mqueue.c:1.15	Sat Apr 11 11:47:33 2009
+++ src/sys/kern/sys_mqueue.c	Sat Apr 11 19:05:26 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: sys_mqueue.c,v 1.15 2009/04/11 15:47:33 christos Exp $	*/
+/*	$NetBSD: sys_mqueue.c,v 1.16 2009/04/11 23:05:26 christos Exp $	*/
 
 /*
  * Copyright (c) 2007, 2008 Mindaugas Rasiukevicius <rmind at NetBSD org>
@@ -42,7 +42,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sys_mqueue.c,v 1.15 2009/04/11 15:47:33 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sys_mqueue.c,v 1.16 2009/04/11 23:05:26 christos Exp $");
 
 #include <sys/param.h>
 #include <sys/types.h>
@@ -246,14 +246,18 @@
 	struct mqueue *mq = fp->f_data;
 
 	(void)memset(st, 0, sizeof(*st));
-	KERNEL_LOCK(1, NULL);
+
+	mutex_enter(&mq->mq_mtx);
 	st->st_mode = mq->mq_mode;
 	st->st_uid = mq->mq_euid;
 	st->st_gid = mq->mq_egid;
 	st->st_atimespec = mq->mq_atime;
 	st->st_mtimespec = mq->mq_mtime;
 	st->st_ctimespec = st->st_birthtimespec = mq->mq_btime;
-	KERNEL_UNLOCK_ONE(NULL);
+	st->st_uid = kauth_cred_geteuid(fp->f_cred);
+	st->st_gid = kauth_cred_getegid(fp->f_cred);
+	mutex_exit(&mq->mq_mtx);
+
 	return 0;
 }
 

Index: src/sys/kern/sys_pipe.c
diff -u src/sys/kern/sys_pipe.c:1.111 src/sys/kern/sys_pipe.c:1.112
--- src/sys/kern/sys_pipe.c:1.111	Sat Apr 11 11:46:18 2009
+++ src/sys/kern/sys_pipe.c	Sat Apr 11 19:05:26 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: sys_pipe.c,v 1.111 2009/04/11 15:46:18 christos Exp $	*/
+/*	$NetBSD: sys_pipe.c,v 1.112 2009/04/11 23:05:26 christos Exp $	*/
 
 /*-
  * Copyright (c) 2003, 2007, 2008, 2009 The NetBSD Foundation, Inc.
@@ -68,7 +68,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sys_pipe.c,v 1.111 2009/04/11 15:46:18 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sys_pipe.c,v 1.112 2009/04/11 23:05:26 christos Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -1185,6 +1185,7 @@
 {
 	struct pipe *pipe = fp->f_data;
 
+	mutex_enter(pipe->pipe_lock);
 	memset(ub, 0, sizeof(*ub));
 	ub->st_mode = S_IFIFO | S_IRUSR | S_IWUSR;
 	ub->st_blksize = pipe->pipe_buffer.size;
@@ -1202,7 +1203,8 @@
 	 * Left as 0: st_dev, st_ino, st_nlink, st_rdev, st_flags, st_gen.
 	 * XXX (st_dev, st_ino) should be unique.
 	 */
-	return (0);
+	mutex_exit(pipe->pipe_lock);
+	return 0;
 }
 
 /* ARGSUSED */

Index: src/sys/kern/vfs_vnops.c
diff -u src/sys/kern/vfs_vnops.c:1.164 src/sys/kern/vfs_vnops.c:1.165
--- src/sys/kern/vfs_vnops.c:1.164	Sat Apr  4 06:12:51 2009
+++ src/sys/kern/vfs_vnops.c	Sat Apr 11 19:05:26 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: vfs_vnops.c,v 1.164 2009/04/04 10:12:51 ad Exp $	*/
+/*	$NetBSD: vfs_vnops.c,v 1.165 2009/04/11 23:05:26 christos Exp $	*/
 
 /*-
  * Copyright (c) 2009 The NetBSD Foundation, Inc.
@@ -66,7 +66,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_vnops.c,v 1.164 2009/04/04 10:12:51 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_vnops.c,v 1.165 2009/04/11 23:05:26 christos Exp $");
 
 #include "veriexec.h"
 
@@ -544,9 +544,13 @@
 static int
 vn_statfile(file_t *fp, struct stat *sb)
 {
-	struct vnode *vp = (struct vnode *)fp->f_data;
+	struct vnode *vp = fp->f_data;
+	int error;
 
-	return vn_stat(vp, sb);
+	vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
+	error = vn_stat(vp, sb);
+	VOP_UNLOCK(vp, 0);
+	return error;
 }
 
 int

Index: src/sys/net/bpf.c
diff -u src/sys/net/bpf.c:1.145 src/sys/net/bpf.c:1.146
--- src/sys/net/bpf.c:1.145	Sat Apr 11 11:47:33 2009
+++ src/sys/net/bpf.c	Sat Apr 11 19:05:26 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: bpf.c,v 1.145 2009/04/11 15:47:33 christos Exp $	*/
+/*	$NetBSD: bpf.c,v 1.146 2009/04/11 23:05:26 christos Exp $	*/
 
 /*
  * Copyright (c) 1990, 1991, 1993
@@ -39,7 +39,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: bpf.c,v 1.145 2009/04/11 15:47:33 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: bpf.c,v 1.146 2009/04/11 23:05:26 christos Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_bpf.h"
@@ -1137,6 +1137,8 @@
 	st->st_atimespec = d->bd_atime;
 	st->st_mtimespec = d->bd_mtime;
 	st->st_ctimespec = st->st_birthtimespec = d->bd_btime;
+	st->st_uid = kauth_cred_geteuid(fp->f_cred);
+	st->st_gid = kauth_cred_getegid(fp->f_cred);
 	KERNEL_UNLOCK_ONE(NULL);
 	return 0;
 }

Index: src/sys/net/if_tap.c
diff -u src/sys/net/if_tap.c:1.56 src/sys/net/if_tap.c:1.57
--- src/sys/net/if_tap.c:1.56	Sat Apr 11 11:47:33 2009
+++ src/sys/net/if_tap.c	Sat Apr 11 19:05:26 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_tap.c,v 1.56 2009/04/11 15:47:33 christos Exp $	*/
+/*	$NetBSD: if_tap.c,v 1.57 2009/04/11 23:05:26 christos Exp $	*/
 
 /*
  *  Copyright (c) 2003, 2004, 2008, 2009 The NetBSD Foundation.
@@ -33,7 +33,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_tap.c,v 1.56 2009/04/11 15:47:33 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_tap.c,v 1.57 2009/04/11 23:05:26 christos Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "bpfilter.h"
@@ -139,7 +139,6 @@
 static int	tap_dev_write(int, struct uio *, int);
 static int	tap_dev_ioctl(int, u_long, void *, struct lwp *);
 static int	tap_dev_poll(int, int, struct lwp *);
-static int	tap_dev_stat(int , struct stat *);
 static int	tap_dev_kqfilter(int, struct knote *);
 
 /* Fileops access routines */
@@ -979,27 +978,27 @@
 tap_fops_stat(file_t *fp, struct stat *st)
 {
 	int error;
-	KERNEL_LOCK(1, NULL);
-	error = tap_dev_stat((intptr_t)fp->f_data, st);
-	KERNEL_UNLOCK_ONE(NULL);
-	return error;
-}
-	
-static int
-tap_dev_stat(int unit, struct stat *st)
-{
-	struct tap_softc *sc =
-	    device_lookup_private(&tap_cd, unit);
-
-	if (sc == NULL)
-		return ENXIO;
+	struct tap_softc *sc;
+	int unit = (uintptr_t)fp->f_data;
 
 	(void)memset(st, 0, sizeof(*st));
+
+	KERNEL_LOCK(1, NULL);
+	sc = device_lookup_private(&tap_cd, unit);
+	if (sc == NULL) {
+		error = ENXIO;
+		goto out;
+	}
+
 	st->st_dev = makedev(cdevsw_lookup_major(&tap_cdevsw), unit);
 	st->st_atimespec = sc->sc_atime;
 	st->st_mtimespec = sc->sc_mtime;
 	st->st_ctimespec = st->st_birthtimespec = sc->sc_btime;
-	return 0;
+	st->st_uid = kauth_cred_geteuid(fp->f_cred);
+	st->st_gid = kauth_cred_getegid(fp->f_cred);
+out:
+	KERNEL_UNLOCK_ONE(NULL);
+	return error;
 }
 
 static int

Index: src/sys/opencrypto/cryptodev.c
diff -u src/sys/opencrypto/cryptodev.c:1.48 src/sys/opencrypto/cryptodev.c:1.49
--- src/sys/opencrypto/cryptodev.c:1.48	Sat Apr 11 11:47:34 2009
+++ src/sys/opencrypto/cryptodev.c	Sat Apr 11 19:05:26 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: cryptodev.c,v 1.48 2009/04/11 15:47:34 christos Exp $ */
+/*	$NetBSD: cryptodev.c,v 1.49 2009/04/11 23:05:26 christos Exp $ */
 /*	$FreeBSD: src/sys/opencrypto/cryptodev.c,v 1.4.2.4 2003/06/03 00:09:02 sam Exp $	*/
 /*	$OpenBSD: cryptodev.c,v 1.53 2002/07/10 22:21:30 mickey Exp $	*/
 
@@ -64,7 +64,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cryptodev.c,v 1.48 2009/04/11 15:47:34 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cryptodev.c,v 1.49 2009/04/11 23:05:26 christos Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -233,7 +233,9 @@
 	struct fcrypt *criofcr;
 	int criofd;
 
+	mutex_spin_enter(&crypto_mtx);
 	getnanotime(&fcr->atime);
+	mutex_spin_exit(&crypto_mtx);
 
 	switch (cmd) {
         case CRIOGET:   /* XXX deprecated, remove after 5.0 */
@@ -272,7 +274,9 @@
 			goto mbail;
 		}
 
+		mutex_spin_enter(&crypto_mtx);
 		fcr->mtime = fcr->atime;
+		mutex_spin_exit(&crypto_mtx);
 		error = cryptodev_msession(fcr, snop, sgop->count);
 		if (error) {
 			goto mbail;
@@ -284,8 +288,8 @@
 		kmem_free(snop, sgop->count * sizeof(struct session_n_op));
 		break;
 	case CIOCFSESSION:
-		fcr->mtime = fcr->atime;
 		mutex_spin_enter(&crypto_mtx);
+		fcr->mtime = fcr->atime;
 		ses = *(u_int32_t *)data;
 		cse = csefind(fcr, ses);
 		if (cse == NULL)
@@ -295,7 +299,9 @@
 		mutex_spin_exit(&crypto_mtx);
 		break;
 	case CIOCNFSESSION:
+		mutex_spin_enter(&crypto_mtx);
 		fcr->mtime = fcr->atime;
+		mutex_spin_exit(&crypto_mtx);
 		sfop = (struct crypt_sfop *)data;
 		sesid = kmem_alloc((sfop->count * sizeof(u_int32_t)), 
 		    KM_SLEEP);
@@ -307,8 +313,8 @@
 		kmem_free(sesid, (sfop->count * sizeof(u_int32_t)));
 		break;
 	case CIOCCRYPT:
-		fcr->mtime = fcr->atime;
 		mutex_spin_enter(&crypto_mtx);
+		fcr->mtime = fcr->atime;
 		cop = (struct crypt_op *)data;
 		cse = csefind(fcr, cop->ses);
 		mutex_spin_exit(&crypto_mtx);
@@ -320,7 +326,9 @@
 		DPRINTF(("cryptodev_op error = %d\n", error));
 		break;
 	case CIOCNCRYPTM:
+		mutex_spin_enter(&crypto_mtx);
 		fcr->mtime = fcr->atime;
+		mutex_spin_exit(&crypto_mtx);
 		mop = (struct crypt_mop *)data;
 		cnop = kmem_alloc((mop->count * sizeof(struct crypt_n_op)),
 		    KM_SLEEP);
@@ -340,7 +348,9 @@
 		DPRINTF(("cryptodev_key error = %d\n", error));
 		break;
 	case CIOCNFKEYM:
+		mutex_spin_enter(&crypto_mtx);
 		fcr->mtime = fcr->atime;
+		mutex_spin_exit(&crypto_mtx);
 		mkop = (struct crypt_mkop *)data;
 		knop = kmem_alloc((mkop->count * sizeof(struct crypt_n_kop)),
 		    KM_SLEEP);
@@ -358,7 +368,9 @@
 		error = crypto_getfeat((int *)data);
 		break;
 	case CIOCNCRYPTRETM:
+		mutex_spin_enter(&crypto_mtx);
 		fcr->mtime = fcr->atime;
+		mutex_spin_exit(&crypto_mtx);
 		crypt_ret = (struct cryptret *)data;
 		count = crypt_ret->count;
 		crypt_res = kmem_alloc((count * sizeof(struct crypt_result)),  
@@ -1960,12 +1972,16 @@
 	struct fcrypt *fcr = fp->f_data;
 
 	(void)memset(st, 0, sizeof(st));
-	KERNEL_LOCK(1, NULL);
+
+	mutex_spin_enter(&crypto_mtx);
 	st->st_dev = makedev(cdevsw_lookup_major(&crypto_cdevsw), fcr->sesn);
 	st->st_atimespec = fcr->atime;
 	st->st_mtimespec = fcr->mtime;
 	st->st_ctimespec = st->st_birthtimespec = fcr->btime;
-	KERNEL_UNLOCK_ONE(NULL);
+	st->st_uid = kauth_cred_geteuid(fp->f_cred);
+	st->st_gid = kauth_cred_getegid(fp->f_cred);
+	mutex_spin_exit(&crypto_mtx);
+
 	return 0;
 }
 

Reply via email to