Module Name: src Committed By: kre Date: Thu Feb 13 05:19:05 UTC 2020
Modified Files: src/bin/sh: expand.c expand.h Log Message: 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 To generate a diff of this commit: cvs rdiff -u -r1.136 -r1.137 src/bin/sh/expand.c cvs rdiff -u -r1.24 -r1.25 src/bin/sh/expand.h 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/expand.c diff -u src/bin/sh/expand.c:1.136 src/bin/sh/expand.c:1.137 --- src/bin/sh/expand.c:1.136 Mon Oct 14 13:34:14 2019 +++ src/bin/sh/expand.c Thu Feb 13 05:19:05 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: expand.c,v 1.136 2019/10/14 13:34:14 christos Exp $ */ +/* $NetBSD: expand.c,v 1.137 2020/02/13 05:19:05 kre 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.136 2019/10/14 13:34:14 christos Exp $"); +__RCSID("$NetBSD: expand.c,v 1.137 2020/02/13 05:19:05 kre 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); } @@ -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); @@ -2037,9 +2039,11 @@ patmatch(const char *pattern, const char /* * 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; @@ -2047,7 +2051,7 @@ rmescapes(char *str) p = str; while (!ISCTL(*p)) { if (*p++ == '\0') - return; + return ((int)(p - str) - 1); } q = p; while (*p) { @@ -2069,6 +2073,8 @@ rmescapes(char *str) *q++ = *p++; } *q = '\0'; + + return ((int)(q - str)); } /* Index: src/bin/sh/expand.h diff -u src/bin/sh/expand.h:1.24 src/bin/sh/expand.h:1.25 --- src/bin/sh/expand.h:1.24 Sun Nov 18 17:23:37 2018 +++ src/bin/sh/expand.h Thu Feb 13 05:19:05 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: expand.h,v 1.24 2018/11/18 17:23:37 kre Exp $ */ +/* $NetBSD: expand.h,v 1.25 2020/02/13 05:19:05 kre 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 *);