summaryrefslogtreecommitdiffstats
path: root/video/image_writer.c
diff options
context:
space:
mode:
authornanahi <130121847+na-na-hi@users.noreply.github.com>2024-02-24 13:59:22 -0500
committersfan5 <sfan5@live.de>2024-02-25 11:37:44 +0100
commit3e8d69e3e86fbca6719028ffda9b75918b4c575f (patch)
treedc686d108bac9a7717a7916d76b6be424950bf87 /video/image_writer.c
parent74b4c3c531bd454484ed5d04c9aad0bc531ccd4b (diff)
downloadmpv-3e8d69e3e86fbca6719028ffda9b75918b4c575f.tar.bz2
mpv-3e8d69e3e86fbca6719028ffda9b75918b4c575f.tar.xz
image_writer: cleanup leftover files if image writing fails
This avoids leaving an empty/corrupt file if fopen succeeds but image writing fails afterwards.
Diffstat (limited to 'video/image_writer.c')
-rw-r--r--video/image_writer.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/video/image_writer.c b/video/image_writer.c
index e86c255811..8f5f4ed877 100644
--- a/video/image_writer.c
+++ b/video/image_writer.c
@@ -19,6 +19,7 @@
#include <stdlib.h>
#include <string.h>
#include <inttypes.h>
+#include <unistd.h>
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
@@ -259,7 +260,10 @@ error_exit:
avcodec_free_context(&avctx);
av_frame_free(&pic);
av_packet_free(&pkt);
- return !fclose(fp) && success;
+ success = success && !fclose(fp);
+ if (!success)
+ unlink(filename);
+ return success;
}
#if HAVE_JPEG
@@ -293,6 +297,7 @@ static bool write_jpeg(struct image_writer_ctx *ctx, mp_image_t *image,
if (setjmp(cinfo.client_data)) {
jpeg_destroy_compress(&cinfo);
fclose(fp);
+ unlink(filename);
return false;
}
@@ -329,7 +334,10 @@ static bool write_jpeg(struct image_writer_ctx *ctx, mp_image_t *image,
jpeg_destroy_compress(&cinfo);
- return !fclose(fp);
+ if (!fclose(fp))
+ return true;
+ unlink(filename);
+ return false;
}
#endif