[CRIU] [PATCH] zdtm: avoid arithmetic overflow in datagen and datachk

Andrei Vagin avagin at openvz.org
Tue Oct 17 09:34:52 MSK 2017


From: Andrei Vagin <avagin at virtuozzo.com>

p + FAST_SIZE > buffer + length

In this sentence p + FAST_SIZE may be bigger than (1<<32),
and we will be in trouble.

$ gdb -c coredump test/zdtm/static/write_read01

(gdb) p p
$3 = (uint8_t *) 0xffffa89e
(gdb) p buffer
$4 = (uint8_t *) 0xfff06780
(gdb) p length
$5 = 1000000

Signed-off-by: Andrei Vagin <avagin at virtuozzo.com>
---
 test/zdtm/lib/datagen.c | 30 +++++++++++++++---------------
 1 file changed, 15 insertions(+), 15 deletions(-)

diff --git a/test/zdtm/lib/datagen.c b/test/zdtm/lib/datagen.c
index 550339c40..83fbea285 100644
--- a/test/zdtm/lib/datagen.c
+++ b/test/zdtm/lib/datagen.c
@@ -14,42 +14,42 @@
 
 static void datagen_fast(uint8_t *buffer, unsigned length, uint32_t *crc)
 {
-	uint8_t *p;
+	size_t off;
 
 	datagen(buffer, FAST_SIZE, crc);
-	p = buffer + FAST_SIZE;
+	off = FAST_SIZE;
 
-	while (p < buffer + length) {
+	while (off < length) {
 		unsigned long size = FAST_SIZE;
 
-		if (p + FAST_SIZE > buffer + length)
-			size = buffer + length - p;
-		memcpy(p, buffer, size);
+		if (off + FAST_SIZE > length)
+			size = length - off;
+		memcpy(buffer + off, buffer, size);
 
-		p += FAST_SIZE;
+		off += size;
 	}
 }
 
 static int datachk_fast(const uint8_t *buffer, unsigned length, uint32_t *crc)
 {
-	const uint8_t *p;
+	size_t off;
 
 	if (datachk(buffer, FAST_SIZE, crc))
 		return 1;
 
-	p = buffer + FAST_SIZE;
+	off = FAST_SIZE;
 
-	while (p < buffer + length) {
+	while (off < length) {
 		unsigned long size = FAST_SIZE;
 
-		if (p + FAST_SIZE > buffer + length)
-			size = buffer + length - p;
+		if (off + FAST_SIZE > length)
+			size = length - off;
 
-		if (memcmp(p, buffer, size)) {
-			test_msg("Memory corruption [%p, %p]\n", p, p + size);
+		if (memcmp(buffer + off, buffer, size)) {
+			test_msg("Memory corruption [%p, %p]\n", buffer, buffer + size);
 			return 1;
 		}
-		p += FAST_SIZE;
+		off += size;
 	}
 
 	return 0;
-- 
2.13.3



More information about the CRIU mailing list