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