From 2025214dfcc46ac16cb93abc05b344330987b339 Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Fri, 31 Dec 2021 23:26:59 +0000 Subject: rc: fix here document handling with quoted end-marker (thanks sigrid) when end marker is quoted, we should not substitute. also, pcmd() needs to print the end marker without quotes. --- sys/src/cmd/rc/code.c | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) (limited to 'sys/src/cmd/rc/code.c') diff --git a/sys/src/cmd/rc/code.c b/sys/src/cmd/rc/code.c index 67c2eb925..f39b3a573 100644 --- a/sys/src/cmd/rc/code.c +++ b/sys/src/cmd/rc/code.c @@ -353,14 +353,10 @@ outcode(tree *t, int eflag) stuffdot(p); break; case REDIR: - emitf(Xmark); - if(t->rtype==HERE){ - /* replace end marker with mktmep() pattern */ - free(c0->str); - c0->str=estrdup("/tmp/here.XXXXXXXXXXX"); - c0->glob=0; + if(t->rtype!=HERE){ + emitf(Xmark); + outcode(c0, eflag); } - outcode(c0, eflag); switch(t->rtype){ case APPEND: emitf(Xappend); @@ -375,7 +371,7 @@ outcode(tree *t, int eflag) emitf(Xrdwr); break; case HERE: - emitf(Xhere); + emitf(c0->quoted?Xhereq:Xhere); emits(t->str); t->str=0; /* passed ownership */ break; @@ -539,7 +535,7 @@ codefree(code *cp) || p->f==Xsubshell || p->f==Xtrue) p++; else if(p->f==Xdup || p->f==Xpipefd) p+=2; else if(p->f==Xpipe) p+=4; - else if(p->f==Xhere) free(p[1].s), p+=2; + else if(p->f==Xhere || p->f==Xhereq) free(p[1].s), p+=2; else if(p->f==Xword) free((++p)->s); else if(p->f==Xfn){ free(p[2].s); -- cgit v1.2.3