From 888caeec3c86c73e63b9ca3f81b39f468197aeec Mon Sep 17 00:00:00 2001 From: schwarze Date: Mon, 4 Oct 2021 18:56:24 +0000 Subject: [PATCH] Provide a cleanup function for the term_tab module, freeing memory and resetting the internal state to the initial state. Call this function from the proper place in term_free(). With the way the module is currently used, this does not imply any functional change, but doing proper cleanup is more robust, makes it easier during code review to understand what is going on, and makes it explicit that there is no memory leak. --- usr.bin/mandoc/term.c | 5 +++-- usr.bin/mandoc/term.h | 3 ++- usr.bin/mandoc/term_tab.c | 24 +++++++++++++++++------- 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/usr.bin/mandoc/term.c b/usr.bin/mandoc/term.c index 219c6db7509..2be4eb4aec9 100644 --- a/usr.bin/mandoc/term.c +++ b/usr.bin/mandoc/term.c @@ -1,7 +1,7 @@ -/* $OpenBSD: term.c,v 1.143 2021/08/10 12:36:42 schwarze Exp $ */ +/* $OpenBSD: term.c,v 1.144 2021/10/04 18:56:24 schwarze Exp $ */ /* + * Copyright (c) 2010-2021 Ingo Schwarze * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons - * Copyright (c) 2010-2020 Ingo Schwarze * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -56,6 +56,7 @@ term_setcol(struct termp *p, size_t maxtcol) void term_free(struct termp *p) { + term_tab_free(); for (p->tcol = p->tcols; p->tcol < p->tcols + p->maxtcol; p->tcol++) free(p->tcol->buf); free(p->tcols); diff --git a/usr.bin/mandoc/term.h b/usr.bin/mandoc/term.h index 525aa3f2d1a..deba9352979 100644 --- a/usr.bin/mandoc/term.h +++ b/usr.bin/mandoc/term.h @@ -1,4 +1,4 @@ -/* $OpenBSD: term.h,v 1.75 2019/01/04 03:20:44 schwarze Exp $ */ +/* $OpenBSD: term.h,v 1.76 2021/10/04 18:56:24 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons * Copyright (c) 2011-2015, 2017, 2019 Ingo Schwarze @@ -150,6 +150,7 @@ size_t term_len(const struct termp *, size_t); void term_tab_set(const struct termp *, const char *); void term_tab_iset(size_t); size_t term_tab_next(size_t); +void term_tab_free(void); void term_fontpush(struct termp *, enum termfont); void term_fontpop(struct termp *); diff --git a/usr.bin/mandoc/term_tab.c b/usr.bin/mandoc/term_tab.c index 0c80c72563c..160a014592f 100644 --- a/usr.bin/mandoc/term_tab.c +++ b/usr.bin/mandoc/term_tab.c @@ -1,6 +1,6 @@ -/* $OpenBSD: term_tab.c,v 1.4 2017/06/17 14:55:02 schwarze Exp $ */ +/* $OpenBSD: term_tab.c,v 1.5 2021/10/04 18:56:24 schwarze Exp $ */ /* - * Copyright (c) 2017 Ingo Schwarze + * Copyright (c) 2017, 2021 Ingo Schwarze * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -17,6 +17,8 @@ #include #include +#include +#include #include "mandoc_aux.h" #include "out.h" @@ -31,6 +33,7 @@ struct tablist { static struct { struct tablist a; /* All tab positions for lookup. */ struct tablist p; /* Periodic tab positions to add. */ + struct tablist *r; /* Tablist currently being recorded. */ size_t d; /* Default tab width in units of n. */ } tabs; @@ -38,8 +41,6 @@ static struct { void term_tab_set(const struct termp *p, const char *arg) { - static int recording_period; - struct roffsu su; struct tablist *tl; size_t pos; @@ -49,7 +50,7 @@ term_tab_set(const struct termp *p, const char *arg) if (arg == NULL) { tabs.a.n = tabs.p.n = 0; - recording_period = 0; + tabs.r = &tabs.a; if (tabs.d == 0) { a2roffsu(".8i", &su, SCALE_IN); tabs.d = term_hen(p, &su); @@ -57,7 +58,7 @@ term_tab_set(const struct termp *p, const char *arg) return; } if (arg[0] == 'T' && arg[1] == '\0') { - recording_period = 1; + tabs.r = &tabs.p; return; } @@ -73,7 +74,7 @@ term_tab_set(const struct termp *p, const char *arg) /* Select the list, and extend it if it is full. */ - tl = recording_period ? &tabs.p : &tabs.a; + tl = tabs.r; if (tl->n >= tl->s) { tl->s += 8; tl->t = mandoc_reallocarray(tl->t, tl->s, sizeof(*tl->t)); @@ -126,3 +127,12 @@ term_tab_next(size_t prev) return tabs.a.t[i]; } } + +void +term_tab_free(void) +{ + free(tabs.a.t); + free(tabs.p.t); + memset(&tabs, 0, sizeof(tabs)); + tabs.r = &tabs.a; +} -- 2.20.1