On Mon, 30 Nov 2020 20:04:10 -0800 Greg Steuck <gne...@openbsd.org> wrote:
> Tested with a bunch of manual sysctl -w's. > > OK? I'm not sure about this diff. I'm more likely to do ddb{0}> set $radix = 0t2 and less likely to do # sysctl ddb.radix=2 but you enforce the range check (radix in 8..16) only in sysctl, not in ddb set. If I do ddb set a bad value, then sysctl refuses to show the value: # sysctl ddb.console=1 ddb.console: 0 -> 1 # sysctl ddb.trigger=1 Stopped at ddb_sysctl+0x114: ori r0,r0,0x0 ddb{0}> set $radix = 0t2 ddb{0}> c ddb.trigger: 0 -> 1 # sysctl ddb.radix sysctl: ddb.radix: Invalid argument This diff might be better than doing nothing? I'm not sure. --George > From 24ae202fd5d39c3c40c029fb878aa15eee33b709 Mon Sep 17 00:00:00 2001 > From: Greg Steuck <g...@nest.cx> > Date: Mon, 30 Nov 2020 19:42:19 -0800 > Subject: [PATCH] Convert ddb_sysctl to sysctl_bounded_arr > > --- > sys/ddb/db_usrreq.c | 22 ++++++++++------------ > 1 file changed, 10 insertions(+), 12 deletions(-) > > diff --git sys/ddb/db_usrreq.c sys/ddb/db_usrreq.c > index 546822459ca..259e7b56a8f 100644 > --- sys/ddb/db_usrreq.c > +++ sys/ddb/db_usrreq.c > @@ -36,6 +36,14 @@ > int db_log = 1; > int db_profile; /* Allow dynamic profiling */ > > +const struct sysctl_bounded_args ddb_vars[] = { > + { DBCTL_RADIX, &db_radix, 8, 16 }, > + { DBCTL_MAXWIDTH, &db_max_width, 0, INT_MAX }, > + { DBCTL_TABSTOP, &db_tab_stop_width, 1, 16 }, > + { DBCTL_MAXLINE, &db_max_line, 0, INT_MAX }, > + { DBCTL_LOG, &db_log, 0, 1 }, > +}; > + > int > ddb_sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp, > size_t newlen, struct proc *p) > @@ -47,15 +55,6 @@ ddb_sysctl(int *name, u_int namelen, void *oldp, size_t > *oldlenp, void *newp, > return (ENOTDIR); > > switch (name[0]) { > - > - case DBCTL_RADIX: > - return sysctl_int(oldp, oldlenp, newp, newlen, &db_radix); > - case DBCTL_MAXWIDTH: > - return sysctl_int(oldp, oldlenp, newp, newlen, &db_max_width); > - case DBCTL_TABSTOP: > - return sysctl_int(oldp, oldlenp, newp, newlen, > &db_tab_stop_width); > - case DBCTL_MAXLINE: > - return sysctl_int(oldp, oldlenp, newp, newlen, &db_max_line); > case DBCTL_PANIC: > if (securelevel > 0) > return (sysctl_int_lower(oldp, oldlenp, newp, newlen, > @@ -86,8 +85,6 @@ ddb_sysctl(int *name, u_int namelen, void *oldp, size_t > *oldlenp, void *newp, > return (0); > } > break; > - case DBCTL_LOG: > - return (sysctl_int(oldp, oldlenp, newp, newlen, &db_log)); > case DBCTL_TRIGGER: > if (newp && db_console) { > struct process *pr = curproc->p_p; > @@ -119,7 +116,8 @@ ddb_sysctl(int *name, u_int namelen, void *oldp, size_t > *oldlenp, void *newp, > break; > #endif /* DDBPROF */ > default: > - return (EOPNOTSUPP); > + return (sysctl_bounded_arr(ddb_vars, nitems(ddb_vars), name, > + namelen, oldp, oldlenp, newp, newlen)); > } > /* NOTREACHED */ > } > -- > 2.29.2 > -- George Koehler <kern...@gmail.com>