commit dfc94e0221c0b830e49800e25e15c4ccad281b2c
parent 33c5c71e01244a5e8e818cec4ebb6dcab90447bb
Author: Mattias Andrée <maandree@kth.se>
Date: Sun, 27 Mar 2016 14:49:45 +0200
ls: fix segfault when timestamp is out of range for struct tm
Signed-off-by: Mattias Andrée <maandree@kth.se>
Diffstat:
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/ls.c b/ls.c
@@ -118,6 +118,7 @@ output(const struct entry *ent)
{
struct group *gr;
struct passwd *pw;
+ struct tm *tm;
ssize_t len;
size_t l;
char *name, *c, *u, *fmt, buf[BUFSIZ],
@@ -194,7 +195,10 @@ output(const struct entry *ent)
else
fmt = "%b %d %H:%M";
- strftime(buf, sizeof(buf), fmt, localtime(&ent->t.tv_sec));
+ if ((tm = localtime(&ent->t.tv_sec)))
+ strftime(buf, sizeof(buf), fmt, tm);
+ else
+ snprintf(buf, sizeof(buf), "%lld", (long long)(ent->t.tv_sec));
printf("%s %4ld %-8.8s %-8.8s ", mode, (long)ent->nlink, pwname, grname);
if (S_ISBLK(ent->mode) || S_ISCHR(ent->mode))