]> git.ipfire.org Git - thirdparty/krb5.git/commitdiff
Fix minor race in kadmin time interval parsing
authorGreg Hudson <ghudson@mit.edu>
Fri, 22 Apr 2016 19:23:04 +0000 (15:23 -0400)
committerGreg Hudson <ghudson@mit.edu>
Mon, 25 Apr 2016 21:53:19 +0000 (17:53 -0400)
When parsing kadmin time intervals using getdate.y relative time
formats, make sure the same timestamp is added to and substracted from
the relative value.  To accomplish this, rename get_date() to
get_date_rel() with a second parameter for the current time, and make
get_date() a wrapper with the current signature for the benefit of
kdb5_util and kdb5_ldap_util.

ticket: 8393

src/kadmin/cli/getdate.y
src/kadmin/cli/kadmin.c
src/kadmin/cli/kadmin.h

index fc0a403e20596b96c0983c1ee6bb61a331591143..4f0c56f7eb20e614ff6e31d903fecc74fcfd0d57 100644 (file)
@@ -863,10 +863,11 @@ difftm(struct tm *a, struct tm *b)
 #include <krb5.h>
 int yyparse(void);
 
+time_t get_date_rel(char *, time_t);
 time_t get_date(char *);
 
 time_t
-get_date(char *p)
+get_date_rel(char *p, time_t nowtime)
 {
     struct my_timeb    *now = NULL;
     struct tm          *tm, gmt;
@@ -880,7 +881,7 @@ get_date(char *p)
     if (now == NULL) {
         now = &ftz;
 
-       ftz.time = time((time_t *) 0);
+       ftz.time = nowtime;
 
        if (! (tm = gmtime (&ftz.time)))
            return -1;
@@ -1017,6 +1018,13 @@ get_date(char *p)
 }
 
 
+time_t
+get_date(char *p)
+{
+    return get_date_rel(p, time(NULL));
+}
+
+
 #if    defined(TEST)
 
 /* ARGSUSED */
index d791ceeb822ecebc32a2608400146ba6538b2ba0..62786b1e0917971a156ec196d3ce16d5eb7b4908 100644 (file)
@@ -154,11 +154,11 @@ strdate(krb5_timestamp when)
 /* Parse a date string using getdate.y.  On failure, output an error message
  * and return (time_t)-1. */
 static time_t
-parse_date(char *str)
+parse_date(char *str, time_t now)
 {
     time_t date;
 
-    date = get_date(str);
+    date = get_date_rel(str, now);
     if (date == (time_t)-1)
         error(_("Invalid date specification \"%s\".\n"), str);
     return date;
@@ -178,7 +178,7 @@ parse_interval(char *str, time_t now)
     if (krb5_string_to_deltat(str, &delta) == 0)
         return delta;
 
-    date = parse_date(str);
+    date = parse_date(str, now);
     if (date == (time_t)-1)
         return date;
 
@@ -1020,7 +1020,7 @@ kadmin_parse_princ_args(int argc, char *argv[], kadm5_principal_ent_t oprinc,
         if (!strcmp("-expire", argv[i])) {
             if (++i > argc - 2)
                 return -1;
-            date = parse_date(argv[i]);
+            date = parse_date(argv[i], now);
             if (date == (time_t)-1)
                 return -1;
             oprinc->princ_expire_time = date;
@@ -1030,7 +1030,7 @@ kadmin_parse_princ_args(int argc, char *argv[], kadm5_principal_ent_t oprinc,
         if (!strcmp("-pwexpire", argv[i])) {
             if (++i > argc - 2)
                 return -1;
-            date = parse_date(argv[i]);
+            date = parse_date(argv[i], now);
             if (date == (time_t)-1)
                 return -1;
             oprinc->pw_expiration = date;
index 72bda938b1e55651e357af5e0bf73e835658fbcc..54a4818f72d048adec10009220a59d75da2564d5 100644 (file)
@@ -78,7 +78,7 @@ randkey_princ(void *lhandle, krb5_principal princ, krb5_boolean keepold,
 #endif
 #endif
 
-extern time_t get_date(char *);
+extern time_t get_date_rel(char *, time_t);
 
 /* Yucky global variables */
 extern krb5_context context;