]> granicus.if.org Git - git/commitdiff
shallow.c: avoid theoretical pointer wrap-around
authorRasmus Villemoes <rv@rasmusvillemoes.dk>
Tue, 6 Dec 2016 12:53:37 +0000 (19:53 +0700)
committerJunio C Hamano <gitster@pobox.com>
Wed, 7 Dec 2016 23:44:31 +0000 (15:44 -0800)
The expression info->free+size is technically undefined behaviour in
exactly the case we want to test for. Moreover, the compiler is likely
to translate the expression to

  (unsigned long)info->free + size > (unsigned long)info->end

where there's at least a theoretical chance that the LHS could wrap
around 0, giving a false negative.

This might as well be written using pointer subtraction avoiding these
issues.

Signed-off-by: Rasmus Villemoes <rv@rasmusvillemoes.dk>
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Reviewed-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
shallow.c

index 7d5ea0cd39d13f290353e6028b11a793080c26ad..4c4486ad67e05923b9826e9a3c7e091a826a4f83 100644 (file)
--- a/shallow.c
+++ b/shallow.c
@@ -368,7 +368,7 @@ static uint32_t *paint_alloc(struct paint_info *info)
        unsigned nr = (info->nr_bits + 31) / 32;
        unsigned size = nr * sizeof(uint32_t);
        void *p;
-       if (!info->pool_count || info->free + size > info->end) {
+       if (!info->pool_count || size > info->end - info->free) {
                if (size > POOL_SIZE)
                        die("BUG: pool size too small for %d in paint_alloc()",
                            size);