]> git.cameronkatri.com Git - mandoc.git/commitdiff
downgrade ".so with absolute path" from FATAL to ERROR;
authorIngo Schwarze <schwarze@openbsd.org>
Wed, 14 Jan 2015 22:58:16 +0000 (22:58 +0000)
committerIngo Schwarze <schwarze@openbsd.org>
Wed, 14 Jan 2015 22:58:16 +0000 (22:58 +0000)
allows to get rid of ROFF_ERR

libmandoc.h
mandoc.h
read.c
roff.c

index e4a25ba40de86a3d8bd4240a95a268e3466d24ed..a8de450050d4534961af439c801dabe11af0fd0e 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: libmandoc.h,v 1.53 2014/12/28 14:42:27 schwarze Exp $ */
+/*     $Id: libmandoc.h,v 1.54 2015/01/14 22:58:16 schwarze Exp $ */
 /*
  * Copyright (c) 2009, 2010, 2011, 2012 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2013, 2014 Ingo Schwarze <schwarze@openbsd.org>
@@ -24,8 +24,7 @@ enum  rofferr {
        ROFF_SO, /* include another file */
        ROFF_IGN, /* ignore current line */
        ROFF_TBL, /* a table row was successfully parsed */
-       ROFF_EQN, /* an equation was successfully parsed */
-       ROFF_ERR /* badness: puke and stop */
+       ROFF_EQN /* an equation was successfully parsed */
 };
 
 struct buf {
index 74a4fb8ab19f158089e9cef8cada3d9683af413a..b7db22720798cacfa0fcd085a1503d5d81f98e25 100644 (file)
--- a/mandoc.h
+++ b/mandoc.h
@@ -1,4 +1,4 @@
-/*     $Id: mandoc.h,v 1.179 2015/01/14 22:02:50 schwarze Exp $ */
+/*     $Id: mandoc.h,v 1.180 2015/01/14 22:58:16 schwarze Exp $ */
 /*
  * Copyright (c) 2010, 2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010-2014 Ingo Schwarze <schwarze@openbsd.org>
@@ -166,6 +166,7 @@ enum        mandocerr {
        MANDOCERR_OS_UNAME, /* uname(3) system call failed, using UNKNOWN */
        MANDOCERR_ST_BAD, /* unknown standard specifier: St standard */
        MANDOCERR_IT_NONUM, /* skipping request without numeric argument */
+       MANDOCERR_SO_PATH, /* NOT IMPLEMENTED: .so with absolute path or ".." */
        MANDOCERR_ARG_SKIP, /* skipping all arguments: macro args */
        MANDOCERR_ARG_EXCESS, /* skipping excess arguments: macro ... args */
        MANDOCERR_DIVZERO, /* divide by zero */
@@ -173,7 +174,6 @@ enum        mandocerr {
        MANDOCERR_FATAL, /* ===== start of fatal errors ===== */
 
        MANDOCERR_TOOLARGE, /* input too large */
-       MANDOCERR_SO_PATH, /* NOT IMPLEMENTED: .so with absolute path or ".." */
        MANDOCERR_SO_FAIL, /* .so request failed */
 
        MANDOCERR_MAX
diff --git a/read.c b/read.c
index 8bf74c4813ff6692b56da460158c155d6bfe08cf..821ca89e1ef814c700c76d6f46f3c983b96332f8 100644 (file)
--- a/read.c
+++ b/read.c
@@ -1,4 +1,4 @@
-/*     $Id: read.c,v 1.108 2015/01/14 22:02:50 schwarze Exp $ */
+/*     $Id: read.c,v 1.109 2015/01/14 22:58:16 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010-2015 Ingo Schwarze <schwarze@openbsd.org>
@@ -210,6 +210,7 @@ static      const char * const      mandocerrs[MANDOCERR_MAX] = {
        "uname(3) system call failed, using UNKNOWN",
        "unknown standard specifier",
        "skipping request without numeric argument",
+       "NOT IMPLEMENTED: .so with absolute path or \"..\"",
        "skipping all arguments",
        "skipping excess arguments",
        "divide by zero",
@@ -217,7 +218,6 @@ static      const char * const      mandocerrs[MANDOCERR_MAX] = {
        "generic fatal error",
 
        "input too large",
-       "NOT IMPLEMENTED: .so with absolute path or \"..\"",
        ".so request failed",
 };
 
@@ -504,9 +504,6 @@ rerun:
                case ROFF_IGN:
                        pos = 0;
                        continue;
-               case ROFF_ERR:
-                       assert(MANDOCLEVEL_FATAL <= curp->file_status);
-                       break;
                case ROFF_SO:
                        if ( ! (curp->options & MPARSE_SO) &&
                            (i >= blk.sz || blk.buf[i] == '\0')) {
diff --git a/roff.c b/roff.c
index ab1cbfeaae8244175c640867f0dc9754bbbc4ea2..8721a6804f7e48fc61325634822ed00c93cac6bd 100644 (file)
--- a/roff.c
+++ b/roff.c
@@ -1,4 +1,4 @@
-/*     $Id: roff.c,v 1.248 2015/01/07 12:19:46 schwarze Exp $ */
+/*     $Id: roff.c,v 1.249 2015/01/14 22:58:16 schwarze Exp $ */
 /*
  * Copyright (c) 2010, 2011, 2012, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010-2015 Ingo Schwarze <schwarze@openbsd.org>
@@ -2103,7 +2103,7 @@ roff_tr(ROFF_ARGS)
 static enum rofferr
 roff_so(ROFF_ARGS)
 {
-       char *name;
+       char *name, *cp;
 
        name = buf->buf + pos;
        mandoc_vmsg(MANDOCERR_SO, r->parse, ln, ppos, "so %s", name);
@@ -2118,7 +2118,12 @@ roff_so(ROFF_ARGS)
        if (*name == '/' || strstr(name, "../") || strstr(name, "/..")) {
                mandoc_vmsg(MANDOCERR_SO_PATH, r->parse, ln, ppos,
                    ".so %s", name);
-               return(ROFF_ERR);
+               buf->sz = mandoc_asprintf(&cp,
+                   ".sp\nSee the file %s.\n.sp", name) + 1;
+               free(buf->buf);
+               buf->buf = cp;
+               *offs = 0;
+               return(ROFF_REPARSE);
        }
 
        *offs = pos;