Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 13 Nov 1995 14:05:23 +0800 (WST)
From:      Peter Wemm <peter@jhome.DIALix.COM>
To:        current@freebsd.org
Subject:   possible sysctl fix
Message-ID:  <Pine.BSF.3.91.951113135841.221B-100000@jhome.DIALix.COM>

next in thread | raw e-mail | index | archive | help
I think poor Poul-Henning must have broken a few mirrors, walked under 
ladders and crossed 17 black cat's paths lately to have this much bad 
luck...

The following patch against -current fixes things for me, but I have not 
run it for long enough to see for sure.  If you try it, make sure you 
can back out if you need to.  Beware, I'm tired and quite possibly have 
screwed it....  There's a lot of changes here, some un-needed. 

Your mileage may vary.  But it just may get you out of a jam until phk 
wakes up and commits a proper fix.

-Peter

Index: kern_sysctl.c
===================================================================
RCS file: /home/ncvs/src/sys/kern/kern_sysctl.c,v
retrieving revision 1.38
diff -u -r1.38 kern_sysctl.c
--- kern_sysctl.c	1995/11/12 19:51:51	1.38
+++ kern_sysctl.c	1995/11/13 05:30:04
@@ -300,18 +300,22 @@
 {
 	int error = 0;
 
-	if (arg1)
-		error = SYSCTL_OUT(req, arg1, sizeof(int));
-	else if (arg2)
-		error = SYSCTL_OUT(req, &arg2, sizeof(int));
+	if (req->oldlen) {
+		if (arg1)
+			error = SYSCTL_OUT(req, arg1, sizeof(int));
+		else if (arg2)
+			error = SYSCTL_OUT(req, &arg2, sizeof(int));
+	}
 
-	if (error || !req->newptr)
+	if (error)
 		return (error);
 
-	if (!arg1)
-		error = EPERM;
-	else
-		error = SYSCTL_IN(req, arg1, sizeof(int));
+	if (req->newptr) {
+		if (!arg1)
+			error = EPERM;
+		else
+			error = SYSCTL_IN(req, arg1, sizeof(int));
+	}
 	return (error);
 }
 
@@ -327,20 +331,29 @@
 {
 	int error=0;
 
-	if (arg2)
-		error = SYSCTL_OUT(req, arg1, arg2);
-	else
-		error = SYSCTL_OUT(req, arg1, strlen((char *)arg1)+1);
+	if (req->oldlen) {
+#if 0
+/* this breaks gethostname(buf, 64) (eg: gated) */
+		if (arg2)
+			error = SYSCTL_OUT(req, arg1, arg2);
+		else
+#endif
+			error = SYSCTL_OUT(req, arg1, strlen((char *)arg1)+1);
+	}
 
-	if (error || !req->newptr)
+	if (error)
 		return (error);
 
-	if ((req->newlen - req->newidx) > arg2) {
-		error = E2BIG;
-	} else {
-		arg2 = (req->newlen - req->newidx);
-		error = SYSCTL_IN(req, arg1, arg2);
-		((char *)arg1)[arg2] = '\0';
+	if (req->newptr) {
+		if (!arg2) {
+			error = EPERM;
+		} else if ((req->newlen - req->newidx) > arg2) {
+			error = E2BIG;
+		} else {
+			arg2 = (req->newlen - req->newidx);
+			error = SYSCTL_IN(req, arg1, arg2);
+			((char *)arg1)[arg2] = '\0';
+		}
 	}
 
 	return (error);
@@ -354,14 +367,16 @@
 int
 sysctl_handle_opaque SYSCTL_HANDLER_ARGS
 {
-	int error;
+	int error = 0;
 
-	error = SYSCTL_OUT(req, arg1, arg2);
+	if (req->oldlen)
+		error = SYSCTL_OUT(req, arg1, arg2);
 
-	if (error || !req->newptr)
+	if (error)
 		return (error);
 
-	error = SYSCTL_IN(req, arg1, arg2);
+	if (req->newptr)
+		error = SYSCTL_IN(req, arg1, arg2);
 
 	return (error);
 }
@@ -395,8 +410,14 @@
 int
 sysctl_old_user(struct sysctl_req *req, void *p, int l)
 {
-	int error , i = min(req->oldlen - req->oldidx, l);
+	int error, i;
 
+	if (!req->oldptr) {
+		req->oldidx += l;
+		return 0;
+	}
+		
+	i = min(req->oldlen - req->oldidx, l);
 	error  = copyout(p, req->oldptr + req->oldidx, i);
 	req->oldidx += i;
 	if (error)
@@ -575,6 +596,8 @@
 	error = sysctl_root(0, name, namelen, &req);
 
         if (!error || error == ENOMEM) {
+		if (req.oldptr == NULL && oldlenp)
+			req.oldlen = req.oldidx;
 		if (retval)
 			*retval = req.oldlen;
 		if (oldlenp) {



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.3.91.951113135841.221B-100000>