On Mon, Aug 26, 2024 at 01:21:41PM +0200, Omar Polo wrote:
> On 2024/08/25 20:55:09 -0700, Collin Funk <[email protected]> wrote:
> > "Theo de Raadt" <[email protected]> writes:
> >
> > > Noone uses telnet, we (mostly) killed it!
> > >
> > > https://www.openbsd.org/images/tshirt-9b.jpg
> > >
> > > There is no way in heck this code is going to be converted in OpenBSD
> > > to use strtol(), which is even more willing to eat junk.
> >
> > I don't disagree. Especially on the strtol part.
> >
> > > In our world, someone should adapt this to strtonum(), which is
> > > a cynical string to integer API with range-control built in.
> >
> > Interesting, good to know. Anyways my patch is here to draw inspiration
> > from if anyone decides they care about telnet. :)
>
> I don't usually use telnet, but seemed simple to fix the hand rolled
> parser to use strtonum
>
> OKs/opinions on the verbiage?
OK bluhm@
> telnet> send dont 999
> '999': too large ('send dont ?' for help).
> telnet> send dont -33
> '-33': too small ('send dont ?' for help).
> telnet> send dont 12abc
> '12abc': invalid ('send dont ?' for help).
>
> diff /usr/src
> commit - cfb8aef91a90e62370ec0c79ff80c4089a8f0cfb
> path + /usr/src
> blob - dcf3a77a973c60dda457cfa7da59fd1ac5a58256
> file + usr.bin/telnet/commands.c
> --- usr.bin/telnet/commands.c
> +++ usr.bin/telnet/commands.c
> @@ -358,6 +358,7 @@ send_tncmd(void (*func)(int, int), char *cmd, char *na
> {
> char **cpp;
> extern char *telopts[];
> + const char *errstr;
> int val = 0;
>
> if (isprefix(name, "help") || isprefix(name, "?")) {
> @@ -389,21 +390,11 @@ send_tncmd(void (*func)(int, int), char *cmd, char *na
> if (cpp) {
> val = cpp - telopts;
> } else {
> - char *cp = name;
> -
> - while (*cp >= '0' && *cp <= '9') {
> - val *= 10;
> - val += *cp - '0';
> - cp++;
> - }
> - if (*cp != 0) {
> - fprintf(stderr, "'%s': unknown argument ('send %s ?' for
> help).\r\n",
> - name, cmd);
> + val = strtonum(name, 0, 255, &errstr);
> + if (errstr) {
> + fprintf(stderr, "'%s': %s ('send %s ?' for help).\r\n",
> + name, errstr, cmd);
> return 0;
> - } else if (val < 0 || val > 255) {
> - fprintf(stderr, "'%s': bad value ('send %s ?' for help).\r\n",
> - name, cmd);
> - return 0;
> }
> }
> if (!connected) {