=================================================================== RCS file: /cvs/mandoc/main.c,v retrieving revision 1.358 retrieving revision 1.361 diff -u -p -r1.358 -r1.361 --- mandoc/main.c 2021/09/04 22:38:46 1.358 +++ mandoc/main.c 2022/04/14 16:43:43 1.361 @@ -1,4 +1,4 @@ -/* $Id: main.c,v 1.358 2021/09/04 22:38:46 schwarze Exp $ */ +/* $Id: main.c,v 1.361 2022/04/14 16:43:43 schwarze Exp $ */ /* * Copyright (c) 2010-2012, 2014-2021 Ingo Schwarze * Copyright (c) 2008-2012 Kristaps Dzonsons @@ -149,11 +149,14 @@ main(int argc, char *argv[]) enum mandoc_os os_e; /* Check base system conventions. */ enum outmode outmode; /* According to command line. */ +#if DEBUG_MEMORY + mandoc_dbg_init(argc, argv); +#endif #if HAVE_PROGNAME progname = getprogname(); #else if (argc < 1) - progname = mandoc_strdup("mandoc"); + progname = "mandoc"; else if ((progname = strrchr(argv[0], '/')) == NULL) progname = argv[0]; else @@ -516,6 +519,9 @@ main(int argc, char *argv[]) memcpy(res + ressz, resn, sizeof(*resn) * resnsz); ressz += resnsz; + free(resn); + resn = NULL; + resnsz = 0; continue; } @@ -554,6 +560,10 @@ main(int argc, char *argv[]) res = mandoc_reallocarray(res, ressz + 1, sizeof(*res)); memcpy(res + ressz++, resn + ib, sizeof(*resn)); + memset(resn + ib, 0, sizeof(*resn)); + mansearch_free(resn, resnsz); + resn = NULL; + resnsz = 0; } /* apropos(1), whatis(1): Process the full search expression. */ @@ -664,6 +674,9 @@ out: } else if (outst.had_output && outst.outtype != OUTT_LINT) mandoc_msg_summary(); +#if DEBUG_MEMORY + mandoc_dbg_finish(); +#endif return (int)mandoc_msg_getrc(); } @@ -1279,6 +1292,7 @@ spawn_pager(struct outstate *outst, char *tag_target) char *argv[MAX_PAGER_ARGS]; const char *pager; char *cp; + size_t wordlen; #if HAVE_LESS_T size_t cmdlen; #endif @@ -1293,7 +1307,6 @@ spawn_pager(struct outstate *outst, char *tag_target) pager = getenv("PAGER"); if (pager == NULL || *pager == '\0') pager = BINM_PAGER; - cp = mandoc_strdup(pager); /* * Parse the pager command into words. @@ -1301,16 +1314,12 @@ spawn_pager(struct outstate *outst, char *tag_target) */ 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. */ @@ -1322,10 +1331,10 @@ spawn_pager(struct outstate *outst, char *tag_target) 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; } } @@ -1336,7 +1345,7 @@ spawn_pager(struct outstate *outst, char *tag_target) 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; @@ -1348,6 +1357,8 @@ spawn_pager(struct outstate *outst, char *tag_target) case 0: break; default: + while (argc > 0) + free(argv[--argc]); (void)setpgid(pager_pid, 0); (void)tcsetpgrp(STDOUT_FILENO, pager_pid); #if HAVE_PLEDGE