]> git.cameronkatri.com Git - mandoc.git/blobdiff - cgi.c
Pledge man.cgi(8).
[mandoc.git] / cgi.c
diff --git a/cgi.c b/cgi.c
index 0ab736b884f8e719e2950661150a533a99da9d3f..af56da2701e90c3f6fa34a50d527f2df1a45d6c8 100644 (file)
--- a/cgi.c
+++ b/cgi.c
@@ -1,4 +1,4 @@
-/*     $Id: cgi.c,v 1.143 2017/01/19 13:55:56 schwarze Exp $ */
+/*     $Id: cgi.c,v 1.148 2017/02/22 16:20:01 schwarze Exp $ */
 /*
  * Copyright (c) 2011, 2012 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2014, 2015, 2016, 2017 Ingo Schwarze <schwarze@usta.de>
@@ -21,7 +21,9 @@
 #include <sys/time.h>
 
 #include <ctype.h>
+#if HAVE_ERR
 #include <err.h>
+#endif
 #include <errno.h>
 #include <fcntl.h>
 #include <limits.h>
@@ -113,7 +115,7 @@ static      const char *const sec_names[] = {
 static const int sec_MAX = sizeof(sec_names) / sizeof(char *);
 
 static const char *const arch_names[] = {
-    "amd64",       "alpha",       "armv7",
+    "amd64",       "alpha",       "armv7",     "arm64",
     "hppa",        "i386",        "landisk",
     "loongson",    "luna88k",     "macppc",      "mips64",
     "octeon",      "sgi",         "socppc",      "sparc64",
@@ -494,9 +496,9 @@ pg_index(const struct req *req)
        resp_searchform(req, FOCUS_QUERY);
        printf("<p>\n"
               "This web interface is documented in the\n"
-              "<a href=\"/%s%sman.cgi.8\">man.cgi(8)</a>\n"
+              "<a class=\"Xr\" href=\"/%s%sman.cgi.8\">man.cgi(8)</a>\n"
               "manual, and the\n"
-              "<a href=\"/%s%sapropos.1\">apropos(1)</a>\n"
+              "<a class=\"Xr\" href=\"/%s%sapropos.1\">apropos(1)</a>\n"
               "manual explains the query syntax.\n"
               "</p>\n",
               scriptname, *scriptname == '\0' ? "" : "/",
@@ -576,26 +578,21 @@ pg_searchres(const struct req *req, struct manpage *r, size_t sz)
            req->q.equal || sz == 1 ? FOCUS_NONE : FOCUS_QUERY);
 
        if (sz > 1) {
-               puts("<div class=\"results\">");
-               puts("<table>");
-
+               puts("<table class=\"results\">");
                for (i = 0; i < sz; i++) {
                        printf("  <tr>\n"
-                              "    <td class=\"title\">"
-                              "<a href=\"/%s%s%s/%s",
+                              "    <td>"
+                              "<a class=\"Xr\" href=\"/%s%s%s/%s\">",
                            scriptname, *scriptname == '\0' ? "" : "/",
                            req->q.manpath, r[i].file);
-                       printf("\">");
                        html_print(r[i].names);
                        printf("</a></td>\n"
-                              "    <td class=\"desc\">");
+                              "    <td><span class=\"Nd\">");
                        html_print(r[i].output);
-                       puts("</td>\n"
+                       puts("</span></td>\n"
                             "  </tr>");
                }
-
-               puts("</table>\n"
-                    "</div>");
+               puts("</table>");
        }
 
        /*
@@ -804,6 +801,7 @@ resp_format(const struct req *req, const char *file)
 
        memset(&conf, 0, sizeof(conf));
        conf.fragment = 1;
+       conf.style = mandoc_strdup(CSS_DIR "/mandoc.css");
        usepath = strcmp(req->q.manpath, req->p[0]);
        mandoc_asprintf(&conf.man, "/%s%s%%N.%%S",
            usepath ? req->q.manpath : "", usepath ? "/" : "");
@@ -831,6 +829,7 @@ resp_format(const struct req *req, const char *file)
        mparse_free(mp);
        mchars_free();
        free(conf.man);
+       free(conf.style);
 }
 
 static void
@@ -979,6 +978,22 @@ main(void)
        const char      *querystring;
        int              i;
 
+#if HAVE_PLEDGE
+       /*
+        * The "rpath" pledge could be revoked after mparse_readfd()
+        * if the file desciptor to "/footer.html" would be opened
+        * up front, but it's probably not worth the complication
+        * of the code it would cause: it would require scattering
+        * pledge() calls in multiple low-level resp_*() functions.
+        */
+
+       if (pledge("stdio rpath", NULL) == -1) {
+               warn("pledge");
+               pg_error_internal();
+               return EXIT_FAILURE;
+       }
+#endif
+
        /* Poor man's ReDoS mitigation. */
 
        itimer.it_value.tv_sec = 2;