Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/bin/sh For now, probably forever, prohibit unquoted $ and ` ...



details:   https://anonhg.NetBSD.org/src/rev/71ff8ec9d974
branches:  trunk
changeset: 942781:71ff8ec9d974
user:      kre <kre%NetBSD.org@localhost>
date:      Wed Aug 19 22:41:47 2020 +0000

description:
For now, probably forever, prohibit unquoted $ and ` in the names of
functions being defined (they can still be included if quoted).

If we parsed the way POSIX specifies (leaving the exact input text of
$ and ` expansions unaltered, until required to be expanded) this would
not be needed, as the name of a function being defined does not underbo
parameter, command, or arith expansions, so xxx$3() { : ; } would just
work.   But for many reasons we don't do that (and are unlikely to ever,
though maintaing both forms might be an option someday) - which led to
very obscure behaviour (if sh were compiled in DEBUG mode, even an abort())
and certainly nothing useful.   So just prohibit these uses for now.
(A portable function name must be a "name" so this makes no difference
at all to posix compat applications/scripts).

A doc update is pending (the updated sh.1 also contains updates in other
areas not yet appropriate to commit).

diffstat:

 bin/sh/parser.c |  16 ++++++++++++++--
 1 files changed, 14 insertions(+), 2 deletions(-)

diffs (37 lines):

diff -r d192f5f2632e -r 71ff8ec9d974 bin/sh/parser.c
--- a/bin/sh/parser.c   Wed Aug 19 15:36:41 2020 +0000
+++ b/bin/sh/parser.c   Wed Aug 19 22:41:47 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: parser.c,v 1.170 2020/05/14 08:34:17 msaitoh Exp $     */
+/*     $NetBSD: parser.c,v 1.171 2020/08/19 22:41:47 kre Exp $ */
 
 /*-
  * Copyright (c) 1991, 1993
@@ -37,7 +37,7 @@
 #if 0
 static char sccsid[] = "@(#)parser.c   8.7 (Berkeley) 5/16/95";
 #else
-__RCSID("$NetBSD: parser.c,v 1.170 2020/05/14 08:34:17 msaitoh Exp $");
+__RCSID("$NetBSD: parser.c,v 1.171 2020/08/19 22:41:47 kre Exp $");
 #endif
 #endif /* not lint */
 
@@ -666,6 +666,18 @@
                        /* We have a function */
                        consumetoken(TRP);
                        funclinno = plinno;
+                       /*
+                        * Make sure there are no unquoted $'s in the
+                        * name (allowing those, not expanding them,
+                        * simply treating '$' as a character, is desireable
+                        * but the parser has converted them to CTLxxx
+                        * chars, and that's not what we want
+                        *
+                        * Fortunately here the user can simply quote
+                        * the name to avoid this restriction.
+                        */
+                       if (!noexpand(n->narg.text))
+                               synerror("Bad function name (use quotes)");
                        rmescapes(n->narg.text);
                        if (strchr(n->narg.text, '/'))
                                synerror("Bad function name");



Home | Main Index | Thread Index | Old Index