diff options
author | green <green@FreeBSD.org> | 2004-06-11 02:20:37 +0000 |
---|---|---|
committer | green <green@FreeBSD.org> | 2004-06-11 02:20:37 +0000 |
commit | ff7604586b5b86ef8aed2b86aa6ea884aca4b188 (patch) | |
tree | 7d2d1815bd7a2bc8d452869fc95d8af86d7f9717 /sys/kern | |
parent | 4125920b237c98c2a8cd60321baf22a82165469c (diff) | |
download | FreeBSD-src-ff7604586b5b86ef8aed2b86aa6ea884aca4b188.zip FreeBSD-src-ff7604586b5b86ef8aed2b86aa6ea884aca4b188.tar.gz |
Make sysctl_wire_old_buffer() respect ENOMEM from vslock() by marking
the valid length as 0. This prevents vsunlock() from removing a system
wire from memory that was not successfully wired (by us).
Submitted by: tegge
Diffstat (limited to 'sys/kern')
-rw-r--r-- | sys/kern/kern_sysctl.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/sys/kern/kern_sysctl.c b/sys/kern/kern_sysctl.c index 79e99a6..39214de 100644 --- a/sys/kern/kern_sysctl.c +++ b/sys/kern/kern_sysctl.c @@ -1101,8 +1101,11 @@ sysctl_wire_old_buffer(struct sysctl_req *req, size_t len) req->oldfunc == sysctl_old_user) { if (wiredlen != 0) { ret = vslock(req->oldptr, wiredlen); - if (ret != 0 && ret != ENOMEM) - return (ret); + if (ret != 0) { + if (ret != ENOMEM) + return (ret); + wiredlen = 0; + } } req->lock = REQ_WIRED; req->validlen = wiredlen; |