summaryrefslogtreecommitdiff
path: root/bin
diff options
context:
space:
mode:
authormartin <martin@NetBSD.org>2020-06-07 12:50:17 +0000
committermartin <martin@NetBSD.org>2020-06-07 12:50:17 +0000
commita575c0603cb128742ceaca1e02a1e95395cf35fd (patch)
tree4c314bbe5325c17c046354bc0a2480fc21151ea2 /bin
parentc066b312cb9285863f78609a58f1188796297eff (diff)
Pull up following revision(s) (requested by kre in ticket #940):
bin/sh/expand.h: revision 1.25 bin/sh/expand.c: revision 1.134 bin/sh/expand.c: revision 1.135 bin/sh/expand.c: revision 1.136 bin/sh/expand.c: revision 1.137 Remove a (completely harmless) duplicate assignment introduced in a code merge from FreeBSD in 2017. NFC. Pointed out by Roland Illig. prevent sign extension from making expression always false. remove masking and cast (requested by kre@) When expanding a here-doc (NXHERE - the type with an unquoted end delim) the output will not be further processed (at all) so there is no need to escape magic chars in the output, and doing so leaves stray CTLESC chars in the here doc text. Not good. So don't do that... To save a strlen() of the result, to determine the size of the here doc, make rmescapes() return the length of the resulting string (this isn't needed for other uses, so didn't happen previously). Reported on current-users@ (2020-02-06) by Jun Ebihara XXX pullup -9
Diffstat (limited to 'bin')
-rw-r--r--bin/sh/expand.c23
-rw-r--r--bin/sh/expand.h4
2 files changed, 16 insertions, 11 deletions
diff --git a/bin/sh/expand.c b/bin/sh/expand.c
index ae0d949145a..0e51d5e00ae 100644
--- a/bin/sh/expand.c
+++ b/bin/sh/expand.c
@@ -1,4 +1,4 @@
-/* $NetBSD: expand.c,v 1.132.2.1 2019/11/24 08:24:06 martin Exp $ */
+/* $NetBSD: expand.c,v 1.132.2.2 2020/06/07 12:50:17 martin Exp $ */
/*-
* Copyright (c) 1991, 1993
@@ -37,7 +37,7 @@
#if 0
static char sccsid[] = "@(#)expand.c 8.5 (Berkeley) 5/15/95";
#else
-__RCSID("$NetBSD: expand.c,v 1.132.2.1 2019/11/24 08:24:06 martin Exp $");
+__RCSID("$NetBSD: expand.c,v 1.132.2.2 2020/06/07 12:50:17 martin Exp $");
#endif
#endif /* not lint */
@@ -146,10 +146,12 @@ STATIC void rmescapes_nl(char *);
void
expandhere(union node *arg, int fd)
{
+ int len;
herefd = fd;
expandarg(arg, NULL, 0);
- xwrite(fd, stackblock(), expdest - stackblock());
+ len = rmescapes(stackblock());
+ xwrite(fd, stackblock(), len);
}
@@ -268,12 +270,12 @@ argstr(const char *p, int flag)
return p - 1;
case CTLENDVAR: /* end of expanding yyy in ${xxx-yyy} */
case CTLENDARI: /* end of a $(( )) string */
- if (had_dol_at && (*p&0xFF) == CTLQUOTEEND)
+ if (had_dol_at && *p == CTLQUOTEEND)
p++;
NULLTERM_4_TRACE(expdest);
VTRACE(DBG_EXPAND, ("argstr returning at \"%.6s\"..."
" after %2.2X; added \"%s\" to expdest\n",
- p, (c&0xff), stackblock()));
+ p, (c & 0xff), stackblock()));
return p;
case CTLQUOTEMARK:
/* "$@" syntax adherence hack */
@@ -307,7 +309,7 @@ argstr(const char *p, int flag)
had_dol_at = 0;
break;
case CTLESC:
- if (quotes || ISCTL(*p))
+ if ((quotes || ISCTL(*p)))
STPUTC(c, expdest);
c = *p++;
STPUTC(c, expdest);
@@ -1955,7 +1957,6 @@ patmatch(const char *pattern, const char *string, int squoted)
}
/* end shortcut */
- invert = 0;
savep = p, saveq = q;
invert = 0;
if (*p == '!' || *p == '^') {
@@ -2038,9 +2039,11 @@ patmatch(const char *pattern, const char *string, int squoted)
/*
* Remove any CTLESC or CTLNONL characters from a string.
+ *
+ * String is modified in place, and we return the length of the result
*/
-void
+int
rmescapes(char *str)
{
char *p, *q;
@@ -2048,7 +2051,7 @@ rmescapes(char *str)
p = str;
while (!ISCTL(*p)) {
if (*p++ == '\0')
- return;
+ return ((int)(p - str) - 1);
}
q = p;
while (*p) {
@@ -2070,6 +2073,8 @@ rmescapes(char *str)
*q++ = *p++;
}
*q = '\0';
+
+ return ((int)(q - str));
}
/*
diff --git a/bin/sh/expand.h b/bin/sh/expand.h
index d435fd820a5..abf34a56204 100644
--- a/bin/sh/expand.h
+++ b/bin/sh/expand.h
@@ -1,4 +1,4 @@
-/* $NetBSD: expand.h,v 1.24 2018/11/18 17:23:37 kre Exp $ */
+/* $NetBSD: expand.h,v 1.24.2.1 2020/06/07 12:50:17 martin Exp $ */
/*-
* Copyright (c) 1991, 1993
@@ -67,5 +67,5 @@ union node;
void expandhere(union node *, int);
void expandarg(union node *, struct arglist *, int);
-void rmescapes(char *);
+int rmescapes(char *);
int casematch(union node *, char *);