diff options
| author | christos <christos@NetBSD.org> | 2009-04-11 23:05:26 +0000 |
|---|---|---|
| committer | christos <christos@NetBSD.org> | 2009-04-11 23:05:26 +0000 |
| commit | 86ba58fd640f362fb41b7ed2ce8d22120d301a3d (patch) | |
| tree | 3c188af2535c0f7a7419e3d7ec704bbe3c07d929 | |
| parent | 135645196a9a6581a1d63d4615159391e3b39584 (diff) | |
Fix locking as Andy explained. Also fill in uid and gid like sys_pipe did.
| -rw-r--r-- | sys/dev/dmover/dmover_io.c | 6 | ||||
| -rw-r--r-- | sys/dev/putter/putter.c | 11 | ||||
| -rw-r--r-- | sys/kern/kern_drvctl.c | 7 | ||||
| -rw-r--r-- | sys/kern/sys_mqueue.c | 12 | ||||
| -rw-r--r-- | sys/kern/sys_pipe.c | 8 | ||||
| -rw-r--r-- | sys/kern/vfs_vnops.c | 12 | ||||
| -rw-r--r-- | sys/net/bpf.c | 6 | ||||
| -rw-r--r-- | sys/net/if_tap.c | 35 | ||||
| -rw-r--r-- | sys/opencrypto/cryptodev.c | 28 |
9 files changed, 80 insertions, 45 deletions
diff --git a/sys/dev/dmover/dmover_io.c b/sys/dev/dmover/dmover_io.c index 6808605e070..16e5a366ec3 100644 --- a/sys/dev/dmover/dmover_io.c +++ b/sys/dev/dmover/dmover_io.c @@ -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 @@ dmio_stat(struct file *fp, struct stat *st) 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; } diff --git a/sys/dev/putter/putter.c b/sys/dev/putter/putter.c index f7f7fd7c1c7..a8a94d11562 100644 --- a/sys/dev/putter/putter.c +++ b/sys/dev/putter/putter.c @@ -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 @@ __KERNEL_RCSID(0, "$NetBSD: putter.c,v 1.22 2009/04/11 15:47:33 christos Exp $") #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 @@ putter_fop_read(file_t *fp, off_t *off, struct uio *uio, 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 @@ putter_fop_write(file_t *fp, off_t *off, struct uio *uio, 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 @@ putter_fop_stat(file_t *fp, struct stat *st) 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; } diff --git a/sys/kern/kern_drvctl.c b/sys/kern/kern_drvctl.c index 7831902b549..8c0872955f8 100644 --- a/sys/kern/kern_drvctl.c +++ b/sys/kern/kern_drvctl.c @@ -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 @@ __KERNEL_RCSID(0, "$NetBSD: kern_drvctl.c,v 1.25 2009/04/11 15:47:33 christos Ex #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 @@ static int 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; } diff --git a/sys/kern/sys_mqueue.c b/sys/kern/sys_mqueue.c index 85c09e7c5ff..9fadbefea4f 100644 --- a/sys/kern/sys_mqueue.c +++ b/sys/kern/sys_mqueue.c @@ -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 @@ mq_stat_fop(file_t *fp, struct stat *st) 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; } diff --git a/sys/kern/sys_pipe.c b/sys/kern/sys_pipe.c index 43ad2eb5159..1b1c369e31f 100644 --- a/sys/kern/sys_pipe.c +++ b/sys/kern/sys_pipe.c @@ -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 @@ pipe_stat(struct file *fp, struct stat *ub) { 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 @@ pipe_stat(struct file *fp, struct stat *ub) * 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 */ diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c index 05533ba92cd..32b087f7d1d 100644 --- a/sys/kern/vfs_vnops.c +++ b/sys/kern/vfs_vnops.c @@ -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 @@ vn_write(file_t *fp, off_t *offset, struct uio *uio, kauth_cred_t cred, 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 diff --git a/sys/net/bpf.c b/sys/net/bpf.c index 1d6aa0e30dc..6c900ef2e19 100644 --- a/sys/net/bpf.c +++ b/sys/net/bpf.c @@ -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 @@ bpf_stat(struct file *fp, struct stat *st) 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; } diff --git a/sys/net/if_tap.c b/sys/net/if_tap.c index eb184d82617..34f886950a8 100644 --- a/sys/net/if_tap.c +++ b/sys/net/if_tap.c @@ -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_read(int, struct uio *, int); 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 @@ static int 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 diff --git a/sys/opencrypto/cryptodev.c b/sys/opencrypto/cryptodev.c index a2e472fc098..ee03a31001b 100644 --- a/sys/opencrypto/cryptodev.c +++ b/sys/opencrypto/cryptodev.c @@ -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 @@ cryptof_ioctl(struct file *fp, u_long cmd, void *data) 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 @@ cryptof_ioctl(struct file *fp, u_long cmd, void *data) 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 @@ mbail: 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 @@ mbail: 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 @@ mbail: 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 @@ mbail: 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 @@ mbail: 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 @@ mbail: 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 @@ cryptof_stat(struct file *fp, struct stat *st) 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; } |
