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