|
|
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 |
|