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)
* All rights reserved.
*

View file

@ -133,41 +133,20 @@ int RAND_write_file(const char *file)
int i,ret=0,err=0;
FILE *out = NULL;
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
/* 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
/* 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");
#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
chmod(file,0600);
#endif
@ -186,14 +165,8 @@ 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 */
{
@ -211,8 +184,7 @@ int RAND_write_file(const char *file)
some point... */
}
}
#endif
#endif
#endif /* VMS */
fclose(out);
memset(buf,0,BUFSIZE);