bug-recutils
[Top][All Lists]
Advanced

[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

Attachment: pgpsWwK2AfjkY.pgp
Description: PGP signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]