Author: emaste
Date: Thu Jul 20 15:28:48 2017
New Revision: 321293
URL: https://svnweb.freebsd.org/changeset/base/321293

Log:
  date: avoid crash on invalid time
  
  localtime(3) returns NULL when passed an invalid time_t but date(1)
  previously did not handle it. Exit with an error in that case.
  
  PR:           220828
  Reported by:  Vinícius Zavam
  Reviewed by:  cem, kevans
  Sponsored by: The FreeBSD Foundation
  Differential Revision:        https://reviews.freebsd.org/D11660

Modified:
  head/bin/date/date.c

Modified: head/bin/date/date.c
==============================================================================
--- head/bin/date/date.c        Thu Jul 20 14:50:13 2017        (r321292)
+++ head/bin/date/date.c        Thu Jul 20 15:28:48 2017        (r321293)
@@ -85,7 +85,7 @@ main(int argc, char *argv[])
        int set_timezone;
        struct vary *v;
        const struct vary *badv;
-       struct tm lt;
+       struct tm *lt;
        struct stat sb;
 
        v = NULL;
@@ -174,8 +174,10 @@ main(int argc, char *argv[])
        if (*argv && **argv == '+')
                format = *argv + 1;
 
-       lt = *localtime(&tval);
-       badv = vary_apply(v, &lt);
+       lt = localtime(&tval);
+       if (lt == NULL)
+               errx(1, "invalid time");
+       badv = vary_apply(v, lt);
        if (badv) {
                fprintf(stderr, "%s: Cannot apply date adjustment\n",
                        badv->arg);
@@ -191,7 +193,7 @@ main(int argc, char *argv[])
                 */
                setlocale(LC_TIME, "C");
 
-       (void)strftime(buf, sizeof(buf), format, &lt);
+       (void)strftime(buf, sizeof(buf), format, lt);
        (void)printf("%s\n", buf);
        if (fflush(stdout))
                err(1, "stdout");
@@ -210,6 +212,8 @@ setthetime(const char *fmt, const char *p, int jflag, 
        int century;
 
        lt = localtime(&tval);
+       if (lt == NULL)
+               errx(1, "invalid time");
        lt->tm_isdst = -1;              /* divine correct DST */
 
        if (fmt != NULL) {
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to