From: Sergio Villar Senin Date: Wed, 20 Apr 2011 11:22:01 +0000 (+0200) Subject: soup-cache: do not append data to existing files X-Git-Tag: LIBSOUP_2_34_1~3 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=42f9135da10dffe6d26f1bc6c70fa41fb211b627;p=platform%2Fupstream%2Flibsoup.git soup-cache: do not append data to existing files SoupCache was creating files using g_file_append_to_async(). Whenever there was an untracked existing file in the directory cache, the SoupCache was incorrectly appending data to the existing file, and thus, creating invalid cached resources on disk. https://bugzilla.gnome.org/show_bug.cgi?id=648285 --- diff --git a/libsoup/soup-cache.c b/libsoup/soup-cache.c index 49450d8..4812f46 100644 --- a/libsoup/soup-cache.c +++ b/libsoup/soup-cache.c @@ -838,15 +838,15 @@ msg_restarted_cb (SoupMessage *msg, SoupCacheEntry *entry) } static void -append_to_ready_cb (GObject *source, GAsyncResult *result, SoupCacheWritingFixture *fixture) +replace_cb (GObject *source, GAsyncResult *result, SoupCacheWritingFixture *fixture) { - GFile *file = (GFile *)source; - GOutputStream *stream; SoupCacheEntry *entry = fixture->entry; - - stream = (GOutputStream *)g_file_append_to_finish (file, result, &entry->error); + GOutputStream *stream = (GOutputStream *) g_file_replace_finish (G_FILE (source), + result, &entry->error); if (g_cancellable_is_cancelled (entry->cancellable) || entry->error) { + if (stream) + g_object_unref (stream); fixture->cache->priv->n_pending--; entry->dirty = FALSE; soup_cache_entry_remove (fixture->cache, entry); @@ -855,28 +855,28 @@ append_to_ready_cb (GObject *source, GAsyncResult *result, SoupCacheWritingFixtu return; } - entry->stream = g_object_ref (stream); - g_object_unref (file); + entry->stream = stream; /* If we already got all the data we have to initiate the - writing here, since we won't get more 'got-chunk' - signals */ - if (entry->got_body) { - GString *data = entry->data; + * writing here, since we won't get more 'got-chunk' + * signals + */ + if (!entry->got_body) + return; - /* It could happen that reading the data from server - was completed before this happens. In that case - there is no data */ - if (data) { - entry->writing = TRUE; - g_output_stream_write_async (entry->stream, - data->str + entry->pos, - data->len - entry->pos, - G_PRIORITY_LOW, - entry->cancellable, - (GAsyncReadyCallback)write_ready_cb, - fixture); - } + /* It could happen that reading the data from server + * was completed before this happens. In that case + * there is no data + */ + if (entry->data) { + entry->writing = TRUE; + g_output_stream_write_async (entry->stream, + entry->data->str + entry->pos, + entry->data->len - entry->pos, + G_PRIORITY_LOW, + entry->cancellable, + (GAsyncReadyCallback)write_ready_cb, + fixture); } } @@ -953,10 +953,11 @@ msg_got_headers_cb (SoupMessage *msg, gpointer user_data) entry->dirty = TRUE; entry->cancellable = g_cancellable_new (); - g_file_append_to_async (file, 0, - G_PRIORITY_LOW, entry->cancellable, - (GAsyncReadyCallback)append_to_ready_cb, - fixture); + g_file_replace_async (file, NULL, FALSE, + G_FILE_CREATE_PRIVATE | G_FILE_CREATE_REPLACE_DESTINATION, + G_PRIORITY_LOW, entry->cancellable, + (GAsyncReadyCallback) replace_cb, fixture); + g_object_unref (file); } else if (cacheable & SOUP_CACHE_INVALIDATES) { char *key; SoupCacheEntry *entry;