]> git.lizzy.rs Git - plan9front.git/commitdiff
rc: skip arguments to Xsrcline, Xsrcfile in codefree
authorOri Bernstein <ori@eigenstate.org>
Fri, 25 Jun 2021 23:10:07 +0000 (23:10 +0000)
committerOri Bernstein <ori@eigenstate.org>
Fri, 25 Jun 2021 23:10:07 +0000 (23:10 +0000)
We weren't correctly skipping the location operators
in codefree. This would mostly be work, but sometimes
you'd get unlucky and have one of the argmuents mismatch,
and that would lead to an invalid free.

This correctly skips the args in codefree.

sys/src/cmd/rc/code.c

index 89cc431834faf0c071cc765b0fa643cc7fb30e35..8e01429972ecd2cd8c2aeb5b803c6948a3e209ff 100644 (file)
@@ -181,7 +181,7 @@ outcode(tree *t, int eflag)
                        emits(fnstr(c1));
                        if((f = curfile(runq)) != nil){
                                emitf(Xsrcfile);
-                               emits(strdup(f));
+                               emits(estrdup(f));
                        }
                        emitf(Xsrcline);
                        emiti(runq->lexline);
@@ -486,10 +486,11 @@ codefree(code *cp)
                || p->f==Xrdwr
                || p->f==Xasync || p->f==Xbackq || p->f==Xcase || p->f==Xfalse
                || p->f==Xfor || p->f==Xjump
+               || p->f==Xsrcline
                || 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==Xglobs) free(p[1].s), p+=2;
+               else if(p->f==Xglobs || p->f==Xsrcfile) free(p[1].s), p+=2;
                else if(p->f==Xword || p->f==Xdelhere) free((++p)->s);
                else if(p->f==Xfn){
                        free(p[2].s);