Fix some more issues with the mod_ffmpeg, mod_dv security patches
authorpabs <pabs@1f10aa63-cdf2-0310-b900-c93c546f37ac>
Fri, 7 Dec 2007 03:36:30 +0000 (03:36 +0000)
committerpabs <pabs@1f10aa63-cdf2-0310-b900-c93c546f37ac>
Fri, 7 Dec 2007 03:36:30 +0000 (03:36 +0000)
git-svn-id: http://svn.voria.com/code@1184 1f10aa63-cdf2-0310-b900-c93c546f37ac

synfig-core/trunk/src/modules/mod_dv/trgt_dv.cpp
synfig-core/trunk/src/modules/mod_dv/trgt_dv.h
synfig-core/trunk/src/modules/mod_ffmpeg/trgt_ffmpeg.cpp
synfig-core/trunk/src/modules/mod_ffmpeg/trgt_ffmpeg.h

index 8c8c4c5..a2f7e50 100644 (file)
@@ -37,6 +37,7 @@
 #include "trgt_dv.h"
 #include <stdio.h>
 #include <sys/types.h>
 #include "trgt_dv.h"
 #include <stdio.h>
 #include <sys/types.h>
+#include <sys/wait.h>
 #include <unistd.h>
 #include <algorithm>
 #include <functional>
 #include <unistd.h>
 #include <algorithm>
 #include <functional>
