In the cw_closestream() function in corelib/file.c, it appears that
the file is being moved before the underlying format close() function
is called. This means that /bin/mv will attempt to move (and thus
possible copy) a file that is not yet closed, possibly missing data
and having a corrupt file.

The attached patch calls the underlying format close()  before
attempting the move of the file.
diff --git a/callweaver/corelib/file.c b/callweaver/corelib/file.c
index b352358..6fbcdb3 100644
--- a/callweaver/corelib/file.c
+++ b/callweaver/corelib/file.c
@@ -709,6 +709,8 @@ int cw_stream_rewind(struct cw_filestream *fs, long ms)
 
 int cw_closestream(struct cw_filestream *f)
 {
+	char *realfname = f->realfilename;
+	char *fname = f->filename;
 	char *cmd = NULL;
 	size_t size = 0;
 	/* Stop a running stream if there is one */
@@ -730,24 +732,23 @@ int cw_closestream(struct cw_filestream *f)
 		cw_translator_free_path(f->trans);
 		f->trans = NULL;
 	}
-
-	if (f->realfilename && f->filename) {
-			size = strlen(f->filename) + strlen(f->realfilename) + 15;
+	/* We will take care of the allocated strings later,
+	 * just make sure fmt->close() will not free them.
+	 */
+	f->realfilename = f->filename = NULL;
+	f->fmt->close(f);
+	if (realfname && fname) {
+		size = strlen(fname) + strlen(realfname) + 15;
 			cmd = alloca(size);
 			memset(cmd,0,size);
-			snprintf(cmd,size,"/bin/mv -f %s %s",f->filename,f->realfilename);
+		snprintf(cmd,size,"/bin/mv -f %s %s",fname,realfname);
 			cw_safe_system(cmd);
 	}
 
-	if (f->filename) {
-		free(f->filename);
-		f->filename = NULL;
-	}
-	if (f->realfilename) {
-		free(f->realfilename);
-		f->realfilename = NULL;
-	}
-	f->fmt->close(f);
+	if (fname)
+		free(fname);
+	if (realfname)
+		free(realfname);
 	return 0;
 }
 
_______________________________________________
Callweaver-dev mailing list
[email protected]
http://lists.callweaver.org/mailman/listinfo/callweaver-dev

Reply via email to