blob: d618030443a242e04e80e0e65a54864f78f3b14b [file] [log] [blame]
https://bugs.gentoo.org/294045
From be095a293e09eae67254f59ce878b1a36233b447 Mon Sep 17 00:00:00 2001
From: wl <wl>
Date: Tue, 24 Nov 2009 13:32:17 +0000
Subject: [PATCH] Fix double frees and memory leaks.
* src/roff/troff/env.cpp (environment::make_tag): Use local object.
* src/roff/troff/input.cpp (input_stack::check_end_diversion): Free
`diversion_state' here.
(interpolate_arg): Fix memory leaks.
* src/roff/troff/mtsm.cpp (mtsm::pop_state): Don't free `sp->state'.
---
ChangeLog | 10 ++++++++++
src/roff/troff/env.cpp | 13 +++++++------
src/roff/troff/input.cpp | 5 +++++
src/roff/troff/mtsm.cpp | 2 --
4 files changed, 22 insertions(+), 8 deletions(-)
diff --git a/src/roff/troff/env.cpp b/src/roff/troff/env.cpp
index 56bfe21..13672cc 100644
--- a/src/roff/troff/env.cpp
+++ b/src/roff/troff/env.cpp
@@ -2213,14 +2213,15 @@ node *environment::make_tag(const char *nm, int i)
*/
if (curdiv == topdiv && topdiv->before_first_page)
topdiv->begin_page();
- macro *m = new macro;
- m->append_str("devtag:");
+
+ macro m;
+ m.append_str("devtag:");
for (const char *p = nm; *p; p++)
if (!invalid_input_char((unsigned char)*p))
- m->append(*p);
- m->append(' ');
- m->append_int(i);
- return new special_node(*m);
+ m.append(*p);
+ m.append(' ');
+ m.append_int(i);
+ return new special_node(m);
}
return 0;
}
diff --git a/src/roff/troff/input.cpp b/src/roff/troff/input.cpp
index 17d2451..7c816e8 100644
--- a/src/roff/troff/input.cpp
+++ b/src/roff/troff/input.cpp
@@ -531,6 +531,8 @@ void input_stack::check_end_diversion(input_iterator *t)
{
if (t->is_diversion) {
div_level--;
+ if (diversion_state)
+ delete diversion_state;
diversion_state = t->diversion_state;
}
}
@@ -4398,6 +4400,7 @@ static void interpolate_arg(symbol nm)
args += c;
if (i != limit)
args += ' ';
+ delete p;
}
if (limit > 0) {
args += '\0';
@@ -4419,6 +4422,7 @@ static void interpolate_arg(symbol nm)
args += '"';
if (i != limit)
args += ' ';
+ delete p;
}
if (limit > 0) {
args += '\0';
@@ -4438,6 +4442,7 @@ static void interpolate_arg(symbol nm)
}
if (input_stack::space_follows_arg(i))
args += ' ';
+ delete p;
}
if (limit > 0) {
args += '\0';
diff --git a/src/roff/troff/mtsm.cpp b/src/roff/troff/mtsm.cpp
index 83a6906..79e2f78 100644
--- a/src/roff/troff/mtsm.cpp
+++ b/src/roff/troff/mtsm.cpp
@@ -390,8 +390,6 @@ void mtsm::pop_state()
#endif
if (sp == 0)
fatal("empty state machine stack");
- if (sp->state)
- delete sp->state;
sp->state = 0;
stack *t = sp;
sp = sp->next;
--
1.7.1.1