On Mon, Aug 26, 2024 at 01:21:41PM +0200, Omar Polo wrote:
> On 2024/08/25 20:55:09 -0700, Collin Funk <collin.fu...@gmail.com> wrote:
> > "Theo de Raadt" <dera...@openbsd.org> 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) {

Reply via email to