This fixes the leak of filename. The documentation says that this is transfer none so Spicy and Virt-Viewer are not trying to free this string. The other option would be changing the documentation to transfer full and fix the applications. This patch breaks API by using const* to return value and ABI as client application that was free'ing will need to fix it. While on it, we use a lot of g_file_get_basename() in the code so I kept the filename saved as it should not change during the file transfer. --- src/spice-file-transfer-task.c | 20 +++++++++----------- src/spice-file-transfer-task.h | 2 +- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/src/spice-file-transfer-task.c b/src/spice-file-transfer-task.c index fb48b9b..70571f0 100644 --- a/src/spice-file-transfer-task.c +++ b/src/spice-file-transfer-task.c @@ -45,6 +45,7 @@ struct _SpiceFileTransferTask gboolean completed; gboolean pending; GFile *file; + gchar *filename; SpiceMainChannel *channel; GFileInputStream *file_stream; GFileCopyFlags flags; @@ -212,11 +213,9 @@ static void spice_file_transfer_task_read_stream_cb(GObject *source_object, gint64 now = g_get_monotonic_time(); if (interval < now - self->last_update) { - gchar *basename = g_file_get_basename(self->file); self->last_update = now; SPICE_DEBUG("read %.2f%% of the file %s", - 100.0 * self->read_bytes / self->file_size, basename); - g_free(basename); + 100.0 * self->read_bytes / self->file_size, self->filename); } } @@ -246,16 +245,14 @@ static void spice_file_transfer_task_close_stream_cb(GObject *object, if (self->error == NULL && spice_util_get_debug()) { gint64 now = g_get_monotonic_time(); - gchar *basename = g_file_get_basename(self->file); double seconds = (double) (now - self->start_time) / G_TIME_SPAN_SECOND; gchar *file_size_str = g_format_size(self->file_size); gchar *transfer_speed_str = g_format_size(self->file_size / seconds); g_warn_if_fail(self->read_bytes == self->file_size); SPICE_DEBUG("transferred file %s of %s size in %.1f seconds (%s/s)", - basename, file_size_str, seconds, transfer_speed_str); + self->filename, file_size_str, seconds, transfer_speed_str); - g_free(basename); g_free(file_size_str); g_free(transfer_speed_str); } @@ -540,9 +537,9 @@ void spice_file_transfer_task_cancel(SpiceFileTransferTask *self) * * Since: 0.31 **/ -char* spice_file_transfer_task_get_filename(SpiceFileTransferTask *self) +const char* spice_file_transfer_task_get_filename(SpiceFileTransferTask *self) { - return g_file_get_basename(self->file); + return self->filename; } /******************************************************************************* @@ -608,6 +605,7 @@ spice_file_transfer_task_dispose(GObject *object) g_clear_object(&self->file); g_clear_object(&self->file_stream); g_clear_error(&self->error); + g_clear_pointer(&self->filename, g_free); G_OBJECT_CLASS(spice_file_transfer_task_parent_class)->dispose(object); } @@ -626,14 +624,14 @@ static void spice_file_transfer_task_constructed(GObject *object) { SpiceFileTransferTask *self = SPICE_FILE_TRANSFER_TASK(object); + self->filename = g_file_get_basename(self->file); if (spice_util_get_debug()) { - gchar *basename = g_file_get_basename(self->file); self->start_time = g_get_monotonic_time(); self->last_update = self->start_time; - SPICE_DEBUG("transfer of file %s has started", basename); - g_free(basename); + SPICE_DEBUG("transfer of file %s has started", self->filename); + g_free(self->filename); } } diff --git a/src/spice-file-transfer-task.h b/src/spice-file-transfer-task.h index 4f179fb..43d1d86 100644 --- a/src/spice-file-transfer-task.h +++ b/src/spice-file-transfer-task.h @@ -41,7 +41,7 @@ typedef struct _SpiceFileTransferTaskClass SpiceFileTransferTaskClass; GType spice_file_transfer_task_get_type(void) G_GNUC_CONST; -char* spice_file_transfer_task_get_filename(SpiceFileTransferTask *self); +const char* spice_file_transfer_task_get_filename(SpiceFileTransferTask *self); void spice_file_transfer_task_cancel(SpiceFileTransferTask *self); double spice_file_transfer_task_get_progress(SpiceFileTransferTask *self); -- 2.7.4 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel