summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorwl <wl>2009-11-24 13:32:17 +0000
committerwl <wl>2009-11-24 13:32:17 +0000
commitbe095a293e09eae67254f59ce878b1a36233b447 (patch)
tree12771a41c3eddc6429e2d931a8af1b4ea06dc931 /src
parent881991c468612d34c2a1bd96eb78f685153d2da6 (diff)
downloadgroff-be095a293e09eae67254f59ce878b1a36233b447.tar.gz
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'.
Diffstat (limited to 'src')
-rw-r--r--src/roff/troff/env.cpp13
-rw-r--r--src/roff/troff/input.cpp5
-rw-r--r--src/roff/troff/mtsm.cpp2
3 files changed, 12 insertions, 8 deletions
diff --git a/src/roff/troff/env.cpp b/src/roff/troff/env.cpp
index 56bfe21d..13672cc5 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 17d24515..7c816e83 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 83a69066..79e2f78f 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;