iImplement helpers for overflow detection - 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 9817f61535da145c316a4bb5861ed913bc16b4cf /scm/dedup/commit/9817f61535da145c316a4bb5861ed913bc16b4cf.gph bitreich.org 70 1parent 022be48b38a5286cd9845f8397d8e491df80af31 /scm/dedup/commit/022be48b38a5286cd9845f8397d8e491df80af31.gph bitreich.org 70 hAuthor: sin URL:mailto:sin@2f30.org bitreich.org 70 iDate: Tue, 26 Feb 2019 11:10:48 +0000 Err bitreich.org 70 i Err bitreich.org 70 iImplement helpers for overflow detection Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M dedup.c | 12 +++++------- Err bitreich.org 70 i M dedup.h | 2 ++ Err bitreich.org 70 i M utils.c | 13 +++++++++++++ Err bitreich.org 70 i Err bitreich.org 70 i3 files changed, 20 insertions(+), 7 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@@ -4,7 +4,6 @@ Err bitreich.org 70 i Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i-#include Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i@@ -136,16 +135,15 @@ free_snap(struct snapshot *snap) Err bitreich.org 70 i static struct snapshot * Err bitreich.org 70 i grow_snap(struct snapshot *snap, uint64_t nr_blk_descs) Err bitreich.org 70 i { Err bitreich.org 70 i- size_t size, mul; Err bitreich.org 70 i+ size_t size; Err bitreich.org 70 i Err bitreich.org 70 i- if (nr_blk_descs > SIZE_MAX / sizeof(snap->blk_desc[0])) Err bitreich.org 70 i+ if (mul_overflow(nr_blk_descs, sizeof(snap->blk_desc[0]))) Err bitreich.org 70 i errx(1, "grow_snap: overflow"); Err bitreich.org 70 i- mul = nr_blk_descs * sizeof(snap->blk_desc[0]); Err bitreich.org 70 i+ size = nr_blk_descs * sizeof(snap->blk_desc[0]); Err bitreich.org 70 i Err bitreich.org 70 i- size = sizeof(*snap); Err bitreich.org 70 i- if (size > SIZE_MAX - mul) Err bitreich.org 70 i+ if (add_overflow(size, sizeof(*snap))) Err bitreich.org 70 i errx(1, "grow_snap: overflow"); Err bitreich.org 70 i- size += mul; Err bitreich.org 70 i+ size += sizeof(*snap); Err bitreich.org 70 i Err bitreich.org 70 i snap = realloc(snap, size); Err bitreich.org 70 i if (snap == NULL) Err bitreich.org 70 1diff --git a/dedup.h b/dedup.h /scm/dedup/file/dedup.h.gph bitreich.org 70 i@@ -96,3 +96,5 @@ void str2bin(char *s, uint8_t *d); Err bitreich.org 70 i off_t xlseek(int fd, off_t offset, int whence); Err bitreich.org 70 i ssize_t xread(int fd, void *buf, size_t nbytes); Err bitreich.org 70 i ssize_t xwrite(int fd, const void *buf, size_t nbytes); Err bitreich.org 70 i+int mul_overflow(size_t a, size_t b); Err bitreich.org 70 i+int add_overflow(size_t a, size_t b); Err bitreich.org 70 1diff --git a/utils.c b/utils.c /scm/dedup/file/utils.c.gph bitreich.org 70 i@@ -1,6 +1,7 @@ Err bitreich.org 70 i #include Err bitreich.org 70 i Err bitreich.org 70 i #include Err bitreich.org 70 i+#include Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i@@ -65,3 +66,15 @@ xwrite(int fd, const void *buf, size_t nbytes) Err bitreich.org 70 i } Err bitreich.org 70 i return total; Err bitreich.org 70 i } Err bitreich.org 70 i+ Err bitreich.org 70 i+int Err bitreich.org 70 i+mul_overflow(size_t a, size_t b) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ return a > SIZE_MAX / b; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+int Err bitreich.org 70 i+add_overflow(size_t a, size_t b) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ return a > SIZE_MAX - b; Err bitreich.org 70 i+} Err bitreich.org 70 .