Module Name: src Committed By: riastradh Date: Sun Apr 16 23:50:40 UTC 2017
Modified Files: src/usr.bin/vndcompress: offtab.c offtab.h vndcompress.c vnduncompress.c Log Message: Justify the last unjustified assertion here. Sprinkle a few more assertions to help along the way. (Actually, it was justified; I just hadn't made explicit the relation to the value of fdpos that all two callers specify.) To generate a diff of this commit: cvs rdiff -u -r1.13 -r1.14 src/usr.bin/vndcompress/offtab.c cvs rdiff -u -r1.2 -r1.3 src/usr.bin/vndcompress/offtab.h cvs rdiff -u -r1.26 -r1.27 src/usr.bin/vndcompress/vndcompress.c cvs rdiff -u -r1.11 -r1.12 src/usr.bin/vndcompress/vnduncompress.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.bin/vndcompress/offtab.c diff -u src/usr.bin/vndcompress/offtab.c:1.13 src/usr.bin/vndcompress/offtab.c:1.14 --- src/usr.bin/vndcompress/offtab.c:1.13 Sat Jan 25 16:38:15 2014 +++ src/usr.bin/vndcompress/offtab.c Sun Apr 16 23:50:40 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: offtab.c,v 1.13 2014/01/25 16:38:15 riastradh Exp $ */ +/* $NetBSD: offtab.c,v 1.14 2017/04/16 23:50:40 riastradh Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__RCSID("$NetBSD: offtab.c,v 1.13 2014/01/25 16:38:15 riastradh Exp $"); +__RCSID("$NetBSD: offtab.c,v 1.14 2017/04/16 23:50:40 riastradh Exp $"); #include <sys/types.h> #include <sys/endian.h> @@ -103,7 +103,9 @@ offtab_compute_window_position(struct of const off_t window_offset = ((off_t)window_start * (off_t)sizeof(uint64_t)); - /* XXX This assertion is not justified. */ + assert(offtab->ot_fdpos <= OFFTAB_MAX_FDPOS); + __CTASSERT(OFFTAB_MAX_FDPOS <= + (OFF_MAX - (off_t)MAX_N_OFFSETS*sizeof(uint64_t))); assert(offtab->ot_fdpos <= (OFF_MAX - window_offset)); *pos = (offtab->ot_fdpos + window_offset); } @@ -209,6 +211,7 @@ offtab_init(struct offtab *offtab, uint3 assert(0 < n_offsets); assert(0 <= fd); assert(0 <= fdpos); + assert(fdpos <= OFFTAB_MAX_FDPOS); offtab->ot_n_offsets = n_offsets; if ((window_size == 0) || (n_offsets < window_size)) @@ -293,6 +296,9 @@ offtab_reset_read(struct offtab *offtab, __CTASSERT(MAX_N_OFFSETS <= (OFF_MAX / sizeof(uint64_t))); const off_t offtab_bytes = ((off_t)offtab->ot_n_offsets * (off_t)sizeof(uint64_t)); + assert(offtab->ot_fdpos <= OFFTAB_MAX_FDPOS); + __CTASSERT(OFFTAB_MAX_FDPOS <= + (OFF_MAX - (off_t)MAX_N_OFFSETS*sizeof(uint64_t))); assert(offtab->ot_fdpos <= (OFF_MAX - offtab_bytes)); const off_t first_offset = (offtab->ot_fdpos + offtab_bytes); if (lseek(offtab->ot_fd, first_offset, SEEK_SET) == -1) { @@ -367,9 +373,11 @@ offtab_reset_write(struct offtab *offtab __CTASSERT(MAX_N_OFFSETS <= UINT32_MAX); assert(offtab->ot_n_offsets > 0); + /* Initialize window of all ones. */ for (i = 0; i < offtab->ot_window_size; i++) offtab->ot_window[i] = ~(uint64_t)0; + /* Write the window to every position in the table. */ const uint32_t n_windows = howmany(offtab->ot_n_offsets, offtab->ot_window_size); for (i = 1; i < n_windows; i++) { @@ -378,15 +386,25 @@ offtab_reset_write(struct offtab *offtab offtab_write_window(offtab); } - offtab->ot_window_start = 0; - __CTASSERT(MAX_N_OFFSETS <= - (MIN(OFF_MAX, UINT64_MAX) / sizeof(uint64_t))); + /* Compute the number of bytes in the offset table. */ + __CTASSERT(MAX_N_OFFSETS <= OFF_MAX/sizeof(uint64_t)); const off_t offtab_bytes = ((off_t)offtab->ot_n_offsets * sizeof(uint64_t)); - assert(offtab->ot_fdpos <= - ((off_t)MIN(OFF_MAX, UINT64_MAX) - offtab_bytes)); + + /* Compute the offset of the first block. */ + assert(offtab->ot_fdpos <= OFFTAB_MAX_FDPOS); + __CTASSERT(OFFTAB_MAX_FDPOS <= + (OFF_MAX - (off_t)MAX_N_OFFSETS*sizeof(uint64_t))); + assert(offtab->ot_fdpos <= (OFF_MAX - offtab_bytes)); const off_t first_offset = (offtab->ot_fdpos + offtab_bytes); - assert(first_offset <= (off_t)MIN(OFF_MAX, UINT64_MAX)); + + /* Assert that it fits in 64 bits. */ + __CTASSERT(MAX_N_OFFSETS <= UINT64_MAX/sizeof(uint64_t)); + __CTASSERT(OFFTAB_MAX_FDPOS <= + (UINT64_MAX - (uint64_t)MAX_N_OFFSETS*sizeof(uint64_t))); + + /* Write out the first window with the first offset. */ + offtab->ot_window_start = 0; offtab->ot_window[0] = htobe64((uint64_t)first_offset); offtab_write_window(offtab); Index: src/usr.bin/vndcompress/offtab.h diff -u src/usr.bin/vndcompress/offtab.h:1.2 src/usr.bin/vndcompress/offtab.h:1.3 --- src/usr.bin/vndcompress/offtab.h:1.2 Wed Jan 22 06:15:22 2014 +++ src/usr.bin/vndcompress/offtab.h Sun Apr 16 23:50:40 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: offtab.h,v 1.2 2014/01/22 06:15:22 riastradh Exp $ */ +/* $NetBSD: offtab.h,v 1.3 2017/04/16 23:50:40 riastradh Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -37,6 +37,8 @@ #include <stdbool.h> #include <stdint.h> +#include "common.h" + struct offtab { uint32_t ot_n_offsets; uint32_t ot_window_size; @@ -54,6 +56,10 @@ struct offtab { } ot_mode; }; +#define OFFTAB_MAX_FDPOS \ + ((off_t)(MIN(OFF_MAX, UINT64_MAX) - \ + (off_t)MAX_N_OFFSETS*sizeof(uint64_t))) + void offtab_init(struct offtab *, uint32_t, uint32_t, int, off_t); void offtab_destroy(struct offtab *); Index: src/usr.bin/vndcompress/vndcompress.c diff -u src/usr.bin/vndcompress/vndcompress.c:1.26 src/usr.bin/vndcompress/vndcompress.c:1.27 --- src/usr.bin/vndcompress/vndcompress.c:1.26 Tue Jan 10 21:15:54 2017 +++ src/usr.bin/vndcompress/vndcompress.c Sun Apr 16 23:50:40 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: vndcompress.c,v 1.26 2017/01/10 21:15:54 christos Exp $ */ +/* $NetBSD: vndcompress.c,v 1.27 2017/04/16 23:50:40 riastradh Exp $ */ /*- * Copyright (c) 2013 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__RCSID("$NetBSD: vndcompress.c,v 1.26 2017/01/10 21:15:54 christos Exp $"); +__RCSID("$NetBSD: vndcompress.c,v 1.27 2017/04/16 23:50:40 riastradh Exp $"); #include <sys/endian.h> #include <sys/stat.h> @@ -485,6 +485,7 @@ compress_init(int argc, char **argv, con S->n_offsets = (S->n_blocks + 1); __CTASSERT(MAX_N_OFFSETS == (MAX_N_BLOCKS + 1)); __CTASSERT(MAX_N_OFFSETS <= (SIZE_MAX / sizeof(uint64_t))); + __CTASSERT(CLOOP2_OFFSET_TABLE_OFFSET <= OFFTAB_MAX_FDPOS); offtab_init(&S->offtab, S->n_offsets, window_size, S->cloop2_fd, CLOOP2_OFFSET_TABLE_OFFSET); @@ -606,6 +607,9 @@ compress_restart(struct compress_state * if (!offtab_prepare_get(&S->offtab, 0)) return false; const uint64_t first_offset = offtab_get(&S->offtab, 0); + __CTASSERT(MAX_N_OFFSETS <= UINT64_MAX/sizeof(uint64_t)); + __CTASSERT(sizeof(struct cloop2_header) <= + (UINT64_MAX - MAX_N_OFFSETS*sizeof(uint64_t))); const uint64_t expected = sizeof(struct cloop2_header) + ((uint64_t)S->n_offsets * sizeof(uint64_t)); if (first_offset != expected) { Index: src/usr.bin/vndcompress/vnduncompress.c diff -u src/usr.bin/vndcompress/vnduncompress.c:1.11 src/usr.bin/vndcompress/vnduncompress.c:1.12 --- src/usr.bin/vndcompress/vnduncompress.c:1.11 Sat Jan 25 15:31:06 2014 +++ src/usr.bin/vndcompress/vnduncompress.c Sun Apr 16 23:50:40 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: vnduncompress.c,v 1.11 2014/01/25 15:31:06 riastradh Exp $ */ +/* $NetBSD: vnduncompress.c,v 1.12 2017/04/16 23:50:40 riastradh Exp $ */ /*- * Copyright (c) 2013 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__RCSID("$NetBSD: vnduncompress.c,v 1.11 2014/01/25 15:31:06 riastradh Exp $"); +__RCSID("$NetBSD: vnduncompress.c,v 1.12 2017/04/16 23:50:40 riastradh Exp $"); #include <sys/endian.h> @@ -135,6 +135,7 @@ vnduncompress(int argc, char **argv, con } /* Initialize the offset table and start reading it in. */ + __CTASSERT(CLOOP2_OFFSET_TABLE_OFFSET <= OFFTAB_MAX_FDPOS); offtab_init(&offtab, n_offsets, window_size, cloop2_fd, CLOOP2_OFFSET_TABLE_OFFSET); offtab_reset_read(&offtab, &err1, &errx1);