Bug fix: RAND_write_file() failed to write to files created by open()
on Win32.
This commit is contained in:
parent
87b89b799f
commit
a6aa71ff5f
@ -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.
|
||||||
*
|
*
|
||||||
|
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user