
From: Jose E. Marchesi <jemarch@gnu.org>
Subject: recins - memory bug when several records get replaced fixed

Origin: upstream, http://git.savannah.gnu.org/cgit/recutils.git/commit/?id=9bc506f7b3ca1968b296683bc34080027c8a440a

--- recutils-1.4.orig/utils/recins.c
+++ recutils-1.4/utils/recins.c
@@ -578,25 +578,25 @@ recins_add_new_record (rec_db_t db)
           rec_record_destroy (recins_record);
 
 #if defined REC_CRYPT_SUPPORT
-      {
-        /* Encrypt the value of fields declared as confidential in
-           this record set.  */
-        
-        rec_fex_t confidential_fields =
-          rec_rset_confidential (rset);
-        if (!recins_password && (rec_fex_size (confidential_fields) > 0))
-          {
-            recutl_warning (_("the record set contains confidential fields but no password was provided\n"));
-            recutl_warning (_("the resulting record will have those fields unencrypted!\n"));
-          }
-        else
-          {
-            if (!rec_encrypt_record (rset, record_to_insert, recins_password))
-              {
-                recutl_fatal ("encrypting a record.  Please report this.\n");
-              }
-          }
-      }
+    {
+     /* Encrypt the value of fields declared as confidential in
+        this record set. */
+
+     rec_fex_t confidential_fields =
+     rec_rset_confidential (rset);
+     if (!recins_password && (rec_fex_size (confidential_fields) > 0))
+         {
+          recutl_warning (_("the record set contains confidential fields but no password was provided\n"));
+          recutl_warning (_("the resulting record will have those fields unencrypted!\n"));
+         }
+     else
+         {
+          if (!rec_encrypt_record (rset, record_to_insert, recins_password))
+            {
+             recutl_fatal ("encrypting a record. Please report this.\n");
+            }
+         }
+    }
 #endif
 
           rset_elem = rec_rset_first_record (rset);
@@ -619,13 +619,15 @@ recins_add_new_record (rec_db_t db)
                 }
               else
                 {
-                  new_rset_elem = rec_rset_elem_record_new (rset, record_to_insert);
+                  new_rset_elem = rec_rset_elem_record_new (rset, rec_record_dup (record_to_insert));
                   rec_rset_insert_after (rset, rset_elem, new_rset_elem);
                   rec_rset_remove (rset, rset_elem);
                   rset_elem = rec_rset_next_record (rset, new_rset_elem);
                 }
             }
         }
+
+      rec_record_destroy (record_to_insert);
     }
   else
     {
