Author: Igor Kogan <IgorKogan@nowrap.de>, Paul Wise <pabs@debian.org>
Description: fix temporary file handling
Forwarded: http://sf.net/support/tracker.php?aid=2796102
Bug: http://sf.net/support/tracker.php?aid=2796102
Bug-Debian: http://bugs.debian.org/530383
Last-Update: 2009-07-17
--- a/flasm.c
+++ b/flasm.c
@@ -37,7 +37,6 @@
 
 char *inputName;				/* actual command-line parameter */
 static char *updateName = NULL;	/* swf file name found in disassembly's first line (movie foo.swf...) */
-static char *tempName = NULL;	/* temporary file during assembling */
 static char *flmName = NULL;	/* temporary disassembly during update */
 static char *backupName = NULL;	/* foo.$wf if foo.swf is updated */
 static FILE *updateFile = NULL;
@@ -114,6 +113,15 @@
 	exit(msg);
 }
 
+static void copyFileContents(FILE* srcFile, FILE* destFile)
+{
+    char buf[65535];
+    size_t readCount = 0;
+    while ((readCount = fread((void *) buf, sizeof(char), sizeof(buf), srcFile)) != 0) {
+        fwrite(buf, sizeof(char), readCount, destFile);
+    }
+}
+
 void tellUser(int isError, char *s, ...)
 {
 	va_list ap;
@@ -156,10 +164,8 @@
 		if (mode >= MODE_IDE && usestderr)
 			waitUserInput();
 
-		if (tempFile != NULL) {
+		if (tempFile != NULL)
 			fclose(tempFile);
-			remove(tempName);
-		}
 
 		if (updateFile != NULL)
 			fclose(updateFile);
@@ -1096,7 +1102,8 @@
 
 static void finalizeTemporaryFile(char *name)
 {
-	fclose(tempFile);
+	FILE* targetFile;
+
 	if (!backupCreated) {
 		backupName = mstrdup(name);
 		backupCreated = 1;
@@ -1106,15 +1113,17 @@
 		/* foo.swf -> foo.$wf */
 		if (rename(name, backupName) != 0)
 			tellUser(1, "couldn't update: file %s is in use", name);
-		/* foo.tmp (assemble) or flasm.tmp (compress/decompress) -> foo.swf */
-		rename(tempName, name);
 	}
 	else {
 		/* backup already here, just make temp file our final file */
 		if (remove(name) != 0)
 			tellUser(1, "couldn't update: file %s is in use", name);
-		rename(tempName, name);
 	}
+
+	targetFile = fopen(name, "wb");
+	rewind(tempFile);
+	copyFileContents(tempFile, targetFile);
+	fclose(targetFile);
 }
 
 static void getSWFHeader(FILE * f)
@@ -1123,6 +1132,8 @@
 	swfHeader[3] = '\0';
 }
 
+static void createTemporaryFile(void);
+
 void startUpdate(char *outputName)
 {
 	int b, i, bitstotal;
@@ -1147,11 +1158,8 @@
 	flength = 0;
 
 	updateName = mstrdup(outputName);
-	tempName = mstrdup(outputName);
-	strcpy(tempName + strlen(tempName) - 4, ".tmp");
 
-	if ((tempFile = fopen(tempName, "wb")) == NULL)
-		tellUser(1, "Couldn't create temporary file");
+	createTemporaryFile();
 
 	/* SWF header */
 	flput('F');
@@ -1229,9 +1237,8 @@
 
 static void createTemporaryFile(void)
 {
-	tempName = mstrdup("flasm.tmp");
-	if ((tempFile = fopen(tempName, "wb+")) == NULL)
-		tellUser(1, "Couldn't create file: %s", tempName);
+	if ((tempFile = tmpfile()) == NULL)
+		tellUser(1, "Couldn't create temporary file");
 }
 
 static void decompressSWF(FILE *f, char *fname)
@@ -1752,7 +1759,6 @@
 				/* skip SWF header, we know it's 'FWS' */
 				fseek(tempFile, 3, SEEK_SET);
 				disassembleSWF(tempFile, inputName);
-				remove(tempName);
 			}
 			else
 				tellUser(1, "Input file doesn't appear to be an SWF file..");
