iMore overflow checks - 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 797face0d2e3bc2b403a05837288702c29be492a /scm/dedup/commit/797face0d2e3bc2b403a05837288702c29be492a.gph bitreich.org 70 1parent c6c38c6642f1ae9b144aa6c19c98f21cbe5141bd /scm/dedup/commit/c6c38c6642f1ae9b144aa6c19c98f21cbe5141bd.gph bitreich.org 70 hAuthor: sin URL:mailto:sin@2f30.org bitreich.org 70 iDate: Thu, 7 Mar 2019 13:24:36 +0000 Err bitreich.org 70 i Err bitreich.org 70 iMore overflow checks Err bitreich.org 70 i Err bitreich.org 70 iThe helper doesn't help because we want control over the types Err bitreich.org 70 iinvolved. Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M dedup.c | 16 +++++++++++----- Err bitreich.org 70 i M dedup.h | 2 -- Err bitreich.org 70 i M utils.c | 12 ------------ Err bitreich.org 70 i Err bitreich.org 70 i3 files changed, 11 insertions(+), 19 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@@ -143,11 +143,11 @@ grow_snap(struct snapshot *snap, uint64_t nr_blk_descs) Err bitreich.org 70 i { Err bitreich.org 70 i size_t size; Err bitreich.org 70 i Err bitreich.org 70 i- if (mul_overflow(nr_blk_descs, sizeof(snap->blk_desc[0]))) Err bitreich.org 70 i+ if (nr_blk_descs > SIZE_MAX / sizeof(snap->blk_desc[0])) Err bitreich.org 70 i errx(1, "%s: overflow", __func__); Err bitreich.org 70 i size = nr_blk_descs * sizeof(snap->blk_desc[0]); Err bitreich.org 70 i Err bitreich.org 70 i- if (add_overflow(size, sizeof(*snap))) Err bitreich.org 70 i+ if (size > SIZE_MAX - sizeof(*snap)) Err bitreich.org 70 i errx(1, "%s: overflow", __func__); Err bitreich.org 70 i size += sizeof(*snap); Err bitreich.org 70 i Err bitreich.org 70 i@@ -160,11 +160,11 @@ grow_snap(struct snapshot *snap, uint64_t nr_blk_descs) Err bitreich.org 70 i static void Err bitreich.org 70 i append_snap(struct snapshot *snap) Err bitreich.org 70 i { Err bitreich.org 70 i- if (mul_overflow(snap->nr_blk_descs, BLK_DESC_SIZE)) Err bitreich.org 70 i+ if (snap->nr_blk_descs > UINT64_MAX / BLK_DESC_SIZE) Err bitreich.org 70 i errx(1, "%s: overflow", __func__); Err bitreich.org 70 i snap->size = snap->nr_blk_descs * BLK_DESC_SIZE; Err bitreich.org 70 i Err bitreich.org 70 i- if (add_overflow(SNAPSHOT_SIZE, snap->size)) Err bitreich.org 70 i+ if (snap->size > UINT64_MAX - SNAPSHOT_SIZE) Err bitreich.org 70 i errx(1, "%s: overflow", __func__); Err bitreich.org 70 i snap->size += SNAPSHOT_SIZE; Err bitreich.org 70 i Err bitreich.org 70 i@@ -172,9 +172,12 @@ append_snap(struct snapshot *snap) Err bitreich.org 70 i write_snapshot(ifd, snap); Err bitreich.org 70 i write_snapshot_blk_descs(ifd, snap); Err bitreich.org 70 i Err bitreich.org 70 i- if (add_overflow(snap_hdr.size, snap->size)) Err bitreich.org 70 i+ if (snap_hdr.size > UINT64_MAX - snap->size) Err bitreich.org 70 i errx(1, "%s: overflow", __func__); Err bitreich.org 70 i snap_hdr.size += snap->size; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (snap_hdr.nr_snapshots > UINT64_MAX - 1) Err bitreich.org 70 i+ errx(1, "%s: overflow", __func__); Err bitreich.org 70 i snap_hdr.nr_snapshots++; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i@@ -218,6 +221,9 @@ append_blk(uint8_t *buf, struct blk_desc *blk_desc) Err bitreich.org 70 i { Err bitreich.org 70 i xlseek(sfd, blk_hdr.size, SEEK_SET); Err bitreich.org 70 i xwrite(sfd, buf, blk_desc->size); Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (blk_hdr.size > UINT64_MAX - blk_desc->size) Err bitreich.org 70 i+ errx(1, "%s: overflow", __func__); Err bitreich.org 70 i blk_hdr.size += blk_desc->size; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 1diff --git a/dedup.h b/dedup.h /scm/dedup/file/dedup.h.gph bitreich.org 70 i@@ -108,5 +108,3 @@ 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@@ -66,15 +66,3 @@ 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 .