aboutsummaryrefslogtreecommitdiffstats
path: root/crypto/rand/randfile.c
diff options
context:
space:
mode:
Diffstat (limited to 'crypto/rand/randfile.c')
-rw-r--r--crypto/rand/randfile.c48
1 files changed, 35 insertions, 13 deletions
diff --git a/crypto/rand/randfile.c b/crypto/rand/randfile.c
index d01b9852e94..658a8d6b65f 100644
--- a/crypto/rand/randfile.c
+++ b/crypto/rand/randfile.c
@@ -133,20 +133,35 @@ int RAND_write_file(const char *file)
int i,ret=0,err=0;
FILE *out = NULL;
int n;
-
-#if defined(O_CREAT) && !defined(WIN32)
- /* For some reason Win32 can't write to files created this way */
-
- /* chmod(..., 0600) is too late to protect the file,
- * permissions should be restrictive from the start */
- int fd = open(file, O_CREAT, 0600);
- if (fd != -1)
- out = fdopen(fd, "wb");
+
+#ifdef VMS
+ /* Under VMS, fopen(file, "wb") will create a new version of the
+ same file. This is not good, so let's try updating an existing
+ one, and create file only if it doesn't already exist. */
+ /* At the same time, if we just update a file, we also need to
+ truncate it, and unfortunately, ftruncate() and truncate() do
+ not exist everywhere. All that remains is to delete old versions
+ of the random data file (done at the end). */
+#if 0
+ out=fopen(file,"rb+");
+ if (out == NULL && errno != ENOENT)
+ goto err;
+#endif
#endif
+
if (out == NULL)
- out = fopen(file,"wb");
+ {
+#if defined O_CREAT && defined O_EXCL
+ /* chmod(..., 0600) is too late to protect the file,
+ * permissions should be restrictive from the start */
+ int fd = open(file, O_CREAT | O_EXCL, 0600);
+ if (fd != -1)
+ out = fdopen(fd, "wb");
+#else
+ out=fopen(file,"wb");
+#endif
+ }
if (out == NULL) goto err;
-
#ifndef NO_CHMOD
chmod(file,0600);
#endif
@@ -165,8 +180,14 @@ int RAND_write_file(const char *file)
}
ret+=i;
if (n <= 0) break;
- }
+ }
#ifdef VMS
+ /* We may have updated an existing file using mode "rb+",
+ * now remove any old extra bytes */
+#if 0
+ if (ret > 0)
+ ftruncate(fileno(out), ret);
+#else
/* Try to delete older versions of the file, until there aren't
any */
{
@@ -184,7 +205,8 @@ int RAND_write_file(const char *file)
some point... */
}
}
-#endif /* VMS */
+#endif
+#endif
fclose(out);
memset(buf,0,BUFSIZE);