summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordjm <djm>2010-03-03 01:14:15 +0000
committerdjm <djm>2010-03-03 01:14:15 +0000
commit7a9ebb6fe195d7f8cf9bcecf0c95bf6b3f7efc73 (patch)
tree7748aeb5b1c57737397abe4e85adf78e9e9ac0d2
parent05feeb2ca8376a2de83916129b0f4f7fc3cb71a4 (diff)
downloadopenssh-7a9ebb6fe195d7f8cf9bcecf0c95bf6b3f7efc73.tar.gz
- djm@cvs.openbsd.org 2010/03/02 23:20:57
[ssh-keygen.c] POSIX strptime is stricter than OpenBSD's so do a little dance to appease it.
-rw-r--r--ssh-keygen.c24
1 files changed, 20 insertions, 4 deletions
diff --git a/ssh-keygen.c b/ssh-keygen.c
index 60261c21..7dc10808 100644
--- a/ssh-keygen.c
+++ b/ssh-keygen.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ssh-keygen.c,v 1.179 2010/02/26 20:29:54 djm Exp $ */
+/* $OpenBSD: ssh-keygen.c,v 1.180 2010/03/02 23:20:57 djm Exp $ */
/*
* Author: Tatu Ylonen <ylo@cs.hut.fi>
* Copyright (c) 1994 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -1243,13 +1243,29 @@ parse_absolute_time(const char *s)
{
struct tm tm;
time_t tt;
+ char buf[32], *fmt;
- if (strlen(s) != 8 && strlen(s) != 14)
+ /*
+ * POSIX strptime says "The application shall ensure that there
+ * is white-space or other non-alphanumeric characters between
+ * any two conversion specifications" so arrange things this way.
+ */
+ switch (strlen(s)) {
+ case 8:
+ fmt = "%Y/%m/%d";
+ snprintf(buf, sizeof(buf), "%.4s/%.2s/%.2s", s, s + 4, s + 6);
+ break;
+ case 14:
+ fmt = "%Y/%m/%d %H:%M:%S";
+ snprintf(buf, sizeof(buf), "%.4s/%.2s/%.2s %.2s:%.2s:%.2s",
+ s, s + 4, s + 6, s + 8, s + 10, s + 12);
+ break;
+ default:
fatal("Invalid certificate time format %s", s);
+ }
bzero(&tm, sizeof(tm));
- if (strptime(s,
- strlen(s) == 8 ? "%Y%m%d" : "%Y%m%d%H%M%S", &tm) == NULL)
+ if (strptime(buf, fmt, &tm) == NULL)
fatal("Invalid certificate time %s", s);
if ((tt = mktime(&tm)) < 0)
fatal("Certificate time %s cannot be represented", s);