提交 0176fc78 编写于 作者: J John Baldwin 提交者: Matt Caswell

asn1_string_to_time_t: Use timegm on FreeBSD.

FreeBSD does not provide a global timezone variable containing the
offset to UTC.  Instead, FreeBSD's libc includes a legacy timezone
function dating back to Version 7 AT&T UNIX.  As a result,
asn1_string_to_time_t currently fails to compile on FreeBSD as it
subtracts a function from a time_t value:

../crypto/asn1/a_time.c:625:37: error: invalid operands to binary expression ('time_t' (aka 'long') and 'char *(int, int)')
    timestamp_utc = timestamp_local - timezone;
                    ~~~~~~~~~~~~~~~ ^ ~~~~~~~~
1 error generated.

However, FreeBSD's libc does include a non-standard (but widely
available) timegm function which converts a struct tm directly to a
UTC time_t value.  Use this on FreeBSD instead of mktime.
Reviewed-by: NPaul Dale <pauli@openssl.org>
Reviewed-by: NMatt Caswell <matt@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/17765)
上级 06544216
......@@ -597,11 +597,17 @@ int ASN1_TIME_compare(const ASN1_TIME *a, const ASN1_TIME *b)
# define timezone _timezone
#endif
#ifdef __FreeBSD__
# define USE_TIMEGM
#endif
time_t asn1_string_to_time_t(const char *asn1_string)
{
ASN1_TIME *timestamp_asn1 = NULL;
struct tm *timestamp_tm = NULL;
#ifndef USE_TIMEGM
time_t timestamp_local;
#endif
time_t timestamp_utc;
timestamp_asn1 = ASN1_TIME_new();
......@@ -619,10 +625,15 @@ time_t asn1_string_to_time_t(const char *asn1_string)
return -1;
}
#ifdef USE_TIMEGM
timestamp_utc = timegm(timestamp_tm);
OPENSSL_free(timestamp_tm);
#else
timestamp_local = mktime(timestamp_tm);
OPENSSL_free(timestamp_tm);
timestamp_utc = timestamp_local - timezone;
#endif
ASN1_TIME_free(timestamp_asn1);
return timestamp_utc;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册