]> git.cameronkatri.com Git - mandoc.git/blobdiff - manpage.c
Don't dereference NULL pointers when formatting missing denominators,
[mandoc.git] / manpage.c
index 14f87665559f160b480a2335b06eca145d459bed..70eb06b69ceb6b6a9959577b35b56f7a09811352 100644 (file)
--- a/manpage.c
+++ b/manpage.c
@@ -1,6 +1,7 @@
-/*     $Id: manpage.c,v 1.1 2012/06/08 10:44:52 kristaps Exp $ */
+/*     $Id: manpage.c,v 1.9 2014/08/17 03:24:47 schwarze Exp $ */
 /*
  * Copyright (c) 2012 Kristaps Dzonsons <kristaps@bsd.lv>
+ * Copyright (c) 2013 Ingo Schwarze <schwarze@openbsd.org>
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
-#ifdef HAVE_CONFIG_H
 #include "config.h"
-#endif
-#include <sys/param.h>
+
+#include <sys/types.h>
 
 #include <assert.h>
 #include <getopt.h>
+#include <limits.h>
+#include <stdint.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -36,10 +38,10 @@ main(int argc, char *argv[])
 {
        int              ch, term;
        size_t           i, sz, len;
+       struct mansearch search;
        struct manpage  *res;
-       char            *conf_file, *defpaths, *auxpaths, *cp,
-                       *arch, *sec;
-       char             buf[MAXPATHLEN];
+       char            *conf_file, *defpaths, *auxpaths, *cp;
+       char             buf[PATH_MAX];
        const char      *cmd;
        struct manpaths  paths;
        char            *progname;
@@ -54,8 +56,9 @@ main(int argc, char *argv[])
        else
                ++progname;
 
-       auxpaths = defpaths = conf_file = arch = sec = NULL;
+       auxpaths = defpaths = conf_file = NULL;
        memset(&paths, 0, sizeof(struct manpaths));
+       memset(&search, 0, sizeof(struct mansearch));
 
        while (-1 != (ch = getopt(argc, argv, "C:M:m:S:s:")))
                switch (ch) {
@@ -69,10 +72,10 @@ main(int argc, char *argv[])
                        auxpaths = optarg;
                        break;
                case ('S'):
-                       arch = optarg;
+                       search.arch = optarg;
                        break;
                case ('s'):
-                       sec = optarg;
+                       search.sec = optarg;
                        break;
                default:
                        goto usage;
@@ -84,8 +87,11 @@ main(int argc, char *argv[])
        if (0 == argc)
                goto usage;
 
+       search.outkey = "Nd";
+       search.argmode = ARG_EXPR;
+
        manpath_parse(&paths, conf_file, defpaths, auxpaths);
-       ch = mansearch(&paths, arch, sec, argc, argv, &res, &sz);
+       ch = mansearch(&search, &paths, argc, argv, &res, &sz);
        manpath_free(&paths);
 
        if (0 == ch)
@@ -102,11 +108,14 @@ main(int argc, char *argv[])
 
        for (i = 0; i < sz; i++) {
                printf("%6zu  %s: %s\n", 
-                       i + 1, res[i].file, res[i].desc);
-               free(res[i].desc);
+                       i + 1, res[i].names, res[i].output);
+               free(res[i].names);
+               free(res[i].output);
        }
 
        if (0 == term) {
+               for (i = 0; i < sz; i++)
+                       free(res[i].file);
                free(res);
                return(EXIT_SUCCESS);
        }
@@ -123,12 +132,16 @@ main(int argc, char *argv[])
                }
 
        if (0 == i) {
+               for (i = 0; i < sz; i++)
+                       free(res[i].file);
                free(res);
                return(EXIT_SUCCESS);
        }
 show:
        cmd = res[i - 1].form ? "mandoc" : "cat";
-       strlcpy(buf, res[i - 1].file, MAXPATHLEN);
+       strlcpy(buf, res[i - 1].file, PATH_MAX);
+       for (i = 0; i < sz; i++)
+               free(res[i].file);
        free(res);
 
        show(cmd, buf);