* zdump.c (sumsize): * zic.c (align_to): Avoid undefined behavior if SIZE_MAX == INT_MAX and adding two sizes overflows. --- zdump.c | 10 ++++------ zic.c | 4 ++-- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/zdump.c b/zdump.c index f0461ad..a05b878 100644 --- a/zdump.c +++ b/zdump.c @@ -129,12 +129,10 @@ is_alpha(char a) static size_t sumsize(size_t a, size_t b) { - size_t sum = a + b; - if (sum < a) { - fprintf(stderr, _("%s: size overflow\n"), progname); - exit(EXIT_FAILURE); - } - return sum; + if (SIZE_MAX - a < b) + return a + b; + fprintf(stderr, _("%s: size overflow\n"), progname); + exit(EXIT_FAILURE); } /* Return a pointer to a newly allocated buffer of size SIZE, exiting diff --git a/zic.c b/zic.c index 26595c2..2db5486 100644 --- a/zic.c +++ b/zic.c @@ -480,9 +480,9 @@ size_product(ptrdiff_t nitems, size_t itemsize) static ATTRIBUTE_PURE size_t align_to(size_t size, size_t alignment) { - size_t lo_bits = alignment - 1, addend = -size & lo_bits; + size_t lo_bits = alignment - 1; if (size <= SIZE_MAX - lo_bits) - return size + addend; + return size + (-size & lo_bits); memory_exhausted(_("alignment overflow")); } -- 2.38.1