From 6ea22d950fd7246c9159a3601819ae23d03e8dcd Mon Sep 17 00:00:00 2001 From: Nicholas Noll Date: Wed, 20 May 2020 12:22:30 -0700 Subject: fix: truncate infinite recursion caused by self referential macros --- sys/cmd/cc/cc.c | 7 ++++--- sys/cmd/cc/cc.h | 2 +- sys/cmd/cc/lex.c | 4 ++-- 3 files changed, 7 insertions(+), 6 deletions(-) (limited to 'sys') diff --git a/sys/cmd/cc/cc.c b/sys/cmd/cc/cc.c index 6338050..00cd4a5 100644 --- a/sys/cmd/cc/cc.c +++ b/sys/cmd/cc/cc.c @@ -130,13 +130,13 @@ openio(byte *path) } Io* -makeio() +makeio(byte *name) { if ((C.io - C.iostk) >= arrlen(C.iostk)-1) panicf("out of I/O space!"); - C.io->path = ""; - C.io->buf = (io·Buffer) { + C.io->path = name; + C.io->buf = (io·Buffer) { .state = bufio·rdr | bufio·end, .runesize = 0, .h = nil, @@ -163,6 +163,7 @@ freeio(Io *io) io->link = nil; io->path = nil; io->store = (Pos){ 0 }; + io->path = ""; } void diff --git a/sys/cmd/cc/cc.h b/sys/cmd/cc/cc.h index 6ed2caa..685dce2 100644 --- a/sys/cmd/cc/cc.h +++ b/sys/cmd/cc/cc.h @@ -388,7 +388,7 @@ struct Io /* cc.c io functions */ Io* openio(byte *path); -Io* makeio(); +Io* makeio(byte *name); void freeio(Io *io); struct StrTab diff --git a/sys/cmd/cc/lex.c b/sys/cmd/cc/lex.c index 8ce4e79..4cc1259 100644 --- a/sys/cmd/cc/lex.c +++ b/sys/cmd/cc/lex.c @@ -635,8 +635,8 @@ Dispatch: } sym = lookup(&lx->sym, tok.val.s); - if (sym) { - io = makeio(); + if (sym && ((uintptr)sym->name != (uintptr)lx->io->path)) { + io = makeio(sym->name); printf("EXPANDING MACRO %s\n", sym->name); io->buf.end += expandmacro(lx, sym, io->b); *io->buf.end++ = EOF; -- cgit v1.2.1