summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDamien Miller <djm@mindrot.org>2010-03-03 12:14:15 +1100
committerDamien Miller <djm@mindrot.org>2010-03-03 12:14:15 +1100
commit2ca342b84bca89e35931cbe34f19d7ab4d200d9b (patch)
tree63d80ed117f814dc1cc4468a0f0233279a245a51
parentfb84e5950e34a65e53ecb893af2fa2a3d6cce229 (diff)
- 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);