diff options
author | Theodore Tso <tytso@mit.edu> | 1998-05-09 03:19:46 +0000 |
---|---|---|
committer | Theodore Tso <tytso@mit.edu> | 1998-05-09 03:19:46 +0000 |
commit | 7dc329563673ca549c1d49460faf4925e2ccec47 (patch) | |
tree | 372f2e1f9a1f246e40b94da758870cc57b1914d0 /src | |
parent | acd6905057e98ed0e7842bbf2a98c9ea9fe7902a (diff) | |
download | krb5-7dc329563673ca549c1d49460faf4925e2ccec47.tar.gz krb5-7dc329563673ca549c1d49460faf4925e2ccec47.tar.xz krb5-7dc329563673ca549c1d49460faf4925e2ccec47.zip |
str_conv.c (krb5_string_to_timestamp, strptime): Fix routines to be
able to properly parse Y2K dates.
t_kerb.c: Add ability to test krb5_string_to_timestamp
git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@10559 dc483132-0cff-0310-8789-dd5450dbe970
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/krb5/krb/ChangeLog | 7 | ||||
-rw-r--r-- | src/lib/krb5/krb/Makefile.in | 2 | ||||
-rw-r--r-- | src/lib/krb5/krb/str_conv.c | 89 | ||||
-rw-r--r-- | src/lib/krb5/krb/t_kerb.c | 22 |
4 files changed, 98 insertions, 22 deletions
diff --git a/src/lib/krb5/krb/ChangeLog b/src/lib/krb5/krb/ChangeLog index 434459f9ac..9cc9d761c4 100644 --- a/src/lib/krb5/krb/ChangeLog +++ b/src/lib/krb5/krb/ChangeLog @@ -1,3 +1,10 @@ +1998-05-08 Theodore Ts'o <tytso@rsts-11.mit.edu> + + * str_conv.c (krb5_string_to_timestamp, strptime): Fix routines to + be able to properly parse Y2K dates. + + * t_kerb.c: Add ability to test krb5_string_to_timestamp + 1998-05-06 Theodore Ts'o <tytso@rsts-11.mit.edu> * t_ser.c (main): POSIX states that getopt returns -1 diff --git a/src/lib/krb5/krb/Makefile.in b/src/lib/krb5/krb/Makefile.in index a13099cf52..ec6384e072 100644 --- a/src/lib/krb5/krb/Makefile.in +++ b/src/lib/krb5/krb/Makefile.in @@ -268,7 +268,7 @@ COMERRLIB=$(TOPLIBD)/libcom_err.a T_WALK_RTREE_OBJS= t_walk_rtree.o walk_rtree.o tgtname.o unparse.o \ free_rtree.o bld_pr_ext.o -T_KERB_OBJS= t_kerb.o conv_princ.o unparse.o set_realm.o +T_KERB_OBJS= t_kerb.o conv_princ.o unparse.o set_realm.o str_conv.o T_SER_OBJS= t_ser.o ser_actx.o ser_adata.o ser_addr.o ser_auth.o ser_cksum.o \ ser_ctx.o ser_eblk.o ser_key.o ser_princ.o serialize.o diff --git a/src/lib/krb5/krb/str_conv.c b/src/lib/krb5/krb/str_conv.c index d8b2e6d94d..c059f838e0 100644 --- a/src/lib/krb5/krb/str_conv.c +++ b/src/lib/krb5/krb/str_conv.c @@ -133,6 +133,8 @@ static const char cstype_hmacsha_out[] = "HMAC-SHA"; /* Absolute time strings */ static const char atime_full_digits[] = "%y%m%d%H%M%S"; static const char atime_full_digits_d[] = "%y.%m.%d.%H.%M.%S"; +static const char atime_full_digits_Y[] = "%Y%m%d%H%M%S"; +static const char atime_full_digits_Yd[]= "%Y.%m.%d.%H.%M.%S"; static const char atime_nsec_digits[] = "%y%m%d%H%M"; static const char atime_rel_hms[] = "%H%M%S"; static const char atime_rel_hm[] = "%H%M"; @@ -144,6 +146,8 @@ static const char atime_full_text_nos[] = "%d-%b-%Y:%R"; #if !HAVE_STRPTIME static const char ascan_full_digits[] = "%02d%02d%02d%02d%02d%02d"; static const char ascan_full_digits_d[] = "%02d.%02d.%02d.%02d.%02d.%02d"; +static const char ascan_full_digits_Y[] = "%4d%02d%02d%02d%02d%02d"; +static const char ascan_full_digits_Yd[]= "%4d.%02d.%02d.%02d.%02d.%02d"; static const char ascan_nsec_digits[] = "%02d%02d%02d%02d%02d"; static const char ascan_rel_hms[] = "%02d%02d%02d"; static const char ascan_rel_hm[] = "%02d%02d"; @@ -223,6 +227,8 @@ static const int cksumtype_table_nents = sizeof(cksumtype_table)/ sizeof(cksumtype_table[0]); static const char * const atime_format_table[] = { +atime_full_digits_Y, /* yyyymmddhhmmss */ +atime_full_digits_Yd, /* yyyy.mm.dd.hh.mm.ss */ atime_full_digits, /* yymmddhhmmss */ atime_full_digits_d, /* yy.mm.dd.hh.mm.ss */ atime_nsec_digits, /* yymmddhhmm */ @@ -282,6 +288,8 @@ strptime(buf, format, tm) /* * We only understand the following fixed formats: + * %Y%m%d%H%M%S + * %Y.%m.%d.%H.%M.%S * %y%m%d%H%M%S * %y.%m.%d.%H.%M.%S * %y%m%d%H%M @@ -291,9 +299,37 @@ strptime(buf, format, tm) * %R */ bp = (char *) NULL; - if (!strcmp(format, atime_full_digits) && + if (!strcmp(format, atime_full_digits_Y) && + (sscanf(buf, ascan_full_digits_Y, + &year, &month, &day, &hour, &minute, &second) == 6)) { + if (year < 1900) + return NULL; + tm->tm_year = year-1900; + tm->tm_mon = month - 1; + tm->tm_mday = day; + tm->tm_hour = hour; + tm->tm_min = minute; + tm->tm_sec = second; + bp = &buf[strlen(atime_full_digits)]; + } + else if (!strcmp(format,atime_full_digits_Yd) && + (sscanf(buf, ascan_full_digits_Yd, + &year, &month, &day, &hour, &minute, &second) == 6)) { + if (year < 1900) + return NULL; + tm->tm_year = year-1900; + tm->tm_mon = month - 1; + tm->tm_mday = day; + tm->tm_hour = hour; + tm->tm_min = minute; + tm->tm_sec = second; + bp = &buf[strlen(atime_full_digits_d)]; + } + else if (!strcmp(format, atime_full_digits) && (sscanf(buf, ascan_full_digits, &year, &month, &day, &hour, &minute, &second) == 6)) { + if (year <= 68) + year += 100; tm->tm_year = year; tm->tm_mon = month - 1; tm->tm_mday = day; @@ -305,6 +341,8 @@ strptime(buf, format, tm) else if (!strcmp(format,atime_full_digits_d) && (sscanf(buf, ascan_full_digits_d, &year, &month, &day, &hour, &minute, &second) == 6)) { + if (year <= 68) + year += 100; tm->tm_year = year; tm->tm_mon = month - 1; tm->tm_mday = day; @@ -316,6 +354,8 @@ strptime(buf, format, tm) else if (!strcmp(format, atime_nsec_digits) && (sscanf(buf, ascan_nsec_digits, &year, &month, &day, &hour, &minute) == 5)) { + if (year <= 68) + year += 100; tm->tm_year = year; tm->tm_mon = month - 1; tm->tm_mday = day; @@ -357,8 +397,9 @@ strptime(buf, format, tm) tm->tm_hour = hour; tm->tm_min = minute; bp = &buf[strlen(atime_rel_col_hm)]; - } - return(bp); + } else + return NULL; + return bp; } #endif /* HAVE_STRPTIME */ @@ -430,12 +471,10 @@ krb5_string_to_timestamp(string, timestampp) krb5_timestamp FAR * timestampp; { int i; - int found; struct tm timebuf; - time_t now; + time_t now, ret_time; char *s; - found = 0; now = time((time_t *) NULL); for (i=0; i<atime_format_table_nents; i++) { /* We reset every time throughout the loop as the manual page @@ -445,13 +484,16 @@ krb5_string_to_timestamp(string, timestampp) memcpy(&timebuf, localtime(&now), sizeof(timebuf)); if ((s = strptime(string, atime_format_table[i], &timebuf)) && (s != string)) { - found = 1; - break; + if (timebuf.tm_year <= 0) + continue; /* clearly confused */ + ret_time = mktime(&timebuf); + if (ret_time == (time_t) -1) + continue; /* clearly confused */ + *timestampp = (krb5_timestamp) ret_time; + return 0; } } - if (found) - *timestampp = (krb5_timestamp) mktime(&timebuf); - return((found) ? 0 : EINVAL); + return(EINVAL); } KRB5_DLLIMP krb5_error_code KRB5_CALLCONV @@ -590,18 +632,23 @@ krb5_timestamp_to_string(timestamp, buffer, buflen) size_t buflen; { #if HAVE_STRFTIME - if (strftime(buffer, buflen, "%c", localtime((time_t *) ×tamp))) - return(0); - else + int ret; + + ret = strftime(buffer, buflen, "%c", localtime((time_t *) ×tamp)); + if (ret == 0 || ret == buflen) return(ENOMEM); + return(0); #else /* HAVE_STRFTIME */ - if (strlen(ctime((time_t *) ×tamp)) <= buflen) { - strcpy(buffer, ctime((time_t *) ×tamp)); - /* ctime returns <datestring>\n\0 */ - buffer[strlen(buffer)-1] = '\0'; - return(0); - } - return(ENOMEM); + char *cp; + time_t t = timestamp; + + cp = ctime(&t); + if (strlen(cp) >= buflen) + return ENOMEM; + strcpy(buffer, cp); + /* ctime returns <datestring>\n\0 */ + buffer[strlen(buffer)-1] = '\0'; + return(0); #endif /* HAVE_STRFTIME */ } diff --git a/src/lib/krb5/krb/t_kerb.c b/src/lib/krb5/krb/t_kerb.c index 45c5e2e2d1..2feef39dd6 100644 --- a/src/lib/krb5/krb/t_kerb.c +++ b/src/lib/krb5/krb/t_kerb.c @@ -7,6 +7,7 @@ #include <stdio.h> #include <stdlib.h> #include <unistd.h> +#include <time.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> @@ -14,6 +15,22 @@ #include "com_err.h" +void test_string_to_timestamp(ctx, time) + krb5_context ctx; + char *time; +{ + krb5_timestamp timestamp; + time_t t; + krb5_error_code retval; + + retval = krb5_string_to_timestamp(time, ×tamp); + if (retval) { + com_err("krb5_string_to_timestamp", retval, 0); + return; + } + t = (time_t) timestamp; + printf("Parsed time was %s", ctime(&t)); +} void test_425_conv_principal(ctx, name, inst, realm) krb5_context ctx; @@ -116,6 +133,7 @@ void usage(progname) progname, progname); fprintf(stderr, "\t%s parse_name <name>\n", progname); fprintf(stderr, "\t%s set_realm <name> <realm>\n", progname); + fprintf(stderr, "\t%s string_to_timestamp <time>\n", progname); exit(1); } @@ -164,6 +182,10 @@ main(argc, argv) if (!argc) usage(progname); realm = *argv; test_set_realm(ctx, name, realm); + } else if (strcmp(*argv, "string_to_timestamp") == 0) { + argc--; argv++; + if (!argc) usage(progname); + test_string_to_timestamp(ctx, *argv); } else usage(progname); |