summaryrefslogtreecommitdiffstats
path: root/crypto/o_time.c
diff options
context:
space:
mode:
authorRichard Levitte <levitte@openssl.org>2017-03-01 10:33:20 +0100
committerRichard Levitte <levitte@openssl.org>2017-03-01 11:46:23 +0100
commit48ce800aa5a2ccee204ad3960a20c4ca14acb3a1 (patch)
treec9cfd7a4425b3f089aff7159607fa5a1d3daf2f4 /crypto/o_time.c
parent15d95dd7ea77e68bf9d8450e52230a6017735ec0 (diff)
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)
Diffstat (limited to 'crypto/o_time.c')
-rwxr-xr-xcrypto/o_time.c24
1 files changed, 23 insertions, 1 deletions
diff --git a/crypto/o_time.c b/crypto/o_time.c
index aa74340c7a..3690232505 100755
--- a/crypto/o_time.c
+++ b/crypto/o_time.c
@@ -15,7 +15,29 @@ 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_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)
return NULL;
ts = result;