@@ -63,6 +64,7 @@ SYNFIG_TARGET_SET_CVS_ID(dv_trgt,"$Id$");
 
 dv_trgt::dv_trgt(const char *Filename)
 {
 
 dv_trgt::dv_trgt(const char *Filename)
 {
+       pid=-1;
        file=NULL;
        filename=Filename;
        buffer=NULL;
        file=NULL;
        filename=Filename;
        buffer=NULL;
@@ -74,8 +76,11 @@ dv_trgt::dv_trgt(const char *Filename)
 
 dv_trgt::~dv_trgt()
 {
 
 dv_trgt::~dv_trgt()
 {
-       if(file)
-               pclose(file);
+       if(file){
+               fclose(file);
+               int status;
+               waitpid(pid,&status,0);
+       }
        file=NULL;
        delete [] buffer;
        delete [] color_buffer;
        file=NULL;
        delete [] buffer;
        delete [] color_buffer;
@@ -140,12 +145,15 @@ dv_trgt::init()
   
        if (pid == 0){
                // Child process
   
        if (pid == 0){
                // Child process
+               // Close pipeout, not needed
+               close(p[1]);
                // Dup pipeout to stdin
                if( dup2( p[0], STDIN_FILENO ) == -1 ){
                        synfig::error(_("Unable to open pipe to encodedv"));
                        return false;
                }
                // Dup pipeout to stdin
                if( dup2( p[0], STDIN_FILENO ) == -1 ){
                        synfig::error(_("Unable to open pipe to encodedv"));
                        return false;
                }
-               
+               // Close the unneeded pipeout
+               close(p[0]);
                // Open filename to stdout
                FILE* outfile = fopen(filename.c_str(),"wb");
                if( outfile == NULL ){
                // Open filename to stdout
                FILE* outfile = fopen(filename.c_str(),"wb");
                if( outfile == NULL ){
index b135b42..11ba75e 100644 (file)
@@ -31,6 +31,7 @@
 
 #include <synfig/target_scanline.h>
 #include <synfig/string.h>
 
 #include <synfig/target_scanline.h>
 #include <synfig/string.h>
+#include <sys/types.h>
 #include <cstdio>
 
 /* === M A C R O S ========================================================= */
 #include <cstdio>
 
 /* === M A C R O S ========================================================= */
@@ -44,6 +45,7 @@ class dv_trgt : public synfig::Target_Scanline
 {
        SYNFIG_TARGET_MODULE_EXT
 private:
 {
        SYNFIG_TARGET_MODULE_EXT
 private:
+       pid_t pid;
        int imagecount;
        bool wide_aspect;
        FILE *file;
        int imagecount;
        bool wide_aspect;
        FILE *file;
index f663efb..d2e8525 100644 (file)
@@ -37,6 +37,7 @@
 #include "trgt_ffmpeg.h"
 #include <stdio.h>
 #include <sys/types.h>
 #include "trgt_ffmpeg.h"
 #include <stdio.h>
 #include <sys/types.h>
+#include <sys/wait.h>
 #include <unistd.h>
 #include <algorithm>
 #include <functional>
 #include <unistd.h>
 #include <algorithm>
 #include <functional>
@@ -62,6 +63,7 @@ SYNFIG_TARGET_SET_CVS_ID(ffmpeg_trgt,"$Id$");
 
 ffmpeg_trgt::ffmpeg_trgt(const char *Filename)
 {
 
 ffmpeg_trgt::ffmpeg_trgt(const char *Filename)
 {
+       pid=-1;
        file=NULL;
        filename=Filename;
        multi_image=false;
        file=NULL;
        filename=Filename;
        multi_image=false;
@@ -76,7 +78,9 @@ ffmpeg_trgt::~ffmpeg_trgt()
        {
                etl::yield();
                sleep(1);
        {
                etl::yield();
                sleep(1);
-               pclose(file);
+               fclose(file);
+               int status;
+               waitpid(pid,&status,0);
        }
        file=NULL;
        delete [] buffer;
        }
        file=NULL;
        delete [] buffer;
@@ -134,7 +138,7 @@ ffmpeg_trgt::init()
                return false;
        };
   
                return false;
        };
   
-       pid_t pid = fork();
+       pid = fork();
   
        if (pid == -1) {
                synfig::error(_("Unable to open pipe to ffmpeg"));
   
        if (pid == -1) {
                synfig::error(_("Unable to open pipe to ffmpeg"));
@@ -143,11 +147,15 @@ ffmpeg_trgt::init()
   
        if (pid == 0){
                // Child process
   
        if (pid == 0){
                // Child process
+               // Close pipeout, not needed
+               close(p[1]);
                // Dup pipeout to stdin
                if( dup2( p[0], STDIN_FILENO ) == -1 ){
                        synfig::error(_("Unable to open pipe to ffmpeg"));
                        return false;
                }
                // Dup pipeout to stdin
                if( dup2( p[0], STDIN_FILENO ) == -1 ){
                        synfig::error(_("Unable to open pipe to ffmpeg"));
                        return false;
                }
+               // Close the unneeded pipeout
+               close(p[0]);
                execlp("ffmpeg", "ffmpeg", "-f", "image2pipe", "-vcodec", "ppm", "-an", "-r", strprintf("%f", desc.get_frame_rate()).c_str(), "-i", "pipe:", "-loop", "-hq", "-title", get_canvas()->get_name().c_str(), "-vcodec", "mpeg1video", "-y", "--", filename.c_str(), (const char *)NULL);
                // We should never reach here unless the exec failed
                synfig::error(_("Unable to open pipe to ffmpeg"));
                execlp("ffmpeg", "ffmpeg", "-f", "image2pipe", "-vcodec", "ppm", "-an", "-r", strprintf("%f", desc.get_frame_rate()).c_str(), "-i", "pipe:", "-loop", "-hq", "-title", get_canvas()->get_name().c_str(), "-vcodec", "mpeg1video", "-y", "--", filename.c_str(), (const char *)NULL);
                // We should never reach here unless the exec failed
                synfig::error(_("Unable to open pipe to ffmpeg"));
index f16d39b..c5fc1ae 100644 (file)
@@ -31,6 +31,7 @@
 
 #include <synfig/target_scanline.h>
 #include <synfig/string.h>
 
 #include <synfig/target_scanline.h>
 #include <synfig/string.h>
+#include <sys/types.h>
 #include <cstdio>
 
 /* === M A C R O S ========================================================= */
 #include <cstdio>
 
 /* === M A C R O S ========================================================= */
@@ -43,6 +44,7 @@ class ffmpeg_trgt : public synfig::Target_Scanline
 {
        SYNFIG_TARGET_MODULE_EXT
 private:
 {
        SYNFIG_TARGET_MODULE_EXT
 private:
+       pid_t pid;
        int imagecount;
        bool multi_image;
        FILE *file;
        int imagecount;
        bool multi_image;
        FILE *file;