From a6aa71ff5f321d762c31da4caca31e375842653b Mon Sep 17 00:00:00 2001 From: =?utf8?q?Ulf=20M=C3=B6ller?= Date: Sun, 19 Mar 2000 22:57:07 +0000 Subject: [PATCH] Bug fix: RAND_write_file() failed to write to files created by open() on Win32. --- crypto/rand/md_rand.c | 2 +- crypto/rand/randfile.c | 56 +++++++++++------------------------------- 2 files changed, 15 insertions(+), 43 deletions(-) diff --git a/crypto/rand/md_rand.c b/crypto/rand/md_rand.c index 35bdbeb73e..b1d51e890b 100644 --- a/crypto/rand/md_rand.c +++ b/crypto/rand/md_rand.c @@ -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. * diff --git a/crypto/rand/randfile.c b/crypto/rand/randfile.c index cc73c799fd..9ff3974cc7 100644 --- a/crypto/rand/randfile.c +++ b/crypto/rand/randfile.c @@ -133,41 +133,20 @@ int RAND_write_file(const char *file) int i,ret=0,err=0; FILE *out = NULL; int n; - -#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 + +#if defined(O_CREAT) && defined(O_EXCL) && !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 | 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); -- 2.34.1