From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham autolearn_force=no version=3.4.4 Received: (qmail 27853 invoked from network); 4 Oct 2021 21:29:50 -0000 Received: from bsd.lv (HELO mandoc.bsd.lv) (66.111.2.12) by inbox.vuxu.org with ESMTPUTF8; 4 Oct 2021 21:29:50 -0000 Received: from fantadrom.bsd.lv (localhost [127.0.0.1]) by mandoc.bsd.lv (OpenSMTPD) with ESMTP id 407964e6 for ; Mon, 4 Oct 2021 16:29:48 -0500 (EST) Received: from localhost (mandoc.bsd.lv [local]) by mandoc.bsd.lv (OpenSMTPD) with ESMTPA id 421c2f91 for ; Mon, 4 Oct 2021 16:29:48 -0500 (EST) Date: Mon, 4 Oct 2021 16:29:48 -0500 (EST) X-Mailinglist: mandoc-source Reply-To: source@mandoc.bsd.lv MIME-Version: 1.0 From: schwarze@mandoc.bsd.lv To: source@mandoc.bsd.lv Subject: mandoc: Clean up memory handling in spawn_pager(), free(3)ing everything X-Mailer: activitymail 1.26, http://search.cpan.org/dist/activitymail/ Content-Type: text/plain; charset=utf-8 Message-ID: Log Message: ----------- Clean up memory handling in spawn_pager(), free(3)ing everything that is malloc(3)ed. In addition to being less confusing, the new code is also shorter by two lines. Modified Files: -------------- mandoc: main.c Revision Data ------------- Index: main.c =================================================================== RCS file: /home/cvs/mandoc/mandoc/main.c,v retrieving revision 1.359 retrieving revision 1.360 diff -Lmain.c -Lmain.c -u -p -r1.359 -r1.360 --- main.c +++ main.c @@ -1286,6 +1286,7 @@ spawn_pager(struct outstate *outst, char char *argv[MAX_PAGER_ARGS]; const char *pager; char *cp; + size_t wordlen; #if HAVE_LESS_T size_t cmdlen; #endif @@ -1300,7 +1301,6 @@ spawn_pager(struct outstate *outst, char pager = getenv("PAGER"); if (pager == NULL || *pager == '\0') pager = BINM_PAGER; - cp = mandoc_strdup(pager); /* * Parse the pager command into words. @@ -1308,16 +1308,12 @@ spawn_pager(struct outstate *outst, char */ argc = 0; - while (argc + 5 < MAX_PAGER_ARGS) { - argv[argc++] = cp; - cp = strchr(cp, ' '); - if (cp == NULL) - break; - *cp++ = '\0'; - while (*cp == ' ') - cp++; - if (*cp == '\0') - break; + while (*pager != '\0' && argc + 5 < MAX_PAGER_ARGS) { + wordlen = strcspn(pager, " "); + argv[argc++] = mandoc_strndup(pager, wordlen); + pager += wordlen; + while (*pager == ' ') + pager++; } /* For less(1), use the tag file. */ @@ -1329,10 +1325,10 @@ spawn_pager(struct outstate *outst, char cp = argv[0] + cmdlen - 4; if (strcmp(cp, "less") == 0) { argv[argc++] = mandoc_strdup("-T"); - argv[argc++] = outst->tag_files->tfn; + argv[argc++] = mandoc_strdup(outst->tag_files->tfn); if (tag_target != NULL) { argv[argc++] = mandoc_strdup("-t"); - argv[argc++] = tag_target; + argv[argc++] = mandoc_strdup(tag_target); use_ofn = 0; } } @@ -1343,7 +1339,7 @@ spawn_pager(struct outstate *outst, char mandoc_asprintf(&argv[argc], "file://%s#%s", outst->tag_files->ofn, tag_target); else - argv[argc] = outst->tag_files->ofn; + argv[argc] = mandoc_strdup(outst->tag_files->ofn); argc++; } argv[argc] = NULL; @@ -1355,6 +1351,8 @@ spawn_pager(struct outstate *outst, char case 0: break; default: + while (argc > 0) + free(argv[--argc]); (void)setpgid(pager_pid, 0); (void)tcsetpgrp(STDOUT_FILENO, pager_pid); #if HAVE_PLEDGE -- To unsubscribe send an email to source+unsubscribe@mandoc.bsd.lv