summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Gwynne <dlg@cvs.openbsd.org>2006-05-28 19:41:43 +0000
committerDavid Gwynne <dlg@cvs.openbsd.org>2006-05-28 19:41:43 +0000
commit99e575406469b94c4d5bad0ccfbc349e6f26271e (patch)
tree0ff5e7cfb0e8b23196c7877e5d7f0dccc7b1a8c5
parent38df24937a9054c2dbbd39b4254c76bc588ff7b9 (diff)
back out my last commit. art pointed out that sysctl cannot sleep when
copying out to userland, so my fix was useless bloat that didnt really do anything. the problem instead appears to be a use after free in a driver rather than bad interactions with sysctl.
-rw-r--r--sys/kern/kern_sysctl.c17
1 files changed, 7 insertions, 10 deletions
diff --git a/sys/kern/kern_sysctl.c b/sys/kern/kern_sysctl.c
index 0b153df579c..343fdf1c15f 100644
--- a/sys/kern/kern_sysctl.c
+++ b/sys/kern/kern_sysctl.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kern_sysctl.c,v 1.141 2006/05/20 22:55:46 dlg Exp $ */
+/* $OpenBSD: kern_sysctl.c,v 1.142 2006/05/28 19:41:42 dlg Exp $ */
/* $NetBSD: kern_sysctl.c,v 1.17 1996/05/20 17:49:05 mrg Exp $ */
/*-
@@ -1796,22 +1796,19 @@ int
sysctl_sensors(int *name, u_int namelen, void *oldp, size_t *oldlenp,
void *newp, size_t newlen)
{
- struct sensor ls, *s;
+ struct sensor *s;
+ int num;
if (namelen != 1)
return (ENOTDIR);
- s = sensor_get(name[0]);
+ num = name[0];
+
+ s = sensor_get(num);
if (s == NULL)
return (ENOENT);
- /*
- * Make a local copy of the sensor which cannot be freed by a driver
- * while it's being copied to userland.
- */
- bcopy(s, &ls, sizeof(ls));
-
- return (sysctl_rdstruct(oldp, oldlenp, newp, &ls, sizeof(ls)));
+ return (sysctl_rdstruct(oldp, oldlenp, newp, s, sizeof(struct sensor)));
}
int