]> git.cameronkatri.com Git - mandoc.git/blobdiff - read.c
Protect the roff parser from dividing by zero. ok schwarze@
[mandoc.git] / read.c
diff --git a/read.c b/read.c
index 2b67ace10345be191971d650123c306399a3a668..6c042e3f628fd534ad01eb6b6f172a66837346a5 100644 (file)
--- a/read.c
+++ b/read.c
@@ -1,4 +1,4 @@
-/*     $Id: read.c,v 1.85 2014/09/07 02:17:40 schwarze Exp $ */
+/*     $Id: read.c,v 1.92 2014/10/20 19:04:45 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010-2014 Ingo Schwarze <schwarze@openbsd.org>
@@ -117,6 +117,9 @@ static      const char * const      mandocerrs[MANDOCERR_MAX] = {
        "sections out of conventional order",
        "duplicate section title",
        "unexpected section",
+       "unusual Xr order",
+       "unusual Xr punctuation",
+       "AUTHORS section without An macro",
 
        /* related to macros and nesting */
        "obsolete macro",
@@ -146,6 +149,7 @@ static      const char * const      mandocerrs[MANDOCERR_MAX] = {
        "missing font type, using \\fR",
        "unknown font type, using \\fR",
        "missing -std argument, adding it",
+       "missing eqn box, using \"\"",
 
        /* related to bad macro arguments */
        "unterminated quoted argument",
@@ -155,6 +159,8 @@ static      const char * const      mandocerrs[MANDOCERR_MAX] = {
        "skipping duplicate list type",
        "skipping -width argument",
        "unknown AT&T UNIX version",
+       "comma in function argument",
+       "parenthesis in function name",
        "invalid content in Rs block",
        "invalid Boolean argument",
        "unknown font, skipping request",
@@ -174,7 +180,6 @@ static      const char * const      mandocerrs[MANDOCERR_MAX] = {
        "equation scope open on exit",
        "overlapping equation scopes",
        "unexpected end of equation",
-       "equation syntax error",
 
        /* related to tables */
        "bad table syntax",
@@ -206,6 +211,7 @@ static      const char * const      mandocerrs[MANDOCERR_MAX] = {
        "skipping request without numeric argument",
        "skipping all arguments",
        "skipping excess arguments",
+       "divide by zero",
 
        "generic fatal error",
 
@@ -763,7 +769,7 @@ mparse_readfd(struct mparse *curp, int fd, const char *file)
                        (*curp->mmsg)(MANDOCERR_SYSOPEN,
                            curp->file_status,
                            file, 0, 0, strerror(errno));
-               goto out;
+               return(curp->file_status);
        }
 
        /*
@@ -773,21 +779,19 @@ mparse_readfd(struct mparse *curp, int fd, const char *file)
         * the parse phase for the file.
         */
 
-       if ( ! read_whole_file(curp, file, fd, &blk, &with_mmap))
-               goto out;
-
-       mparse_parse_buffer(curp, blk, file);
-
+       if (read_whole_file(curp, file, fd, &blk, &with_mmap)) {
+               mparse_parse_buffer(curp, blk, file);
 #if HAVE_MMAP
-       if (with_mmap)
-               munmap(blk.buf, blk.sz);
-       else
+               if (with_mmap)
+                       munmap(blk.buf, blk.sz);
+               else
 #endif
-               free(blk.buf);
+                       free(blk.buf);
+       }
 
        if (STDIN_FILENO != fd && -1 == close(fd))
                perror(file);
-out:
+
        return(curp->file_status);
 }