Commit 8552d918 authored by Jonathan Scalise's avatar Jonathan Scalise Committed by Richard Levitte
Browse files

Changed OPENSSL_gmtime so macOS uses threadsafe gmtime_r instead of gmtime.



Updated uses of gmtime to now call OPENSSL_gmtime instead.

Used similar preprocessor logic to make sure localtime_r is called instead
of localtime when applicable.

Reviewed-by: default avatarRich Salz <rsalz@openssl.org>
Reviewed-by: default avatarRichard Levitte <levitte@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/3609)
parent 87489337
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -633,6 +633,7 @@ static void print_leak_doall_arg(const MEM *m, MEM_LEAK *l)
    APP_INFO *amip;
    int ami_cnt;
    struct tm *lcl = NULL;
    struct tm result = {0};
    CRYPTO_THREADID ti;

#define BUF_REMAIN (sizeof(buf) - (size_t)(bufp - buf))
@@ -641,8 +642,13 @@ static void print_leak_doall_arg(const MEM *m, MEM_LEAK *l)
        return;

    if (options & V_CRYPTO_MDEBUG_TIME) {
# if defined(OPENSSL_THREADS) && !defined(OPENSSL_SYS_WIN32) && \
            !defined(OPENSSL_SYS_OS2) && !defined(OPENSSL_SYS_SUNOS) && \
            (!defined(OPENSSL_SYS_VMS) || defined(localtime_r))
        lcl = localtime_r(&m->time, &result);
# else
        lcl = localtime(&m->time);

# endif
        BIO_snprintf(bufp, BUF_REMAIN, "[%02d:%02d:%02d] ",
                     lcl->tm_hour, lcl->tm_min, lcl->tm_sec);
        bufp += strlen(bufp);
+1 −1
Original line number Diff line number Diff line
@@ -105,7 +105,7 @@ struct tm *OPENSSL_gmtime(const time_t *timer, struct tm *result)
{
    struct tm *ts = NULL;

#if defined(OPENSSL_THREADS) && !defined(OPENSSL_SYS_WIN32) && !defined(OPENSSL_SYS_OS2) && (!defined(OPENSSL_SYS_VMS) || defined(gmtime_r)) && !defined(OPENSSL_SYS_MACOSX) && !defined(OPENSSL_SYS_SUNOS)
#if defined(OPENSSL_THREADS) && !defined(OPENSSL_SYS_WIN32) && !defined(OPENSSL_SYS_OS2) && (!defined(OPENSSL_SYS_VMS) || defined(gmtime_r)) && !defined(OPENSSL_SYS_SUNOS)
    if (gmtime_r(timer, result) == NULL)
        return NULL;
    ts = result;
+3 −1
Original line number Diff line number Diff line
@@ -58,6 +58,7 @@
 */

#include "cryptlib.h"
#include "o_time.h"

#if defined(OPENSSL_SYS_UNIX)
# include <sys/time.h>
@@ -948,6 +949,7 @@ static ASN1_GENERALIZEDTIME
{
    time_t time_sec = (time_t)sec;
    struct tm *tm = NULL;
    struct tm result = {0};
    char genTime_str[17 + TS_MAX_CLOCK_PRECISION_DIGITS];
    char *p = genTime_str;
    char *p_end = genTime_str + sizeof(genTime_str);
@@ -955,7 +957,7 @@ static ASN1_GENERALIZEDTIME
    if (precision > TS_MAX_CLOCK_PRECISION_DIGITS)
        goto err;

    if (!(tm = gmtime(&time_sec)))
    if (!(tm = OPENSSL_gmtime(&time_sec, &result)))
        goto err;

    /*
+12 −1
Original line number Diff line number Diff line
@@ -78,6 +78,7 @@
#include <openssl/evp.h>
#include <openssl/objects.h>
#include <openssl/krb5_asn.h>
#include "o_time.h"
#include "kssl_lcl.h"

#ifndef OPENSSL_NO_KRB5
@@ -2026,6 +2027,8 @@ krb5_error_code kssl_check_authent(
    int outl, unencbufsize;
    struct tm tm_time, *tm_l, *tm_g;
    time_t now, tl, tg, tr, tz_offset;
    struct tm gmt_result = {0};
    struct tm lt_result = {0};

    EVP_CIPHER_CTX_init(&ciph_ctx);
    *atimep = 0;
@@ -2140,9 +2143,17 @@ krb5_error_code kssl_check_authent(
    if (k_gmtime(auth->ctime, &tm_time) &&
        ((tr = mktime(&tm_time)) != (time_t)(-1))) {
        now = time(&now);
        tm_g = OPENSSL_gmtime(&now, &gmt_result);

# if defined(OPENSSL_THREADS) && !defined(OPENSSL_SYS_WIN32) && \
            !defined(OPENSSL_SYS_OS2) && !defined(OPENSSL_SYS_SUNOS) && \
            (!defined(OPENSSL_SYS_VMS) || defined(localtime_r))
        tm_l = localtime_r(&now, &lt_result);
# else
        tm_l = localtime(&now);
# endif

        tl = mktime(tm_l);
        tm_g = gmtime(&now);
        tg = mktime(tm_g);
        tz_offset = tg - tl;