]> git.cameronkatri.com Git - mandoc.git/blobdiff - mandocdb.c
do not crash when a tbl(7) cell uses roman font
[mandoc.git] / mandocdb.c
index 6a4e72c955572da6b7a593cba2656ba3b8fe089f..a3360fe44d01a0ddf3d8776aee199a3326b9e527 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: mandocdb.c,v 1.267 2020/04/03 11:35:01 schwarze Exp $ */
+/* $Id: mandocdb.c,v 1.269 2021/08/19 16:55:31 schwarze Exp $ */
 /*
  * Copyright (c) 2011-2020 Ingo Schwarze <schwarze@openbsd.org>
  * Copyright (c) 2011, 2012 Kristaps Dzonsons <kristaps@bsd.lv>
@@ -165,6 +165,9 @@ static      void     putkey(const struct mpage *, char *, uint64_t);
 static void     putkeys(const struct mpage *, char *, size_t, uint64_t);
 static void     putmdockey(const struct mpage *,
                        const struct roff_node *, uint64_t, int);
+#ifdef READ_ALLOWED_PATH
+static int      read_allowed(const char *);
+#endif
 static int      render_string(char **, size_t *);
 static void     say(const char *, const char *, ...)
                        __attribute__((__format__ (__printf__, 2, 3)));
@@ -612,8 +615,8 @@ treescan(void)
                                continue;
                        }
                        if (strncmp(buf, basedir, basedir_len) != 0
-#ifdef HOMEBREWDIR
-                           && strncmp(buf, HOMEBREWDIR, strlen(HOMEBREWDIR))
+#ifdef READ_ALLOWED_PATH
+                           && !read_allowed(buf)
 #endif
                        ) {
                                if (warnings) say("",
@@ -626,6 +629,8 @@ treescan(void)
                                        say(path, "&stat");
                                continue;
                        }
+                       if ((ff->fts_statp->st_mode & S_IFMT) != S_IFREG)
+                               continue;
                        /* FALLTHROUGH */
 
                /*
@@ -823,8 +828,8 @@ filescan(const char *infile)
                start = usefile;
        else if (strncmp(usefile, basedir, basedir_len) == 0)
                start = usefile + basedir_len;
-#ifdef HOMEBREWDIR
-       else if (strncmp(usefile, HOMEBREWDIR, strlen(HOMEBREWDIR)) == 0)
+#ifdef READ_ALLOWED_PATH
+       else if (read_allowed(usefile))
                start = usefile;
 #endif
        else {
@@ -2381,6 +2386,25 @@ set_basedir(const char *targetdir, int report_baddir)
        return 1;
 }
 
+#ifdef READ_ALLOWED_PATH
+static int
+read_allowed(const char *candidate)
+{
+       const char      *cp;
+       size_t           len;
+
+       for (cp = READ_ALLOWED_PATH;; cp += len) {
+               while (*cp == ':')
+                       cp++;
+               if (*cp == '\0')
+                       return 0;
+               len = strcspn(cp, ":");
+               if (strncmp(candidate, cp, len) == 0)
+                       return 1;
+       }
+}
+#endif
+
 static void
 say(const char *file, const char *format, ...)
 {