registrybinary: Also call fclose() if fflush()/fsync() failed

Otherwise we would be leaking the file in error cases.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/465>
This commit is contained in:
Sebastian Dröge 2020-05-06 10:07:30 +03:00 committed by GStreamer Merge Bot
parent 0d1fe824e2
commit a3c7e1c9b9

View file

@ -257,6 +257,7 @@ gst_registry_binary_cache_finish (BinaryRegistryCache * cache, gboolean success)
/* flush the file and make sure the OS's buffer has been written to disk */ /* flush the file and make sure the OS's buffer has been written to disk */
gint fflush_ret, fsync_ret; gint fflush_ret, fsync_ret;
int file_fd; int file_fd;
file_fd = fileno (cache->cache_file); file_fd = fileno (cache->cache_file);
do { do {
@ -297,6 +298,11 @@ gst_registry_binary_cache_finish (BinaryRegistryCache * cache, gboolean success)
return TRUE; return TRUE;
/* ERRORS */ /* ERRORS */
fail_before_fclose:
{
fclose (cache->cache_file);
}
/* fall through */
fail_after_fclose: fail_after_fclose:
{ {
g_unlink (cache->tmp_location); g_unlink (cache->tmp_location);
@ -307,14 +313,14 @@ fail_after_fclose:
fflush_failed: fflush_failed:
{ {
GST_ERROR ("fflush() failed: %s", g_strerror (errno)); GST_ERROR ("fflush() failed: %s", g_strerror (errno));
goto fail_after_fclose; goto fail_before_fclose;
}
fclose_failed:
{
GST_ERROR ("fsync() failed: %s", g_strerror (errno));
goto fail_after_fclose;
} }
fsync_failed: fsync_failed:
{
GST_ERROR ("fsync() failed: %s", g_strerror (errno));
goto fail_before_fclose;
}
fclose_failed:
{ {
GST_ERROR ("fclose() failed: %s", g_strerror (errno)); GST_ERROR ("fclose() failed: %s", g_strerror (errno));
goto fail_after_fclose; goto fail_after_fclose;