]> git.cworth.org Git - mnemon/blobdiff - mnemon.c
Free memory leaks in mnemon_save (thanks valgrind!)
[mnemon] / mnemon.c
index a1872bcf9632b9b0b00debd2d6cd0c1a5ba490b9..101ace80edb9f29d49232261de5db331931a847a 100644 (file)
--- a/mnemon.c
+++ b/mnemon.c
@@ -345,10 +345,16 @@ mnemon_get_bin (mnemon_t  *mnemon,
     for (i = 0; i < mnemon->num_bins; i++)
        if (mnemon->bins[i].count == count)
            return &mnemon->bins[i];
+       else if (mnemon->bins[i].count > count)
+           break;
 
     mnemon_bins_grow (mnemon);
 
-    bin = &mnemon->bins[mnemon->num_bins++];
+    bin = &mnemon->bins[i];
+
+    /* Make room to insert new bin at its sorted location. */
+    memmove (bin + 1, bin, (mnemon->num_bins - i) * sizeof (bin_t));
+    mnemon->num_bins++;
 
     bin_init (bin, count);
 
@@ -497,6 +503,7 @@ mnemon_save (mnemon_t *mnemon)
                   mnemon->dir_name, category->name);
        xasprintf (&lock_filename, "%s/.#%s",
                   mnemon->dir_name, category->name);
+
        file = fopen (lock_filename, "w");
        if (file == NULL) {
            fprintf (stderr, "Error: Failed to open %s for writing: %s\n",
@@ -506,12 +513,17 @@ mnemon_save (mnemon_t *mnemon)
 
        category_print (category, file);
 
+       fclose (file);
+
        err = rename (lock_filename, filename);
        if (err < 0) {
            fprintf (stderr, "Error: Failes to rename %s to %s: %s\n",
                     lock_filename, filename, strerror (errno));
            continue;
        }
+
+       free (filename);
+       free (lock_filename);
     }
 }