Hi,

After this commit, I have gotten the following error:

In file included from /usr/src/bin/sh/miscbltin.c:64:
/usr/src/bin/sh/syntax.h:50: error: "CEOF" redefined [-Werror]
   50 | #define CEOF 10                 /* end of file */
      |
In file included from /usr/world/10.99/amd64/dest/usr/include/termios.h:313,
                 from /usr/src/bin/sh/miscbltin.c:59:
/usr/world/10.99/amd64/dest/usr/include/sys/ttydefaults.h:58: note: this is the
location of the previous definition
   58 | #define CEOF            CTRL('d')

Could you take a look at this error?

Thank you.

"Robert Elz" <k...@netbsd.org> writes:

> Module Name:  src
> Committed By: kre
> Date:         Thu Jul  3 03:54:40 UTC 2025
>
> Modified Files:
>       src/bin/sh: miscbltin.c
>
> Log Message:
> Don't allow read to make use of the shell's internal '='
> terminates var names feature (which exists so in things
> like "external foo=bar" the shell can simply set the "variable"
> "foo=bar" to "bar" and doesn't need to put \0 on top of the '=',
> or copy the var name part elsewhere, and other similar internal
> advantages) - in most cases either allowing the '=' is intended, (as
> in the export example) or other checks make it impossible (${var} etc),
> but nothing was checking the var names passed to the read command.
>
> Fix that ... (side effect is that now if an invalid name is
> given, it will be detected before anything is read, before a
> prompt is written, rather than after the read, when the vars
> are being set to the fields from the line read).
>
> Don't bother doing this in SMALL shells, avoid the (small) extra
> code bloat - SMALL shells can just treat being able to say
>       read a b=hello c   (which means the same as read a b c)
> as a harmless foible...
>
>
> To generate a diff of this commit:
> cvs rdiff -u -r1.56 -r1.57 src/bin/sh/miscbltin.c
>
> Please note that diffs are not public domain; they are subject to the
> copyright notices on the relevant files.
>
> Modified files:
>
> Index: src/bin/sh/miscbltin.c
> diff -u src/bin/sh/miscbltin.c:1.56 src/bin/sh/miscbltin.c:1.57
> --- src/bin/sh/miscbltin.c:1.56       Sat Oct 12 23:34:56 2024
> +++ src/bin/sh/miscbltin.c    Thu Jul  3 03:54:40 2025
> @@ -1,4 +1,4 @@
> -/*   $NetBSD: miscbltin.c,v 1.56 2024/10/12 23:34:56 kre Exp $       */
> +/*   $NetBSD: miscbltin.c,v 1.57 2025/07/03 03:54:40 kre Exp $       */
>  
>  /*-
>   * Copyright (c) 1991, 1993
> @@ -37,7 +37,7 @@
>  #if 0
>  static char sccsid[] = "@(#)miscbltin.c      8.4 (Berkeley) 5/4/95";
>  #else
> -__RCSID("$NetBSD: miscbltin.c,v 1.56 2024/10/12 23:34:56 kre Exp $");
> +__RCSID("$NetBSD: miscbltin.c,v 1.57 2025/07/03 03:54:40 kre Exp $");
>  #endif
>  #endif /* not lint */
>  
> @@ -61,6 +61,7 @@ __RCSID("$NetBSD: miscbltin.c,v 1.56 202
>  #include <unistd.h>
>  
>  #include "shell.h"
> +#include "syntax.h"
>  #include "options.h"
>  #include "var.h"
>  #include "input.h"           /* for whichprompt */
> @@ -263,6 +264,13 @@ readcmd(int argc, char **argv)
>  #else
>                     "Usage: read [-br] [-d C] [-n len] [-p prompt] var...");
>  
> +     while (*ap != NULL) {
> +             if (!validname(*ap, '\0', NULL))
> +                     error("'%s': invalid variable name", *ap);
> +             ap++;
> +     }
> +     ap = argptr;
> +
>       (void)next_read_char(0, 0);     /* make sure the buffer is empty */
>  #endif
>  
> @@ -478,7 +486,7 @@ umaskcmd(int argc, char **argv)
>                       out1fmt("%.4o\n", mask);
>               }
>       } else {
> -             if (isdigit((unsigned char)*ap)) {
> +             if (is_digit(*ap)) {
>                       int range = 0;
>  
>                       mask = 0;
>

-- 
Ryo ONODERA // r...@tetera.org
PGP fingerprint = 82A2 DC91 76E0 A10A 8ABB  FD1B F404 27FA C7D1 15F3

Reply via email to