aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2020-05-09 13:00:38 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2020-05-09 13:00:38 +0000
commit697503c4d3428dd839658e3fe07d761c292baaf2 (patch)
treed0bc78864794df0d405cd330bed15bea2f223769
parent0298cf17b204ba7c2d5bdfc7826e48e03e661114 (diff)
downloadsrc-697503c4d3428dd839658e3fe07d761c292baaf2.tar.gz
src-697503c4d3428dd839658e3fe07d761c292baaf2.zip
Avoid spurious ENOMEMs from sysctl hw.pagesizes.
Reported by: Paul Floyd <paulf@free.fr> PR: 246215 Reviewed by: emaste Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D24737
Notes
Notes: svn path=/head/; revision=360845
-rw-r--r--sys/kern/kern_mib.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/sys/kern/kern_mib.c b/sys/kern/kern_mib.c
index 5827e428fdf2..d8c5ffbc8803 100644
--- a/sys/kern/kern_mib.c
+++ b/sys/kern/kern_mib.c
@@ -231,6 +231,7 @@ static int
sysctl_hw_pagesizes(SYSCTL_HANDLER_ARGS)
{
int error;
+ size_t len;
#ifdef SCTL_MASK32
int i;
uint32_t pagesizes32[MAXPAGESIZES];
@@ -243,10 +244,18 @@ sysctl_hw_pagesizes(SYSCTL_HANDLER_ARGS)
for (i = 0; i < MAXPAGESIZES; i++)
pagesizes32[i] = (uint32_t)pagesizes[i];
- error = SYSCTL_OUT(req, pagesizes32, sizeof(pagesizes32));
+ len = sizeof(pagesizes32);
+ if (len > req->oldlen)
+ len = req->oldlen;
+ error = SYSCTL_OUT(req, pagesizes32, len);
} else
#endif
- error = SYSCTL_OUT(req, pagesizes, sizeof(pagesizes));
+ {
+ len = sizeof(pagesizes);
+ if (len > req->oldlen)
+ len = req->oldlen;
+ error = SYSCTL_OUT(req, pagesizes, len);
+ }
return (error);
}
SYSCTL_PROC(_hw, OID_AUTO, pagesizes,