libc: Sync asctime.c and localtime.c with tzcode2010a from elsie.
authorSascha Wildner <saw@online.de>
Thu, 18 Feb 2010 02:41:04 +0000 (03:41 +0100)
committerSascha Wildner <saw@online.de>
Thu, 18 Feb 2010 02:41:04 +0000 (03:41 +0100)
asctime.c:   Set errno to EINVAL and return "??? ??? ?? ??:??:?? ????\n" if
             asctime_r() is called with a NULL struct tm pointer.
             (Note that asctime_r() is called by ctime_r() and asctime();
             asctime() is called by ctime().)

localtime.c: Set errno to EINVAL and return WRONG if time1() is called with
             a NULL struct tm pointer; avoid dereference if a NULL struct
             tm pointer is passed to timelocal(), timegm(), or timeoff().
             (Note that time1 is called by mktime(), timegm(), and timeoff();
             mktime is called by timelocal().)

lib/libc/stdtime/asctime.c
lib/libc/stdtime/localtime.c

index 83c7170..84ac474 100644 (file)
@@ -8,9 +8,8 @@
 ** the output of strftime is supposed to be locale specific
 ** whereas the output of asctime is supposed to be constant.
 **
-** @(#)asctime.c       8.2
+** @(#)asctime.c       8.5
 ** $FreeBSD: src/lib/libc/stdtime/asctime.c,v 1.7.6.1 2001/03/05 11:37:20 obrien Exp $
-** $DragonFly: src/lib/libc/stdtime/asctime.c,v 1.6 2008/10/19 20:15:58 swildner Exp $
 */
 /*LINTLIBRARY*/
 
@@ -89,6 +88,10 @@ asctime_r(const struct tm *timeptr, char *buf)
        const char *    wn;
        const char *    mn;
 
+       if (timeptr == NULL) {
+               errno = EINVAL;
+               return strcpy(buf, "??? ??? ?? ??:??:?? ????\n");
+       }
        if (timeptr->tm_wday < 0 || timeptr->tm_wday >= DAYSPERWEEK)
                wn = "???";
        else    wn = wday_name[timeptr->tm_wday];
@@ -109,8 +112,7 @@ asctime_r(const struct tm *timeptr, char *buf)
                timeptr->tm_min, timeptr->tm_sec,
                year);
        if (strlen(result) < STD_ASCTIME_BUF_SIZE || buf == buf_asctime) {
-               (void) strcpy(buf, result);
-               return buf;
+               return strcpy(buf, result);
        } else {
                errno = EOVERFLOW;
                return NULL;
index 85efeec..8ce9749 100644 (file)
@@ -2,9 +2,8 @@
 ** This file is in the public domain, so clarified as of
 ** 1996-06-05 by Arthur David Olson.
 **
-** @(#)localtime.c     8.9
+** @(#)localtime.c     8.10
 ** $FreeBSD: src/lib/libc/stdtime/localtime.c,v 1.25.2.2 2002/08/13 16:08:07 bmilekic Exp $
-** $DragonFly: src/lib/libc/stdtime/localtime.c,v 1.7 2008/10/19 20:15:58 swildner Exp $
 */
 
 /*
@@ -1867,6 +1866,10 @@ time1(struct tm * const tmp,
        int                     types[TZ_MAX_TYPES];
        int                     okay;
 
+       if (tmp == NULL) {
+               errno = EINVAL;
+               return WRONG;
+       }
        if (tmp->tm_isdst > 1)
                tmp->tm_isdst = 1;
        t = time2(tmp, funcp, offset, &okay);
@@ -1931,21 +1934,24 @@ mktime(struct tm * const tmp)
 time_t
 timelocal(struct tm * const tmp)
 {
-       tmp->tm_isdst = -1;     /* in case it wasn't initialized */
+       if (tmp != NULL)
+               tmp->tm_isdst = -1;     /* in case it wasn't initialized */
        return mktime(tmp);
 }
 
 time_t
 timegm(struct tm * const tmp)
 {
-       tmp->tm_isdst = 0;
+       if (tmp != NULL)
+               tmp->tm_isdst = 0;
        return time1(tmp, gmtsub, 0L);
 }
 
 time_t
 timeoff(struct tm * const tmp, const long offset)
 {
-       tmp->tm_isdst = 0;
+       if (tmp != NULL)
+               tmp->tm_isdst = 0;
        return time1(tmp, gmtsub, offset);
 }