URI: 
       Plug some leaks - dedup - deduplicating backup program
  HTML git clone git://bitreich.org/dedup/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/dedup/
   DIR Log
   DIR Files
   DIR Refs
   DIR Tags
   DIR README
   DIR LICENSE
       ---
   DIR commit 34990ad2e3066a5fd23cebc22b997dff63ac272a
   DIR parent cf95ada626787205b2152ce6fe00e343c4413637
  HTML Author: sin <sin@2f30.org>
       Date:   Wed, 21 Mar 2018 16:03:26 +0000
       
       Plug some leaks
       
       Diffstat:
         M dedup.c                             |      49 +++++++++++++++++++++++--------
       
       1 file changed, 37 insertions(+), 12 deletions(-)
       ---
   DIR diff --git a/dedup.c b/dedup.c
       @@ -180,6 +180,17 @@ flush_cache(void)
        }
        
        void
       +free_cache(void)
       +{
       +        struct cache_ent *ent, *tmp;
       +
       +        RB_FOREACH_SAFE(ent, cache, &cache_head, tmp) {
       +                RB_REMOVE(cache, &cache_head, ent);
       +                free(ent);
       +        }
       +}
       +
       +void
        append_ent(struct ent *ent)
        {
                /* Update index header */
       @@ -279,29 +290,38 @@ extract(char *id, int fd)
                nblks = storefile_nblks();
                lseek(ifd, sizeof(enthdr), SEEK_SET);
                for (i = 0; i < enthdr.nents; i++) {
       +                uint64_t j;
                        struct ent *ent;
        
       +                /* Load index entry */
                        ent = alloc_ent();
                        if (xread(ifd, ent, sizeof(*ent)) == 0)
                                errx(1, "unexpected EOF");
       +
       +                if (memcmp(ent->md, md, sizeof(ent->md)) != 0) {
       +                        free(ent);
       +                        /* Skip over index entry block table */
       +                        lseek(ifd, ent->nblks * sizeof(ent->blks[0]), SEEK_CUR);
       +                        continue;
       +                }
       +
       +                /* Load index entry block table */
                        ent = grow_ent(ent, ent->nblks);
                        if (xread(ifd, ent->blks,
                            ent->nblks * sizeof(ent->blks[0])) == 0)
                                errx(1, "unexpected EOF");
       -                if (memcmp(ent->md, md, sizeof(ent->md)) == 0) {
       -                        uint64_t j;
       -
       -                        for (j = 0; j < ent->nblks; j++) {
       -                                struct blk blk;
       -
       -                                if (ent->blks[j] > nblks)
       -                                        errx(1, "index is corrupted");
       -                                read_blk(&blk, ent->blks[j]);
       -                                xwrite(fd, blk.data, blk.sz);
       -                        }
       -                        break;
       +
       +                /* Blast file blocks to file descriptor */
       +                for (j = 0; j < ent->nblks; j++) {
       +                        struct blk blk;
       +
       +                        if (ent->blks[j] > nblks)
       +                                errx(1, "index is corrupted");
       +                        read_blk(&blk, ent->blks[j]);
       +                        xwrite(fd, blk.data, blk.sz);
                        }
                        free(ent);
       +                break;
                }
        }
        
       @@ -485,6 +505,8 @@ init(void)
        void
        term(void)
        {
       +        free_cache();
       +
                fsync(ifd);
                fsync(sfd);
                fsync(cfd);
       @@ -531,11 +553,13 @@ main(int argc, char *argv[])
        
                if (cflag) {
                        check();
       +                term();
                        return 0;
                }
        
                if (lflag) {
                        list();
       +                term();
                        return 0;
                }
        
       @@ -560,4 +584,5 @@ main(int argc, char *argv[])
                }
        
                term();
       +        return 0;
        }