mirror of
https://github.com/openssl/openssl.git
synced 2024-11-21 01:15:20 +08:00
VMS: compensate for gmtime_r() parameter pointer size
With VMS C, the second parameter takes a 32-bit pointer. When building with 64-bit pointer size default, we must compensate. Reviewed-by: Andy Polyakov <appro@openssl.org> (Merged from https://github.com/openssl/openssl/pull/2811)
This commit is contained in:
parent
15d95dd7ea
commit
48ce800aa5
@ -15,7 +15,29 @@ struct tm *OPENSSL_gmtime(const time_t *timer, struct tm *result)
|
|||||||
{
|
{
|
||||||
struct tm *ts = NULL;
|
struct tm *ts = NULL;
|
||||||
|
|
||||||
#if defined(OPENSSL_THREADS) && !defined(OPENSSL_SYS_WIN32) && !defined(OPENSSL_SYS_MACOSX)
|
#if defined(OPENSSL_THREADS) && defined(OPENSSL_SYS_VMS)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* On VMS, gmtime_r() takes a 32-bit pointer as second argument.
|
||||||
|
* Since we can't know that |result| is in a space that can easily
|
||||||
|
* translate to a 32-bit pointer, we must store temporarly on stack
|
||||||
|
* and copy the result. The stack is always reachable with 32-bit
|
||||||
|
* pointers.
|
||||||
|
*/
|
||||||
|
#if defined(OPENSSL_SYS_VMS) && __INITIAL_POINTER_SIZE
|
||||||
|
# pragma pointer_size save
|
||||||
|
# pragma pointer_size 32
|
||||||
|
#endif
|
||||||
|
struct tm data, *ts2 = &data;
|
||||||
|
#if defined OPENSSL_SYS_VMS && __INITIAL_POINTER_SIZE
|
||||||
|
# pragma pointer_size restore
|
||||||
|
#endif
|
||||||
|
if (gmtime_r(timer, ts2) == NULL)
|
||||||
|
return NULL;
|
||||||
|
memcpy(result, ts2, sizeof(struct tm));
|
||||||
|
ts = result;
|
||||||
|
}
|
||||||
|
#elif defined(OPENSSL_THREADS) && !defined(OPENSSL_SYS_WIN32) && !defined(OPENSSL_SYS_MACOSX)
|
||||||
if (gmtime_r(timer, result) == NULL)
|
if (gmtime_r(timer, result) == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
ts = result;
|
ts = result;
|
||||||
|
Loading…
Reference in New Issue
Block a user