Blame SOURCES/quota-4.02-Fix-handling-of-space-and-inode-values.patch

9ab6cd
From 663ac451b045b4823d6d633893a5d748c09f42f2 Mon Sep 17 00:00:00 2001
9ab6cd
From: Jan Kara <jack@suse.cz>
9ab6cd
Date: Wed, 1 Oct 2014 18:10:40 +0200
9ab6cd
Subject: [PATCH] Fix handling of space and inode values
9ab6cd
MIME-Version: 1.0
9ab6cd
Content-Type: text/plain; charset=UTF-8
9ab6cd
Content-Transfer-Encoding: 8bit
9ab6cd
9ab6cd
Commit 0214512479e0 (Properly handle signed space and inode values)
9ab6cd
broke parsing of pure numbers in str2number() so that it would always
9ab6cd
complain about "Integer overflow while interpreting decimal unit". Fix
9ab6cd
condition checking for overflow.
9ab6cd
9ab6cd
Also number2str() was buggy and wouldn't guess proper units for negative
9ab6cd
numbers.
9ab6cd
9ab6cd
Signed-off-by: Jan Kara <jack@suse.cz>
9ab6cd
Signed-off-by: Petr Písař <ppisar@redhat.com>
9ab6cd
---
9ab6cd
 quotasys.c | 16 +++++++++-------
9ab6cd
 1 file changed, 9 insertions(+), 7 deletions(-)
9ab6cd
9ab6cd
diff --git a/quotasys.c b/quotasys.c
9ab6cd
index a5737a8..4b49e0e 100644
9ab6cd
--- a/quotasys.c
9ab6cd
+++ b/quotasys.c
9ab6cd
@@ -459,17 +459,19 @@ void number2str(long long num, char *buf, int format)
9ab6cd
 	int i;
9ab6cd
 	unsigned long long div;
9ab6cd
 	char suffix[8] = " kmgt";
9ab6cd
-	long long anum = num >= 0 ? num : -num;
9ab6cd
 
9ab6cd
-	if (format)
9ab6cd
-		for (i = 4, div = 1000000000000LL; i > 0; i--, div /= 1000)
9ab6cd
-			if (num >= 100*div) {
9ab6cd
-				int sign = num != anum ? -1 : 1;
9ab6cd
+	if (format) {
9ab6cd
+		long long anum = num >= 0 ? num : -num;
9ab6cd
+		int sign = num != anum ? -1 : 1;
9ab6cd
 
9ab6cd
-				sprintf(buf, "%lld%c", (num+div-1) / div * sign,
9ab6cd
+		for (i = 4, div = 1000000000000LL; i > 0; i--, div /= 1000)
9ab6cd
+			if (anum >= 100*div) {
9ab6cd
+				sprintf(buf, "%lld%c",
9ab6cd
+					DIV_ROUND_UP(anum, div) * sign,
9ab6cd
 					suffix[i]);
9ab6cd
 				return;
9ab6cd
 			}
9ab6cd
+	}
9ab6cd
 	sprintf(buf, "%lld", num);
9ab6cd
 }
9ab6cd
 
9ab6cd
@@ -500,7 +502,7 @@ const char *str2number(const char *string, qsize_t *inodes)
9ab6cd
 		return _("Unknown decimal unit. "
9ab6cd
 			"Valid units are k, m, g, t.");
9ab6cd
 	if (number > QSIZE_MAX / multiple ||
9ab6cd
-	    -number < QSIZE_MAX / multiple)
9ab6cd
+	    number < -(QSIZE_MAX / multiple))
9ab6cd
 		return _("Integer overflow while interpreting decimal unit.");
9ab6cd
 	*inodes = number * multiple;
9ab6cd
 	return NULL;
9ab6cd
-- 
9ab6cd
1.9.3
9ab6cd