[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[bug-recutils] Memory leaks in unit tests
From: |
Michał Masłowski |
Subject: |
[bug-recutils] Memory leaks in unit tests |
Date: |
Tue, 21 Aug 2012 17:13:34 +0200 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/24.1 (gnu/linux) |
These three patches fix memory leaks and an invalid read found using
valgrind when running the unit tests. They are available in the
valgrind-fixes branch of git://elderthing.mtjm.eu/mtjm-recutils.git.
From edceeff624a74a82207508f6b159bde653af4677 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micha=C5=82=20Mas=C5=82owski?= <address@hidden>
Date: Tue, 21 Aug 2012 11:41:26 +0200
Subject: [PATCH 1/3] src: Fix an invalid read in an unit test detected by
valgrind.
---
ChangeLog | 6 ++++++
src/rec-parser.c | 2 +-
2 files changed, 7 insertions(+), 1 deletion(-)
diff --git a/ChangeLog b/ChangeLog
index c0b9417..e0a0123 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2012-08-21 Michał Masłowski <address@hidden>
+
+ src: Fix an invalid read in an unit test detected by valgrind.
+ * src/rec-parser.c (rec_parse_field_name_str): Do the check for
+ trailing ':' only for nonempty strings.
+
2012-08-16 John Darrington <address@hidden>
doc: Reals always use the dot as separator
diff --git a/src/rec-parser.c b/src/rec-parser.c
index e6c3b00..2494c28 100644
--- a/src/rec-parser.c
+++ b/src/rec-parser.c
@@ -687,7 +687,7 @@ rec_parse_field_name_str (const char *str)
}
strncpy (str2, str, str_size);
- if (str2[str_size - 1] == ':')
+ if (str_size > 0 && str2[str_size - 1] == ':')
{
str2[str_size] = '\0';
}
--
1.7.11.4
From f7008ad975685e58aded287d24e7a310d9a21638 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micha=C5=82=20Mas=C5=82owski?= <address@hidden>
Date: Tue, 21 Aug 2012 13:14:21 +0200
Subject: [PATCH 2/3] src: Initialize unused fields to 0 in rec_fex_append.
Fixing a memory leak involving rewrite_to caused rec2csv tests to
segfault when it was left uninitialized before freeing.
---
ChangeLog | 5 +++++
src/rec-fex.c | 1 +
2 files changed, 6 insertions(+)
diff --git a/ChangeLog b/ChangeLog
index e0a0123..ddc0b9c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
2012-08-21 Michał Masłowski <address@hidden>
+ src: Initialize unused fields to 0 in rec_fex_append.
+ * src/rec-fex.c (rec_fex_append): Zero new_elem content.
+
+2012-08-21 Michał Masłowski <address@hidden>
+
src: Fix an invalid read in an unit test detected by valgrind.
* src/rec-parser.c (rec_parse_field_name_str): Do the check for
trailing ':' only for nonempty strings.
diff --git a/src/rec-fex.c b/src/rec-fex.c
index 75e062c..f5688ac 100644
--- a/src/rec-fex.c
+++ b/src/rec-fex.c
@@ -454,6 +454,7 @@ rec_fex_append (rec_fex_t fex,
new_elem = malloc (sizeof (struct rec_fex_elem_s));
if (new_elem)
{
+ memset (new_elem, 0, sizeof (*new_elem));
new_elem->field_name = strdup (fname);
if (!new_elem->field_name)
{
--
1.7.11.4
From 3009d42636581b63fa706862a0f022f765a90673 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micha=C5=82=20Mas=C5=82owski?= <address@hidden>
Date: Tue, 21 Aug 2012 16:46:24 +0200
Subject: [PATCH 3/3] src,torture: Fix memory leaks found by valgrind in unit
tests.
---
ChangeLog | 53 +++++++++++++++++++++++++++
src/rec-fex.c | 28 +++++++++++---
src/rec-parser.c | 6 ++-
src/rec-rset.c | 1 +
src/rec-sex-ast.c | 1 +
src/rec-types.c | 16 +++++++-
torture/rec-fex/rec-fex-new.c | 1 +
torture/rec-fex/rec-fex-str.c | 3 ++
torture/rec-field/rec-field-set-name.c | 4 ++
torture/rec-field/rec-field-set-value.c | 4 ++
torture/rec-field/rec-field-value.c | 4 ++
torture/rec-parser/rec-parse-record-str.c | 1 +
torture/rec-parser/rec-parse-record.c | 6 +++
torture/rec-parser/rec-parse-rset.c | 3 ++
torture/rec-parser/rec-parser-new-mem.c | 1 +
torture/rec-parser/rec-parser-seek-mem.c | 1 +
torture/rec-writer/rec-write-comment-str.c | 4 ++
torture/rec-writer/rec-write-field-name-str.c | 2 +
torture/rec-writer/rec-write-field-str.c | 2 +
19 files changed, 133 insertions(+), 8 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index ddc0b9c..e825684 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,58 @@
2012-08-21 Michał Masłowski <address@hidden>
+ src,torture: Fix memory leaks found by valgrind in unit tests.
+ * src/rec-fex.c (rec_fex_destroy): Free rewrite_to of each
+ element.
+ (rec_fex_parse_str_simple): Free fex_str, rewrite_to of each
+ element and use common code for destroying partial results on
+ error.
+ (rec_fex_parse_str_subscripts): Free fex_str and in case of error
+ field_name and str of each element.
+ (rec_fex_parse_elem): Free elem->str, elem->field_name and
+ elem->rewrite_to on error.
+ * src/rec-parser.c (rec_parser_perror): Don't allocate number_str,
+ asprintf will do it.
+ (rec_parse_record): Free the record on error.
+ (rec_parse_comment): Free the comment string not only on error.
+ * src/rec-rset.c (rec_rset_destroy): Free constraints.
+ * src/rec-sex-ast.c (rec_sex_ast_node_destroy): Free the node.
+ * src/rec-types.c (rec_type_new): Free the type on error.
+ (rec_type_destroy): Free the data of enum and regexp types.
+
+ * torture/rec-fex/rec-fex-new.c (rec_fex_new_subscripts): Destroy
+ the fex after use.
+ * torture/rec-fex/rec-fex-str.c (rec_fex_str_nominal): Likewise.
+ * torture/rec-field/rec-field-set-name.c
+ (rec_field_set_name_empty): Destroy the field after use.
+ (rec_field_set_name_nonempty): Likewise.
+ * torture/rec-field/rec-field-set-value.c
+ (rec_field_set_value_empty): Likewise.
+ (rec_field_set_value_nonempty): Likewise.
+ * torture/rec-field/rec-field-value.c (rec_field_value_empty):
+ Likewise.
+ (rec_field_value_nonempty): Likewise.
+ * torture/rec-parser/rec-parse-record-str.c
+ (rec_parse_record_str_nominal): Free fname after use.
+ * torture/rec-parser/rec-parse-record.c
+ (rec_parse_record_nominal): Likewise.
+ * torture/rec-parser/rec-parse-rset.c (rec_parse_rset_nominal):
+ Destroy the rset after use.
+ * torture/rec-parser/rec-parser-new-mem.c
+ (rec_parser_new_mem_nominal): Likewise.
+ * torture/rec-parser/rec-parser-seek-mem.c
+ (rec_parser_seek_mem_skip): Destroy the record after use.
+ * torture/rec-writer/rec-write-comment-str.c
+ (rec_write_comment_str_nominal): Free str after use.
+ (rec_write_comment_str_sexp): Likewise.
+ * torture/rec-writer/rec-write-field-name-str.c
+ (rec_write_field_name_str_nominal): Likewise.
+ (rec_write_field_name_str_sexp): Likewise.
+ * torture/rec-writer/rec-write-field-str.c
+ (rec_write_field_str_nominal): Likewise.
+ (rec_write_field_str_sexp): Likewise.
+
+2012-08-21 Michał Masłowski <address@hidden>
+
src: Initialize unused fields to 0 in rec_fex_append.
* src/rec-fex.c (rec_fex_append): Zero new_elem content.
diff --git a/src/rec-fex.c b/src/rec-fex.c
index f5688ac..c93379c 100644
--- a/src/rec-fex.c
+++ b/src/rec-fex.c
@@ -140,6 +140,7 @@ rec_fex_destroy (rec_fex_t fex)
{
for (i = 0; i < fex->num_elems; i++)
{
+ free (fex->elems[i]->rewrite_to);
free (fex->elems[i]->field_name);
free (fex->elems[i]->str);
free (fex->elems[i]);
@@ -531,7 +532,7 @@ rec_fex_parse_str_simple (rec_fex_t new,
{
bool res;
rec_fex_elem_t elem;
- char *fex_str;
+ char *fex_str, *fex_str_orig;
char *elem_str;
size_t i;
@@ -545,6 +546,7 @@ rec_fex_parse_str_simple (rec_fex_t new,
{
return false;
}
+ fex_str_orig = fex_str;
res = true;
@@ -565,7 +567,8 @@ rec_fex_parse_str_simple (rec_fex_t new,
{
/* Parse error. */
free (elem);
- return false;
+ res = false;
+ break;
}
/* Get the subname, if any, and modify the name
@@ -583,7 +586,8 @@ rec_fex_parse_str_simple (rec_fex_t new,
/* Parse error. */
free (elem->field_name);
free (elem);
- return false;
+ res = false;
+ break;
}
/* Concatenate the field name and the subname. */
@@ -597,7 +601,8 @@ rec_fex_parse_str_simple (rec_fex_t new,
{
free (elem->field_name);
free (elem);
- return false;
+ res = false;
+ break;
}
/* Initialize other attributes of the fex entry. */
@@ -634,12 +639,14 @@ rec_fex_parse_str_simple (rec_fex_t new,
/* Destroy parsed elements. */
for (i = 0; i < new->num_elems; i++)
{
+ free (new->elems[i]->rewrite_to);
free (new->elems[i]->field_name);
free (new->elems[i]->str);
free (new->elems[i]);
}
}
+ free (fex_str_orig);
return res;
}
@@ -649,7 +656,7 @@ rec_fex_parse_str_subscripts (rec_fex_t new,
{
bool res;
char *elem_str;
- char *fex_str;
+ char *fex_str, *fex_str_orig;
rec_fex_elem_t elem;
int i;
@@ -660,6 +667,7 @@ rec_fex_parse_str_subscripts (rec_fex_t new,
{
return false;
}
+ fex_str_orig = fex_str;
elem_str = strsep (&fex_str, ",");
do
@@ -677,9 +685,12 @@ rec_fex_parse_str_subscripts (rec_fex_t new,
/* Parse error. */
for (i = 0; i < new->num_elems; i++)
{
+ free (new->elems[i]->field_name);
+ free (new->elems[i]->str);
free (new->elems[i]);
}
+ free (elem);
res = false;
break;
}
@@ -694,6 +705,7 @@ rec_fex_parse_str_subscripts (rec_fex_t new,
new->str = strdup (str);
}
+ free (fex_str_orig);
return res;
}
@@ -733,6 +745,7 @@ rec_fex_parse_elem (rec_fex_elem_t elem,
&(elem->function_name)))
{
/* Parse error. */
+ free (elem->str);
return false;
}
@@ -746,6 +759,7 @@ rec_fex_parse_elem (rec_fex_elem_t elem,
&(elem->field_name)))
{
/* Parse error. */
+ free (elem->str);
return false;
}
@@ -762,6 +776,7 @@ rec_fex_parse_elem (rec_fex_elem_t elem,
&subname))
{
/* Parse error. */
+ free (elem->str);
return false;
}
@@ -819,6 +834,8 @@ rec_fex_parse_elem (rec_fex_elem_t elem,
&(elem->rewrite_to)))
{
/* Parse error. */
+ free (elem->str);
+ free (elem->field_name);
return false;
}
}
@@ -827,6 +844,7 @@ rec_fex_parse_elem (rec_fex_elem_t elem,
{
free (elem->str);
free (elem->field_name);
+ free (elem->rewrite_to);
return false;
}
diff --git a/src/rec-parser.c b/src/rec-parser.c
index 2494c28..993b068 100644
--- a/src/rec-parser.c
+++ b/src/rec-parser.c
@@ -197,7 +197,7 @@ rec_parser_perror (rec_parser_t parser,
va_start (ap, fmt);
vfprintf (stderr, fmt, ap);
fputs (": ", stderr);
- number_str = malloc(30);
+ number_str = NULL; /* asprintf does the allocation */
if (asprintf (&number_str, "%zu", parser->line) != -1)
{
fputs (number_str, stderr);
@@ -464,6 +464,8 @@ rec_parse_record (rec_parser_t parser,
{
/* Expected a field. */
parser->error = REC_PARSER_EFIELD;
+ rec_record_destroy (new);
+ *record = NULL;
return false;
}
@@ -1193,10 +1195,10 @@ rec_parse_comment (rec_parser_t parser, rec_comment_t
*comment)
}
else
{
- free (str);
*comment = NULL;
}
+ free (str);
return ret;
}
diff --git a/src/rec-rset.c b/src/rec-rset.c
index 1d211df..030a605 100644
--- a/src/rec-rset.c
+++ b/src/rec-rset.c
@@ -241,6 +241,7 @@ rec_rset_destroy (rec_rset_t rset)
{
rec_sex_destroy (rset->constraints[i]);
}
+ free (rset->constraints);
props = rset->field_props;
while (props)
diff --git a/src/rec-sex-ast.c b/src/rec-sex-ast.c
index 6fb6305..3590c7e 100644
--- a/src/rec-sex-ast.c
+++ b/src/rec-sex-ast.c
@@ -129,6 +129,7 @@ rec_sex_ast_node_destroy (rec_sex_ast_node_t node)
}
free (node->fixed_val);
+ free (node);
}
enum rec_sex_ast_node_type_e
diff --git a/src/rec-types.c b/src/rec-types.c
index 66eafc9..0b00f53 100644
--- a/src/rec-types.c
+++ b/src/rec-types.c
@@ -454,7 +454,7 @@ rec_type_new (const char *str)
{
if (!rec_blank_p (*p))
{
- free (new);
+ rec_type_destroy (new);
new = NULL;
break;
}
@@ -673,6 +673,20 @@ rec_type_check (rec_type_t type,
void
rec_type_destroy (rec_type_t type)
{
+ int i;
+
+ if (type->kind == REC_TYPE_ENUM)
+ {
+ for (i = 0; type->data.names[i]; i++)
+ {
+ free (type->data.names[i]);
+ }
+ }
+ else if (type->kind == REC_TYPE_REGEXP)
+ {
+ regfree (&type->data.regexp);
+ }
+
free (type->name);
free (type);
}
diff --git a/torture/rec-fex/rec-fex-new.c b/torture/rec-fex/rec-fex-new.c
index 3861d7a..ec4b79f 100644
--- a/torture/rec-fex/rec-fex-new.c
+++ b/torture/rec-fex/rec-fex-new.c
@@ -228,6 +228,7 @@ START_TEST(rec_fex_new_subscripts)
fail_if (rec_fex_elem_max (rec_fex_get (fex, 1)) != 23);
fail_if (rec_fex_elem_min (rec_fex_get (fex, 2)) != -1);
fail_if (rec_fex_elem_max (rec_fex_get (fex, 2)) != -1);
+ rec_fex_destroy (fex);
}
END_TEST
diff --git a/torture/rec-fex/rec-fex-str.c b/torture/rec-fex/rec-fex-str.c
index bede3a4..2a217e7 100644
--- a/torture/rec-fex/rec-fex-str.c
+++ b/torture/rec-fex/rec-fex-str.c
@@ -55,6 +55,7 @@ START_TEST(rec_fex_str_nominal)
fail_if (str == NULL);
fail_if (strcmp (str, "foo") != 0);
free (str);
+ rec_fex_destroy (fex);
fex = rec_fex_new ("foo bar baz", REC_FEX_SIMPLE);
fail_if (fex == NULL);
@@ -70,6 +71,7 @@ START_TEST(rec_fex_str_nominal)
fail_if (str == NULL);
fail_if (strcmp (str, "foo,bar,baz") != 0);
free (str);
+ rec_fex_destroy (fex);
fex = rec_fex_new ("foo[0],bar[1-2],baz", REC_FEX_SUBSCRIPTS);
fail_if (fex == NULL);
@@ -85,6 +87,7 @@ START_TEST(rec_fex_str_nominal)
fail_if (str == NULL);
fail_if (strcmp (str, "foo[0],bar[1-2],baz") != 0);
free (str);
+ rec_fex_destroy (fex);
}
END_TEST
diff --git a/torture/rec-field/rec-field-set-name.c
b/torture/rec-field/rec-field-set-name.c
index b11bdd5..655ae27 100644
--- a/torture/rec-field/rec-field-set-name.c
+++ b/torture/rec-field/rec-field-set-name.c
@@ -53,6 +53,8 @@ START_TEST(rec_field_set_name_empty)
field_name_2 = rec_field_name (field);
fail_if(strcmp (field_name_2, "") != 0);
+
+ rec_field_destroy (field);
}
END_TEST
@@ -81,6 +83,8 @@ START_TEST(rec_field_set_name_nonempty)
field_name_2 = rec_field_name (field);
fail_if(strcmp (field_name_2, "foo") != 0);
+
+ rec_field_destroy (field);
}
END_TEST
diff --git a/torture/rec-field/rec-field-set-value.c
b/torture/rec-field/rec-field-set-value.c
index 54b2edb..df112bd 100644
--- a/torture/rec-field/rec-field-set-value.c
+++ b/torture/rec-field/rec-field-set-value.c
@@ -52,6 +52,8 @@ START_TEST(rec_field_set_value_empty)
rec_field_set_value (field, "");
field_value = rec_field_value (field);
fail_if(strcmp (field_value, "") != 0);
+
+ rec_field_destroy (field);
}
END_TEST
@@ -78,6 +80,8 @@ START_TEST(rec_field_set_value_nonempty)
rec_field_set_value (field, "foo");
field_value = rec_field_value (field);
fail_if(strcmp (field_value, "foo") != 0);
+
+ rec_field_destroy (field);
}
END_TEST
diff --git a/torture/rec-field/rec-field-value.c
b/torture/rec-field/rec-field-value.c
index e1ed2e9..e9fb151 100644
--- a/torture/rec-field/rec-field-value.c
+++ b/torture/rec-field/rec-field-value.c
@@ -51,6 +51,8 @@ START_TEST(rec_field_value_empty)
field_value = rec_field_value (field);
fail_if(strcmp (field_value, "") != 0);
+
+ rec_field_destroy (field);
}
END_TEST
@@ -76,6 +78,8 @@ START_TEST(rec_field_value_nonempty)
field_value = rec_field_value (field);
fail_if(strcmp (field_value, "foo") != 0);
+
+ rec_field_destroy (field);
}
END_TEST
diff --git a/torture/rec-parser/rec-parse-record-str.c
b/torture/rec-parser/rec-parse-record-str.c
index 0d146bd..188551f 100644
--- a/torture/rec-parser/rec-parse-record-str.c
+++ b/torture/rec-parser/rec-parse-record-str.c
@@ -50,6 +50,7 @@ START_TEST(rec_parse_record_str_nominal)
fail_if (strcmp (rec_field_value (field), "bar") != 0);
fail_if (!rec_field_name_equal_p (fname,
rec_field_name (field)));
+ free (fname);
rec_record_destroy (record);
}
END_TEST
diff --git a/torture/rec-parser/rec-parse-record.c
b/torture/rec-parser/rec-parse-record.c
index 49d14c1..88f3b73 100644
--- a/torture/rec-parser/rec-parse-record.c
+++ b/torture/rec-parser/rec-parse-record.c
@@ -55,6 +55,7 @@ START_TEST(rec_parse_record_nominal)
rec_field_name (field)));
rec_record_destroy (record);
rec_parser_destroy (parser);
+ free (fname);
str = "foo: bar\nfoo2: bar2";
fname = rec_parse_field_name_str ("foo");
@@ -65,11 +66,13 @@ START_TEST(rec_parse_record_nominal)
fail_if (strcmp (rec_field_value (field), "bar") != 0);
fail_if (!rec_field_name_equal_p (fname,
rec_field_name (field)));
+ free (fname);
fname = rec_parse_field_name_str ("foo2");
field = (rec_field_t) rec_mset_get_at (rec_record_mset (record), MSET_FIELD,
1);
fail_if (strcmp (rec_field_value (field), "bar2") != 0);
fail_if (!rec_field_name_equal_p (fname,
rec_field_name (field)));
+ free (fname);
rec_record_destroy (record);
rec_parser_destroy (parser);
@@ -82,16 +85,19 @@ START_TEST(rec_parse_record_nominal)
fail_if (strcmp (rec_field_value (field), "bar") != 0);
fail_if (!rec_field_name_equal_p (fname,
rec_field_name (field)));
+ free (fname);
fname = rec_parse_field_name_str ("foo2");
field = (rec_field_t) rec_mset_get_at (rec_record_mset (record), MSET_FIELD,
1);
fail_if (strcmp (rec_field_value (field), "") != 0);
fail_if (!rec_field_name_equal_p (fname,
rec_field_name (field)));
+ free (fname);
fname = rec_parse_field_name_str ("foo3");
field = (rec_field_t) rec_mset_get_at (rec_record_mset (record), MSET_FIELD,
2);
fail_if (strcmp (rec_field_value (field), "bar3") != 0);
fail_if (!rec_field_name_equal_p (fname,
rec_field_name (field)));
+ free (fname);
rec_record_destroy (record);
rec_parser_destroy (parser);
}
diff --git a/torture/rec-parser/rec-parse-rset.c
b/torture/rec-parser/rec-parse-rset.c
index dc11c84..73c374d 100644
--- a/torture/rec-parser/rec-parse-rset.c
+++ b/torture/rec-parser/rec-parse-rset.c
@@ -46,12 +46,14 @@ START_TEST(rec_parse_rset_nominal)
parser = rec_parser_new_str (str, "dummy");
fail_if (!rec_parse_rset (parser, &rset));
fail_if (rec_rset_num_records (rset) != 3);
+ rec_rset_destroy (rset);
rec_parser_destroy (parser);
str = "%rec: foo\n\nfoo1: bar1\n\nfoo2: bar2\n\nfoo3: bar3";
parser = rec_parser_new_str (str, "dummy");
fail_if (!rec_parse_rset (parser, &rset));
fail_if (rec_rset_num_records (rset) != 3);
+ rec_rset_destroy (rset);
rec_parser_destroy (parser);
str = "foo1: bar1\n\n#foo2: bar2\n\nfoo3: bar3";
@@ -60,6 +62,7 @@ START_TEST(rec_parse_rset_nominal)
fail_if (rec_rset_num_elems (rset) != 3);
fail_if (rec_rset_num_comments (rset) != 1);
fail_if (rec_rset_num_records (rset) != 2);
+ rec_rset_destroy (rset);
rec_parser_destroy (parser);
}
END_TEST
diff --git a/torture/rec-parser/rec-parser-new-mem.c
b/torture/rec-parser/rec-parser-new-mem.c
index cfb82f9..ed0bcdf 100644
--- a/torture/rec-parser/rec-parser-new-mem.c
+++ b/torture/rec-parser/rec-parser-new-mem.c
@@ -51,6 +51,7 @@ START_TEST(rec_parser_new_mem_nominal)
parser = rec_parser_new_mem (str, strlen(short_str), "dummy");
fail_if (!rec_parse_rset (parser, &rset));
fail_if (rec_rset_num_records (rset) != 2);
+ rec_rset_destroy (rset);
rec_parser_destroy (parser);
}
END_TEST
diff --git a/torture/rec-parser/rec-parser-seek-mem.c
b/torture/rec-parser/rec-parser-seek-mem.c
index 8e6d6ac..d721383 100644
--- a/torture/rec-parser/rec-parser-seek-mem.c
+++ b/torture/rec-parser/rec-parser-seek-mem.c
@@ -74,6 +74,7 @@ START_TEST(rec_parser_seek_mem_skip)
fail_if (!rec_parse_record (parser, &record));
fail_if (rec_record_num_fields (record) != 1);
fail_if (rec_record_location (record) != 2);
+ rec_record_destroy (record);
rec_parser_destroy (parser);
}
END_TEST
diff --git a/torture/rec-writer/rec-write-comment-str.c
b/torture/rec-writer/rec-write-comment-str.c
index fc8defd..fbf9d9b 100644
--- a/torture/rec-writer/rec-write-comment-str.c
+++ b/torture/rec-writer/rec-write-comment-str.c
@@ -45,12 +45,14 @@ START_TEST(rec_write_comment_str_nominal)
str = rec_write_comment_str (comment, REC_WRITER_NORMAL);
rec_comment_destroy (comment);
fail_if (strcmp (str, "#foo bar") != 0);
+ free (str);
comment = rec_comment_new ("");
str = rec_write_comment_str (comment, REC_WRITER_NORMAL);
fail_if (str == NULL);
rec_comment_destroy (comment);
fail_if (strcmp (str, "#") != 0);
+ free (str);
}
END_TEST
@@ -70,12 +72,14 @@ START_TEST(rec_write_comment_str_sexp)
fail_if (str == NULL);
rec_comment_destroy (comment);
fail_if (strcmp (str, "(comment \"foo bar\")") != 0);
+ free (str);
comment = rec_comment_new ("");
str = rec_write_comment_str (comment, REC_WRITER_SEXP);
fail_if (str == NULL);
rec_comment_destroy (comment);
fail_if (strcmp (str, "(comment \"\")") != 0);
+ free (str);
}
END_TEST
diff --git a/torture/rec-writer/rec-write-field-name-str.c
b/torture/rec-writer/rec-write-field-name-str.c
index 5506c1d..f8021f1 100644
--- a/torture/rec-writer/rec-write-field-name-str.c
+++ b/torture/rec-writer/rec-write-field-name-str.c
@@ -45,6 +45,7 @@ START_TEST(rec_write_field_name_str_nominal)
str = rec_write_field_name_str (fname, REC_WRITER_NORMAL);
fail_if (str == NULL);
fail_if (strcmp (str, "foo:") != 0);
+ free (str);
}
END_TEST
@@ -62,6 +63,7 @@ START_TEST(rec_write_field_name_str_sexp)
fname = "foo";
str = rec_write_field_name_str (fname, REC_WRITER_SEXP);
fail_if (strcmp (str, "\"foo\"") != 0);
+ free (str);
}
END_TEST
diff --git a/torture/rec-writer/rec-write-field-str.c
b/torture/rec-writer/rec-write-field-str.c
index 953215d..65ab10a 100644
--- a/torture/rec-writer/rec-write-field-str.c
+++ b/torture/rec-writer/rec-write-field-str.c
@@ -47,6 +47,7 @@ START_TEST(rec_write_field_str_nominal)
fail_if (str == NULL);
rec_field_destroy (field);
fail_if (strcmp (str, "foo: value") != 0);
+ free (str);
}
END_TEST
@@ -67,6 +68,7 @@ START_TEST(rec_write_field_str_sexp)
fail_if (str == NULL);
rec_field_destroy (field);
fail_if (strcmp (str, "(field \"foo\" \"value\")") != 0);
+ free (str);
}
END_TEST
--
1.7.11.4
pgpsWwK2AfjkY.pgp
Description: PGP signature
- [bug-recutils] Memory leaks in unit tests,
Michał Masłowski <=