[PATCH v2 4/6] shallow.c: avoid theoretical pointer wrap-around
- From
Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
- Date
- Dec 6, 2016, 12:53 UTC
- Message-ID
- <20161206125339.16803-5-pclouds@gmail.com>
- In-Reply-To
- <20161206125339.16803-1-pclouds@gmail.com>
From: Rasmus Villemoes <rv@rasmusvillemoes.dk>
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> --- shallow.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/shallow.c b/shallow.c index 75e1702..719f699 100644 --- a/shallow.c +++ b/shallow.c @@ -446,7 +446,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);
-- 2.8.2.524.g6ff3d78