diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2016-12-26 21:24:20 +0100 |
---|---|---|
committer | Carlos Garnacho <carlosg@gnome.org> | 2017-01-16 17:18:59 +0100 |
commit | ae27aaedd289b41c6418506892d4d0f39c77eac9 (patch) | |
tree | 08c2e94aba9dec9b1c1d98fec2f78b4295ab7c56 | |
parent | e36dbad6dadc36b00f50b39fdca3f1648592e003 (diff) | |
download | tracker-ae27aaedd289b41c6418506892d4d0f39c77eac9.tar.gz |
libtracker-miner: Fix mem/fd leaks on TrackerCrawler cancellation
On cancellation, the early return would leak the DataProviderData, which
indirectly contains the GFileEnumerator, and thus the directory fd. Just
deal with cancellation like we do with other errors, except we don't want
to warn.
-rw-r--r-- | src/libtracker-miner/tracker-crawler.c | 56 |
1 files changed, 21 insertions, 35 deletions
diff --git a/src/libtracker-miner/tracker-crawler.c b/src/libtracker-miner/tracker-crawler.c index 593b05638..122464e10 100644 --- a/src/libtracker-miner/tracker-crawler.c +++ b/src/libtracker-miner/tracker-crawler.c @@ -841,21 +841,15 @@ data_provider_end_cb (GObject *object, GError *error = NULL; tracker_data_provider_end_finish (TRACKER_DATA_PROVIDER (object), result, &error); - - if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) - return; - dpd = user_data; if (error) { - gchar *uri; - - uri = g_file_get_uri (dpd->dir_file); - - g_warning ("Could not end data provider for container / directory '%s', %s", - uri, error ? error->message : "no error given"); - - g_free (uri); + if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + gchar *uri = g_file_get_uri (dpd->dir_file); + g_warning ("Could not end data provider for container / directory '%s', %s", + uri, error ? error->message : "no error given"); + g_free (uri); + } g_clear_error (&error); } @@ -904,13 +898,6 @@ enumerate_next_cb (GObject *object, GError *error = NULL; info = tracker_enumerator_next_finish (TRACKER_ENUMERATOR (object), result, &error); - - /* We don't consider cancellation an error, so we only - * log errors which are not cancellations. - */ - if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) - return; - dpd = user_data; if (!info) { @@ -919,12 +906,16 @@ enumerate_next_cb (GObject *object, * b) no more items */ if (error) { - gchar *uri; + /* We don't consider cancellation an error, so we only + * log errors which are not cancellations. + */ + if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + gchar *uri = g_file_get_uri (dpd->dir_file); + g_warning ("Could not enumerate next item in container / directory '%s', %s", + uri, error ? error->message : "no error given"); + g_free (uri); + } - uri = g_file_get_uri (dpd->dir_file); - g_warning ("Could not enumerate next item in container / directory '%s', %s", - uri, error ? error->message : "no error given"); - g_free (uri); g_clear_error (&error); } else { /* Done enumerating, start processing what we got ... */ @@ -956,23 +947,18 @@ data_provider_begin_cb (GObject *object, enumerator = tracker_data_provider_begin_finish (TRACKER_DATA_PROVIDER (object), result, &error); - if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) - return; - info = user_data; dpd = info->dpd; dpd->enumerator = enumerator; if (!dpd->enumerator) { if (error) { - gchar *uri; - - uri = g_file_get_uri (dpd->dir_file); - - g_warning ("Could not enumerate container / directory '%s', %s", - uri, error ? error->message : "no error given"); - - g_free (uri); + if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + gchar *uri = g_file_get_uri (dpd->dir_file); + g_warning ("Could not enumerate container / directory '%s', %s", + uri, error ? error->message : "no error given"); + g_free (uri); + } g_clear_error (&error); } |