From cc60f022b1038a66db6677319d0ef8d01e7db412 Mon Sep 17 00:00:00 2001 From: Sven Neumann Date: Mon, 18 Aug 2008 20:47:19 +0000 Subject: [PATCH] open the temporary file before forking. This allows us to return an error 2008-08-18 Sven Neumann * plug-ins/common/file-compressor.c: open the temporary file before forking. This allows us to return an error message if the file can't be opened. Also changed the code to not use g_message() from the child process. svn path=/trunk/; revision=26653 --- ChangeLog | 7 +++ plug-ins/common/file-compressor.c | 95 ++++++++++++++++++------------- 2 files changed, 64 insertions(+), 38 deletions(-) diff --git a/ChangeLog b/ChangeLog index d98c15483f..a1177a46df 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2008-08-18 Sven Neumann + + * plug-ins/common/file-compressor.c: open the temporary file + before doing the fork. This allows us to return an error message + if the file can't be opened. Also changed the code to not use + g_message() from the child process. + 2008-08-18 Sven Neumann * plug-ins/common/file-compressor.c: pass some error message with diff --git a/plug-ins/common/file-compressor.c b/plug-ins/common/file-compressor.c index f9c3c0e75e..df4836bd8e 100644 --- a/plug-ins/common/file-compressor.c +++ b/plug-ins/common/file-compressor.c @@ -407,42 +407,50 @@ save_image (const Compressor *compressor, #ifndef G_OS_WIN32 { - gint pid; + FILE *f; + gint pid; + + f = g_fopen (filename, "wb"); + + if (! f) + { + g_unlink (tmpname); + g_free (tmpname); + + g_set_error (error, G_FILE_ERROR, g_file_error_from_errno (errno), + _("Could not open '%s' for writing: %s"), + gimp_filename_to_utf8 (filename), g_strerror (errno)); + + return GIMP_PDB_EXECUTION_ERROR; + } /* fork off a compressor process */ if ((pid = fork ()) < 0) { g_message ("fork() failed: %s", g_strerror (errno)); + + fclose (f); + g_unlink (tmpname); g_free (tmpname); return GIMP_PDB_EXECUTION_ERROR; } - else if (pid == 0) + else if (pid == 0) /* child process */ { - FILE *f; - - if (!(f = g_fopen (filename, "wb"))) - { - g_message (_("Could not open '%s' for writing: %s"), - gimp_filename_to_utf8 (filename), g_strerror (errno)); - g_free (tmpname); - _exit (127); - } - /* make stdout for this process be the output file */ if (dup2 (fileno (f), fileno (stdout)) == -1) - g_message ("dup2() failed: %s", g_strerror (errno)); + g_printerr ("dup2() failed: %s", g_strerror (errno)); /* and compress into it */ execlp (compressor->save_program, compressor->save_program, compressor->save_options, tmpname, NULL); - g_message ("execlp(\"%s %s\") failed: %s", - compressor->save_program, - compressor->save_options, - g_strerror (errno)); - g_free (tmpname); + g_printerr ("execlp(\"%s %s\") failed: %s", + compressor->save_program, + compressor->save_options, + g_strerror (errno)); + _exit(127); } else @@ -450,6 +458,8 @@ save_image (const Compressor *compressor, gint wpid; gint process_status; + fclose (f); + wpid = waitpid (pid, &process_status, 0); if ((wpid < 0) @@ -459,6 +469,8 @@ save_image (const Compressor *compressor, g_message ("%s exited abnormally on file '%s'", compressor->save_program, gimp_filename_to_utf8 (tmpname)); + + g_unlink (tmpname); g_free (tmpname); return GIMP_PDB_EXECUTION_ERROR; @@ -562,12 +574,28 @@ load_image (const Compressor *compressor, #ifndef G_OS_WIN32 { - gint pid; + FILE *f; + gint pid; + + f = g_fopen (tmpname, "wb"); + + if (! f) + { + g_set_error (error, G_FILE_ERROR, g_file_error_from_errno (errno), + _("Could not open '%s' for writing: %s"), + gimp_filename_to_utf8 (tmpname), g_strerror (errno)); + g_free (tmpname); + + *status = GIMP_PDB_EXECUTION_ERROR; + return -1; + } /* fork off a compressor and wait for it */ if ((pid = fork ()) < 0) { g_message ("fork() failed: %s", g_strerror (errno)); + + g_unlink (tmpname); g_free (tmpname); *status = GIMP_PDB_EXECUTION_ERROR; @@ -575,33 +603,20 @@ load_image (const Compressor *compressor, } else if (pid == 0) /* child process */ { - FILE *f; - - if (! (f = g_fopen (tmpname, "wb"))) - { - g_message (_("Could not open '%s' for writing: %s"), - gimp_filename_to_utf8 (tmpname), g_strerror (errno)); - g_free (tmpname); - _exit(127); - } - /* make stdout for this child process be the temp file */ if (dup2 (fileno (f), fileno (stdout)) == -1) - { - g_free (tmpname); - g_message ("dup2() failed: %s", g_strerror (errno)); - } + g_printerr ("dup2() failed: %s", g_strerror (errno)); /* and uncompress into it */ execlp (compressor->load_program, compressor->load_program, compressor->load_options, filename, NULL); - g_message ("execlp(\"%s %s\") failed: %s", - compressor->load_program, - compressor->load_options, - g_strerror (errno)); - g_free (tmpname); + g_printerr ("execlp(\"%s %s\") failed: %s", + compressor->load_program, + compressor->load_options, + g_strerror (errno)); + _exit(127); } else /* parent process */ @@ -609,6 +624,8 @@ load_image (const Compressor *compressor, gint wpid; gint process_status; + fclose (f); + wpid = waitpid (pid, &process_status, 0); if ((wpid < 0) @@ -618,6 +635,8 @@ load_image (const Compressor *compressor, g_message ("%s exited abnormally on file '%s'", compressor->load_program, gimp_filename_to_utf8 (filename)); + + g_unlink (tmpname); g_free (tmpname); *status = GIMP_PDB_EXECUTION_ERROR;