mirror of
https://github.com/postgres/postgres.git
synced 2025-06-10 00:01:28 -04:00
Fix pg_size_pretty() to avoid overflow for inputs close to INT64_MAX.
The expression that tried to round the value to the nearest TB could overflow, leading to bogus output as reported in bug #5993 from Nicola Cossu. This isn't likely to ever happen in the intended usage of the function (if it could, we'd be needing to use a wider datatype instead); but it's not hard to give the expected output, so let's do so.
This commit is contained in:
parent
3c34d7ee8e
commit
049e8b07fa
@ -427,9 +427,15 @@ pg_size_pretty(PG_FUNCTION_ARGS)
|
|||||||
(size + mult / 2) / mult);
|
(size + mult / 2) / mult);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
/* Here we have to worry about avoiding overflow */
|
||||||
|
int64 val;
|
||||||
|
|
||||||
mult *= 1024;
|
mult *= 1024;
|
||||||
|
val = size / mult;
|
||||||
|
if ((size % mult) >= (mult / 2))
|
||||||
|
val++;
|
||||||
snprintf(VARDATA(result), 50, INT64_FORMAT " TB",
|
snprintf(VARDATA(result), 50, INT64_FORMAT " TB",
|
||||||
(size + mult / 2) / mult);
|
val);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user