Bug fix: RAND_write_file() failed to write to files created by open()

on Win32.
This commit is contained in:
Ulf Möller 2000-03-19 22:57:07 +00:00
parent 87b89b799f
commit a6aa71ff5f
2 changed files with 14 additions and 42 deletions

View File

@ -1,4 +1,4 @@
* crypto/rand/md_rand.c */ /* crypto/rand/md_rand.c */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
* All rights reserved. * All rights reserved.
* *

View File

@ -133,41 +133,20 @@ int RAND_write_file(const char *file)
int i,ret=0,err=0; int i,ret=0,err=0;
FILE *out = NULL; FILE *out = NULL;
int n; int n;
#if defined(O_CREAT) && defined(O_EXCL) && !defined(WIN32)
/* For some reason Win32 can't write to files created this way */
#ifdef VMS /* chmod(..., 0600) is too late to protect the file,
/* Under VMS, fopen(file, "wb") will create a new version of the * permissions should be restrictive from the start */
same file. This is not good, so let's try updating an existing int fd = open(file, O_CREAT | O_EXCL, 0600);
one, and create file only if it doesn't already exist. */ if (fd != -1)
/* At the same time, if we just update a file, we also need to out = fdopen(fd, "wb");
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 #endif
if (out == NULL)
out = fopen(file,"wb");
if (out == NULL) goto err;
if (out == NULL)
{
#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 /* the open(...) reportedly fails on Win98 w/ VisualC */
out = fopen(file,"wb");
#else
out = fopen(file,"wb");
#endif
}
if (out == NULL)
{
err=1;
goto err;
}
#ifndef NO_CHMOD #ifndef NO_CHMOD
chmod(file,0600); chmod(file,0600);
#endif #endif
@ -186,14 +165,8 @@ int RAND_write_file(const char *file)
} }
ret+=i; ret+=i;
if (n <= 0) break; if (n <= 0) break;
} }
#ifdef VMS #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 /* Try to delete older versions of the file, until there aren't
any */ any */
{ {
@ -211,8 +184,7 @@ int RAND_write_file(const char *file)
some point... */ some point... */
} }
} }
#endif #endif /* VMS */
#endif
fclose(out); fclose(out);
memset(buf,0,BUFSIZE); memset(buf,0,BUFSIZE);