]> git.cameronkatri.com Git - mandoc.git/blobdiff - main.c
Plan9 has a man(7) implementation that looks extremely archaic,
[mandoc.git] / main.c
diff --git a/main.c b/main.c
index 5468bbc7260723932e70cb2809482ecc32cc3604..5e5080cca4c45b9d69e8b75e2de85ced0df086e1 100644 (file)
--- a/main.c
+++ b/main.c
@@ -1,4 +1,4 @@
-/*     $Id: main.c,v 1.121 2010/12/06 16:55:35 kristaps Exp $ */
+/*     $Id: main.c,v 1.127 2010/12/29 14:38:14 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010 Ingo Schwarze <schwarze@openbsd.org>
@@ -41,6 +41,7 @@
 #define        MAP_FILE        0
 #endif
 
+#define        REPARSE_LIMIT   1000
 #define        UNCONST(a)      ((void *)(uintptr_t)(const void *)(a))
 
 /* FIXME: Intel's compiler?  LLVM?  pcc?  */
@@ -89,6 +90,7 @@ struct        curparse {
        struct mdoc      *mdoc;         /* mdoc parser */
        struct roff      *roff;         /* roff parser (!NULL) */
        struct regset     regs;         /* roff registers */
+       int               reparse_count; /* finite interpolation stack */
        enum outt         outtype;      /* which output to use */
        out_mdoc          outmdoc;      /* mdoc output ptr */
        out_man           outman;       /* man output ptr */
@@ -177,6 +179,11 @@ static     const char * const      mandocerrs[MANDOCERR_MAX] = {
 
        "generic error",
 
+       "bad table syntax",
+       "bad table option",
+       "bad table layout",
+       "no table layout cells specified",
+       "input stack limit exceeded, infinite loop?",
        "skipping bad character",
        "skipping text before the first section header",
        "skipping unknown macro",
@@ -386,7 +393,7 @@ static void
 resize_buf(struct buf *buf, size_t initial)
 {
 
-       buf->sz = buf->sz ? 2 * buf->sz : initial;
+       buf->sz = buf->sz > initial/2 ? 2 * buf->sz : initial;
        buf->buf = realloc(buf->buf, buf->sz);
        if (NULL == buf->buf) {
                perror(NULL);
@@ -665,8 +672,10 @@ parsebuf(struct curparse *curp, struct buf blk, int start)
                if (0 == pos && '\0' == blk.buf[i])
                        break;
 
-               if (start)
+               if (start) {
                        curp->line = lnn;
+                       curp->reparse_count = 0;
+               }
 
                while (i < (int)blk.sz && (start || '\0' != blk.buf[i])) {
                        if ('\n' == blk.buf[i]) {
@@ -765,7 +774,11 @@ rerun:
 
                switch (rr) {
                case (ROFF_REPARSE):
-                       parsebuf(curp, ln, 0);
+                       if (REPARSE_LIMIT >= ++curp->reparse_count)
+                               parsebuf(curp, ln, 0);
+                       else
+                               mmsg(MANDOCERR_ROFFLOOP, curp, 
+                                   curp->line, pos, NULL);
                        pos = 0;
                        continue;
                case (ROFF_APPEND):