diff options
author | Damien Miller <djm@mindrot.org> | 2010-03-03 12:14:15 +1100 |
---|---|---|
committer | Damien Miller <djm@mindrot.org> | 2010-03-03 12:14:15 +1100 |
commit | 2ca342b84bca89e35931cbe34f19d7ab4d200d9b (patch) | |
tree | 63d80ed117f814dc1cc4468a0f0233279a245a51 | |
parent | fb84e5950e34a65e53ecb893af2fa2a3d6cce229 (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.c | 24 |
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); |