]> git.cameronkatri.com Git - mandoc.git/blobdiff - term_tag.c
do not crash when a tbl(7) cell uses roman font
[mandoc.git] / term_tag.c
index 7895d872ea0e918a0c544e295643c73f6460a53b..c26b942531fc082a2ac62669544e103c4e55c0af 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: term_tag.c,v 1.4 2020/04/18 20:40:10 schwarze Exp $ */
+/* $Id: term_tag.c,v 1.6 2021/03/30 17:16:55 schwarze Exp $ */
 /*
  * Copyright (c) 2015,2016,2018,2019,2020 Ingo Schwarze <schwarze@openbsd.org>
  *
@@ -22,6 +22,7 @@
 #include <sys/types.h>
 
 #include <errno.h>
+#include <fcntl.h>
 #include <signal.h>
 #include <stddef.h>
 #include <stdio.h>
@@ -46,7 +47,8 @@ static struct tag_files tag_files;
  * but for simplicity, create it anyway.
  */
 struct tag_files *
-term_tag_init(void)
+term_tag_init(const char *outfilename, const char *suffix,
+    const char *tagfilename)
 {
        struct sigaction         sa;
        int                      ofd;   /* In /tmp/, dup(2)ed to stdout. */
@@ -83,19 +85,43 @@ term_tag_init(void)
 
        /* Create both temporary output files. */
 
-       (void)strlcpy(tag_files.ofn, "/tmp/man.XXXXXXXXXX",
-           sizeof(tag_files.ofn));
-       (void)strlcpy(tag_files.tfn, "/tmp/man.XXXXXXXXXX",
-           sizeof(tag_files.tfn));
-       if ((ofd = mkstemp(tag_files.ofn)) == -1) {
-               mandoc_msg(MANDOCERR_MKSTEMP, 0, 0,
-                   "%s: %s", tag_files.ofn, strerror(errno));
-               goto fail;
+       if (outfilename == NULL) {
+               (void)snprintf(tag_files.ofn, sizeof(tag_files.ofn),
+                   "/tmp/man.XXXXXXXXXX%s", suffix);
+               if ((ofd = mkstemps(tag_files.ofn, strlen(suffix))) == -1) {
+                       mandoc_msg(MANDOCERR_MKSTEMP, 0, 0,
+                           "%s: %s", tag_files.ofn, strerror(errno));
+                       goto fail;
+               }
+       } else {
+               (void)strlcpy(tag_files.ofn, outfilename,
+                  sizeof(tag_files.ofn));
+               unlink(outfilename);
+               ofd = open(outfilename, O_WRONLY | O_CREAT | O_EXCL, 0644);
+               if (ofd == -1) {
+                       mandoc_msg(MANDOCERR_OPEN, 0, 0,
+                           "%s: %s", outfilename, strerror(errno));
+                       goto fail;
+               }
        }
-       if ((tfd = mkstemp(tag_files.tfn)) == -1) {
-               mandoc_msg(MANDOCERR_MKSTEMP, 0, 0,
-                   "%s: %s", tag_files.tfn, strerror(errno));
-               goto fail;
+       if (tagfilename == NULL) {
+               (void)strlcpy(tag_files.tfn, "/tmp/man.XXXXXXXXXX",
+                   sizeof(tag_files.tfn));
+               if ((tfd = mkstemp(tag_files.tfn)) == -1) {
+                       mandoc_msg(MANDOCERR_MKSTEMP, 0, 0,
+                           "%s: %s", tag_files.tfn, strerror(errno));
+                       goto fail;
+               }
+       } else {
+               (void)strlcpy(tag_files.tfn, tagfilename,
+                   sizeof(tag_files.tfn));
+               unlink(tagfilename);
+               tfd = open(tagfilename, O_WRONLY | O_CREAT | O_EXCL, 0644);
+               if (tfd == -1) {
+                       mandoc_msg(MANDOCERR_OPEN, 0, 0,
+                           "%s: %s", tagfilename, strerror(errno));
+                       goto fail;
+               }
        }
        if ((tag_files.tfs = fdopen(tfd, "w")) == NULL) {
                mandoc_msg(MANDOCERR_FDOPEN, 0, 0, "%s", strerror(errno));
@@ -175,11 +201,11 @@ term_tag_unlink(void)
                    getpgid(tc_pgid) == -1)
                        (void)tcsetpgrp(STDOUT_FILENO, tag_files.tcpgid);
        }
-       if (*tag_files.ofn != '\0') {
+       if (strncmp(tag_files.ofn, "/tmp/man.", 9) == 0) {
                unlink(tag_files.ofn);
                *tag_files.ofn = '\0';
        }
-       if (*tag_files.tfn != '\0') {
+       if (strncmp(tag_files.tfn, "/tmp/man.", 9) == 0) {
                unlink(tag_files.tfn);
                *tag_files.tfn = '\0';
        }