diff options
author | phk <phk@FreeBSD.org> | 1999-03-23 14:23:15 +0000 |
---|---|---|
committer | phk <phk@FreeBSD.org> | 1999-03-23 14:23:15 +0000 |
commit | a6cff8a40588e5200eaa3635409eaf799058be7d (patch) | |
tree | 969a26bfdf281e1a7a3cc2584b50c02f1d4bf7c5 | |
parent | 9e462600ccf15d2a1b523df033a65d6f7ae14aaa (diff) | |
download | FreeBSD-src-a6cff8a40588e5200eaa3635409eaf799058be7d.zip FreeBSD-src-a6cff8a40588e5200eaa3635409eaf799058be7d.tar.gz |
Fix some nasty hangs if garbage were passed.
Noticed by: Emmanuel DELOGET <pixel@DotCom.FR>
Remembered by: msmith
-rw-r--r-- | sys/kern/kern_sysctl.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/sys/kern/kern_sysctl.c b/sys/kern/kern_sysctl.c index 27a511a..958fa65 100644 --- a/sys/kern/kern_sysctl.c +++ b/sys/kern/kern_sysctl.c @@ -37,7 +37,7 @@ * SUCH DAMAGE. * * @(#)kern_sysctl.c 8.4 (Berkeley) 4/14/94 - * $Id: kern_sysctl.c,v 1.83 1999/01/10 07:45:31 phk Exp $ + * $Id: kern_sysctl.c,v 1.84 1999/02/16 10:49:48 dfr Exp $ */ #include "opt_compat.h" @@ -220,7 +220,7 @@ sysctl_sysctl_name SYSCTL_HANDLER_ARGS u_int namelen = arg2; int error = 0; struct sysctl_oid *oid; - struct sysctl_oid_list *lsp = &sysctl__children; + struct sysctl_oid_list *lsp = &sysctl__children, *lsp2; char buf[10]; while (namelen) { @@ -236,6 +236,7 @@ sysctl_sysctl_name SYSCTL_HANDLER_ARGS name++; continue; } + lsp2 = 0; SLIST_FOREACH(oid, lsp, oid_link) { if (oid->oid_number != *name) continue; @@ -251,15 +252,16 @@ sysctl_sysctl_name SYSCTL_HANDLER_ARGS namelen--; name++; - if ((oid->oid_kind & CTLTYPE) != CTLTYPE_NODE) + if ((oid->oid_kind & CTLTYPE) != CTLTYPE_NODE) break; if (oid->oid_handler) break; - lsp = (struct sysctl_oid_list *)oid->oid_arg1; + lsp2 = (struct sysctl_oid_list *)oid->oid_arg1; break; } + lsp = lsp2; } return (SYSCTL_OUT(req, "", 1)); } |