fix strptime output for %C without %y
authorJulien Ramseier <j.ramseier@gmail.com>
Tue, 21 Mar 2017 16:35:16 +0000 (12:35 -0400)
committerRich Felker <dalias@aerifal.cx>
Tue, 21 Mar 2017 16:35:16 +0000 (12:35 -0400)
in this case, a potentially-uninitialized or unrelated existing value
in tm_year was being used. instead use 0 if %y was not present.

src/time/strptime.c

index cff0a7c11a767a3b30a29dc0c294bb193a6df3de..c54a0d8c4c52eaa03e5fc4830004225dadb6b445 100644 (file)
@@ -11,7 +11,7 @@ char *strptime(const char *restrict s, const char *restrict f, struct tm *restri
        int i, w, neg, adj, min, range, *dest, dummy;
        const char *ex;
        size_t len;
-       int want_century = 0, century = 0;
+       int want_century = 0, century = 0, relyear = 0;
        while (*f) {
                if (*f != '%') {
                        if (isspace(*f)) for (; *s && isspace(*s); s++);
@@ -144,7 +144,7 @@ char *strptime(const char *restrict s, const char *restrict f, struct tm *restri
                        if (!s) return 0;
                        break;
                case 'y':
-                       dest = &tm->tm_year;
+                       dest = &relyear;
                        w = 2;
                        want_century |= 1;
                        goto numeric_digits;
@@ -198,6 +198,7 @@ char *strptime(const char *restrict s, const char *restrict f, struct tm *restri
                }
        }
        if (want_century) {
+               tm->tm_year = relyear;
                if (want_century & 2) tm->tm_year += century * 100 - 1900;
                else if (tm->tm_year <= 68) tm->tm_year += 100;
        }