From 5848be0488c20591892f82a7c79c6d1637518b96 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Thu, 29 Mar 2018 10:34:11 +0200 Subject: [PATCH] Fix setbuf use for VMS C The VMS C RTL has setbuf() working for short pointers only, probably the FILE pointer will always be in P0 (the lower 4GB). Fortunately, this only generates a warning about possible data loss (doesn't apply in this case) that we can simply turn off. Reviewed-by: Tim Hudson (Merged from https://github.com/openssl/openssl/pull/5789) --- crypto/rand/randfile.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/crypto/rand/randfile.c b/crypto/rand/randfile.c index fa6f49e1b5..99a3f1424c 100644 --- a/crypto/rand/randfile.c +++ b/crypto/rand/randfile.c @@ -99,6 +99,17 @@ int RAND_load_file(const char *file, long bytes) if (!S_ISREG(sb.st_mode) && bytes < 0) bytes = 256; +#endif + /* + * On VMS, setbuf() will only take 32-bit pointers, and a compilation + * with /POINTER_SIZE=64 will give off a MAYLOSEDATA2 warning here. + * However, we trust that the C RTL will never give us a FILE pointer + * above the first 4 GB of memory, so we simply turn off the warning + * temporarily. + */ +#if defined(OPENSSL_SYS_VMS) && defined(__DECC) +# pragma environment save +# pragma message disable maylosedata2 #endif /* * Don't buffer, because even if |file| is regular file, we have @@ -106,6 +117,9 @@ int RAND_load_file(const char *file, long bytes) * contents lying around? */ setbuf(in, NULL); +#if defined(OPENSSL_SYS_VMS) && defined(__DECC) +# pragma environment restore +#endif for ( ; ; ) { if (bytes > 0) -- 2.25.1