[Spice-devel] [spice-gtk v1 10/10] file-transfer: fix leak on _task_get_filename
Victor Toso
lists at victortoso.com
Mon Aug 1 12:44:40 UTC 2016
Hi,
On Mon, Aug 01, 2016 at 12:37:00PM +0200, Pavel Grunt wrote:
> Hi Victor,
>
> On Sat, 2016-07-30 at 00:26 +0200, Victor Toso wrote:
> > 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.
>
> It sounds like a better option to me
Okay, I'll change it
>
> >
> > 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.
> Ok
>
> Thanks,
> Pavel
Cheers,
toso
> > ---
> > 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);
> >
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/spice-devel
More information about the Spice-devel
mailing list