summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ls.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/src/ls.c b/src/ls.c
index 6c2cefabc..dbbac57b2 100644
--- a/src/ls.c
+++ b/src/ls.c
@@ -2637,8 +2637,17 @@ print_long_format (const struct fileinfo *f)
else
{
char hbuf[LONGEST_HUMAN_READABLE + 1];
+ uintmax_t size = f->stat.st_size;
+
+ /* POSIX requires that the size be printed without a sign, even
+ when negative. Assume the typical case where negative sizes
+ are actually positive values that have wrapped around. */
+ if (sizeof f->stat.st_size < sizeof size)
+ size += ((uintmax_t) (f->stat.st_size < 0)
+ << (sizeof f->stat.st_size * CHAR_BIT));
+
sprintf (p, "%8s ",
- human_readable ((uintmax_t) f->stat.st_size, hbuf, 1,
+ human_readable (size, hbuf, 1,
output_block_size < 0 ? output_block_size : 1));
}