Commit a6aa71ff authored by Ulf Möller's avatar Ulf Möller
Browse files

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

on Win32.
parent 87b89b79
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
* crypto/rand/md_rand.c */
/* crypto/rand/md_rand.c */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
 * All rights reserved.
 *
+14 −42
Original line number Diff line number Diff line
@@ -134,40 +134,19 @@ int RAND_write_file(const char *file)
	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
#endif
#if defined(O_CREAT) && defined(O_EXCL) && !defined(WIN32)
	/* For some reason Win32 can't write to files created this way */

	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;
		}
                out = fopen(file,"wb");
        if (out == NULL) goto err;

#ifndef NO_CHMOD
	chmod(file,0600);
#endif
@@ -188,12 +167,6 @@ int RAND_write_file(const char *file)
		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);