Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package liferea for openSUSE:Factory checked in at 2026-05-30 22:55:59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/liferea (Old) and /work/SRC/openSUSE:Factory/.liferea.new.1937 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "liferea" Sat May 30 22:55:59 2026 rev:20 rq:1355928 version:1.16.10 Changes: -------- --- /work/SRC/openSUSE:Factory/liferea/liferea.changes 2026-05-05 15:17:27.504304805 +0200 +++ /work/SRC/openSUSE:Factory/.liferea.new.1937/liferea.changes 2026-05-30 22:57:50.103533832 +0200 @@ -1,0 +2,9 @@ +Tue May 26 07:46:22 UTC 2026 - Bjørn Lie <[email protected]> + +- Update to version 1.16.10: + + Fix glib >= 2.86 required + + Fix duplicate favicon fetch + + Fix update state persistence that caused unnecessary feed + updates. + +------------------------------------------------------------------- Old: ---- liferea-1.16.9.tar.xz New: ---- liferea-1.16.10.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ liferea.spec ++++++ --- /var/tmp/diff_new_pack.u0hf7Y/_old 2026-05-30 22:57:51.395586846 +0200 +++ /var/tmp/diff_new_pack.u0hf7Y/_new 2026-05-30 22:57:51.399587010 +0200 @@ -17,7 +17,7 @@ Name: liferea -Version: 1.16.9 +Version: 1.16.10 Release: 0 Summary: Linux Feed Reader License: GPL-2.0-only @@ -33,7 +33,7 @@ BuildRequires: intltool >= 0.40.0 BuildRequires: libtool BuildRequires: pkgconfig(fribidi) -BuildRequires: pkgconfig(glib-2.0) >= 2.74.0 +BuildRequires: pkgconfig(glib-2.0) >= 2.86.0 BuildRequires: pkgconfig(gobject-introspection-1.0) BuildRequires: pkgconfig(gsettings-desktop-schemas) BuildRequires: pkgconfig(gtk+-3.0) >= 3.4.0 ++++++ _scmsync.obsinfo ++++++ --- /var/tmp/diff_new_pack.u0hf7Y/_old 2026-05-30 22:57:51.431588323 +0200 +++ /var/tmp/diff_new_pack.u0hf7Y/_new 2026-05-30 22:57:51.439588651 +0200 @@ -1,5 +1,5 @@ -mtime: 1777797182 -commit: b0927c9bf0872373c97cda93e0ae909f5a6dad88ad134c49da2471369c60bc2f +mtime: 1779781721 +commit: d062e45e54b230ecc88a830ea7b262bffb350cd7e7ce52cb9713c3bde647e151 url: https://src.opensuse.org/GNOME/liferea revision: factory ++++++ _service ++++++ --- /var/tmp/diff_new_pack.u0hf7Y/_old 2026-05-30 22:57:51.467589800 +0200 +++ /var/tmp/diff_new_pack.u0hf7Y/_new 2026-05-30 22:57:51.471589964 +0200 @@ -3,7 +3,7 @@ <service name="obs_scm" mode="manual"> <param name="scm">git</param> <param name="url">https://github.com/lwindolf/liferea.git</param> - <param name="revision">v1.16.9</param> + <param name="revision">v1.16.10</param> <param name="versionformat">@PARENT_TAG@+@TAG_OFFSET@</param> <param name="versionrewrite-pattern">v?(.*)\+0</param> <param name="versionrewrite-replacement">\1</param> ++++++ build.specials.obscpio ++++++ ++++++ build.specials.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/.gitignore new/.gitignore --- old/.gitignore 1970-01-01 01:00:00.000000000 +0100 +++ new/.gitignore 2026-05-26 09:48:41.000000000 +0200 @@ -0,0 +1,4 @@ +*.obscpio +*.osc +_build.* +.pbuild ++++++ liferea-1.16.9.tar.xz -> liferea-1.16.10.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/liferea-1.16.9/ChangeLog new/liferea-1.16.10/ChangeLog --- old/liferea-1.16.9/ChangeLog 2026-05-02 14:18:21.000000000 +0200 +++ new/liferea-1.16.10/ChangeLog 2026-05-25 18:49:20.000000000 +0200 @@ -1,3 +1,17 @@ +2026-05-25 Lars Windolf <[email protected]> + + Version 1.16.10 + + * Fixes #1516: glib >= 2.86 required + (Lars Windolf) + + * Fixes #1508: Duplicate favicon fetch + (Lars Windolf) + + * Fixes update state persistence that caused unnecessary feed updates. + (Lars Windolf) + + 2026-05-02 Lars Windolf <[email protected]> Version 1.16.9 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/liferea-1.16.9/configure.ac new/liferea-1.16.10/configure.ac --- old/liferea-1.16.9/configure.ac 2026-05-02 14:18:21.000000000 +0200 +++ new/liferea-1.16.10/configure.ac 2026-05-25 18:49:20.000000000 +0200 @@ -1,6 +1,6 @@ dnl Process this file with autoconf to produce a configure script. -AC_INIT([liferea],[1.16.9]) +AC_INIT([liferea],[1.16.10]) AC_CANONICAL_HOST AC_CONFIG_SRCDIR([src/feedlist.c]) @@ -44,7 +44,7 @@ # Mandatory library dependencies pkg_modules=" gtk+-3.0 >= 3.24.0 - glib-2.0 >= 2.68.0 + glib-2.0 >= 2.86.0 gio-2.0 >= 2.50.0 pango >= 1.4.0 libxml-2.0 >= 2.6.27 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/liferea-1.16.9/src/db.c new/liferea-1.16.10/src/db.c --- old/liferea-1.16.9/src/db.c 2026-05-02 14:18:21.000000000 +0200 +++ new/liferea-1.16.10/src/db.c 2026-05-25 18:49:20.000000000 +0200 @@ -1,7 +1,7 @@ /** * @file db.c sqlite backend * - * Copyright (C) 2007-2024 Lars Windolf <[email protected]> + * Copyright (C) 2007-2026 Lars Windolf <[email protected]> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -472,9 +472,9 @@ /* 1. Create tables if they do not exist yet */ db_exec ("CREATE TABLE items (" " item_id INTEGER PRIMARY KEY AUTOINCREMENT," - " parent_item_id INTEGER," + " parent_item_id INTEGER," " node_id TEXT," /* FIXME: migrate node ids to real integers */ - " parent_node_id TEXT," /* FIXME: migrate node ids to real integers */ + " parent_node_id TEXT," /* FIXME: migrate node ids to real integers */ " title TEXT," " read INTEGER," " updated INTEGER," @@ -486,7 +486,7 @@ " description TEXT," " date INTEGER," " comment_feed_id TEXT," - " comment INTEGER" + " comment INTEGER" ");"); db_exec ("CREATE INDEX items_idx ON items (source_id);"); @@ -547,6 +547,21 @@ " PRIMARY KEY (node_id, item_id)" ");"); + db_exec ("CREATE TABLE update_state (" + " node_id STRING," + " last_modified STRING," + " last_poll INTEGER," + " last_favicon_poll INTEGER," + " cookies STRING," + " etag STRING," + " last_update INTEGER," + " max_age_minutes INTEGER," + " syn_frequency INTEGER," + " syn_period INTEGER," + " ttl INTEGER," + " PRIMARY KEY (node_id)" + ");"); + db_end_transaction (); /* 2. Removing old triggers */ @@ -607,6 +622,7 @@ " DELETE FROM node WHERE node_id = old.node_id; " " DELETE FROM subscription_metadata WHERE node_id = old.node_id; " " DELETE FROM search_folder_items WHERE parent_node_id = old.node_id; " + " DELETE FROM update_state WHERE node_id = old.node_id; " "END;"); /* Note: view counting triggers are set up in the view preparation code (see db_view_create()) */ @@ -752,6 +768,26 @@ db_new_statement ("nodeRemoveStmt", "DELETE FROM node WHERE node_id = ?;"); + db_new_statement ("updateStateLoadStmt", + "SELECT " + "last_modified," + "last_poll," + "last_favicon_poll," + "cookies," + "etag," + "last_update," + "max_age_minutes," + "syn_frequency," + "syn_period," + "ttl " + "FROM update_state " + "WHERE node_id = ?"); + + db_new_statement ("updateStateSaveStmt", + "REPLACE INTO update_state " + "(node_id,last_modified,last_poll,last_favicon_poll,cookies,etag,max_age_minutes,syn_frequency,syn_period,ttl) " + "VALUES (?,?,?,?,?,?,?,?,?,?)"); + g_assert (sqlite3_get_autocommit (db)); } @@ -1438,6 +1474,67 @@ return count; } +gboolean +db_update_state_load (const gchar *id, + updateStatePtr updateState) +{ + sqlite3_stmt *stmt; + gint res; + + debug (DEBUG_DB, "loading subscription %s update state", id); + + stmt = db_get_statement ("updateStateLoadStmt"); + sqlite3_bind_text (stmt, 1, id, -1, SQLITE_TRANSIENT); + + res = sqlite3_step (stmt); + if (SQLITE_ROW == res) { + updateState->lastModified = g_strdup ((const gchar *) sqlite3_column_text (stmt, 0)); + updateState->lastPoll = sqlite3_column_int64 (stmt, 1); + updateState->lastFaviconPoll = sqlite3_column_int64 (stmt, 2); + updateState->cookies = g_strdup ((const gchar *) sqlite3_column_text (stmt, 3)); + updateState->etag = g_strdup ((const gchar *) sqlite3_column_text (stmt, 4)); + updateState->maxAgeMinutes = sqlite3_column_int (stmt, 5); + updateState->synFrequency = sqlite3_column_int (stmt, 6); + updateState->synPeriod = sqlite3_column_int (stmt, 7); + updateState->timeToLive = sqlite3_column_int (stmt, 8); + } else { + debug (DEBUG_DB, "Could not load update state for subscription %s (error code %d)!", id, res); + } + + sqlite3_finalize (stmt); + + return (SQLITE_ROW == res); +} + +void +db_update_state_save (const gchar *id, + updateStatePtr updateState) +{ + sqlite3_stmt *stmt; + gint res; + + debug (DEBUG_DB, "saving subscription %s update state", id); + + stmt = db_get_statement ("updateStateSaveStmt"); + + sqlite3_bind_text (stmt, 1, id, -1, SQLITE_TRANSIENT); + sqlite3_bind_text (stmt, 2, updateState->lastModified, -1, SQLITE_TRANSIENT); + sqlite3_bind_int64 (stmt, 3, updateState->lastPoll); + sqlite3_bind_int64 (stmt, 4, updateState->lastFaviconPoll); + sqlite3_bind_text (stmt, 5, updateState->cookies, -1, SQLITE_TRANSIENT); + sqlite3_bind_text (stmt, 6, updateState->etag, -1, SQLITE_TRANSIENT); + sqlite3_bind_int (stmt, 7, updateState->maxAgeMinutes); + sqlite3_bind_int (stmt, 8, updateState->synFrequency); + sqlite3_bind_int (stmt, 9, updateState->synPeriod); + sqlite3_bind_int (stmt, 10, updateState->timeToLive); + + res = sqlite3_step (stmt); + if (SQLITE_DONE != res) + g_warning ("Could not save update state for subscription %s (error code %d)!", id, res); + + sqlite3_finalize (stmt); +} + static GSList * db_subscription_metadata_load (const gchar *id) { @@ -1491,6 +1588,7 @@ void db_subscription_load (subscriptionPtr subscription) { + db_update_state_load (subscription->node->id, subscription->updateState); if (subscription->metadata) metadata_list_free (subscription->metadata); subscription->metadata = db_subscription_metadata_load (subscription->node->id); @@ -1522,6 +1620,7 @@ sqlite3_finalize (stmt); + db_update_state_save (subscription->node->id, subscription->updateState); db_subscription_metadata_update (subscription); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/liferea-1.16.9/src/favicon.c new/liferea-1.16.10/src/favicon.c --- old/liferea-1.16.9/src/favicon.c 2026-05-02 14:18:21.000000000 +0200 +++ new/liferea-1.16.10/src/favicon.c 2026-05-25 18:49:20.000000000 +0200 @@ -146,6 +146,26 @@ return slashes; } +/* takes ownership of url if not in list, otherwise free's it */ +static GSList * +favicon_urls_append (const gchar *info, GSList *urls, gchar *url) +{ + g_return_val_if_fail (url != NULL, urls); + + /* Remove trailing slash from URL */ + if (strlen(url) > 0 && url[strlen(url) - 1] == '/') + url[strlen(url) - 1] = 0; + + if (!g_slist_find_custom (urls, url, (GCompareFunc)g_strcmp0)) { + debug (DEBUG_UPDATE, "%s: %s", info, url); + urls = g_slist_append (urls, url); + } else { + g_free (url); + } + + return urls; +} + /* * This code tries to download from a series of URLs. If there are no * favicons, this will make five downloads, three of which will be 404 @@ -169,15 +189,13 @@ /* case 1: the feed parser passed us an icon URL in the subscription metadata */ if (metadata_list_get (subscription->metadata, "icon")) { tmp = g_strstrip (g_strdup (metadata_list_get (subscription->metadata, "icon"))); - urls = g_slist_append (urls, tmp); - debug (DEBUG_UPDATE, "(1) adding favicon search URL: %s", tmp); + urls = favicon_urls_append ("(1) adding favicon search URL", urls, tmp); } /* case 2: */ if (html_url && g_strstr_len (html_url, -1, "://")) { tmp = g_strstrip (g_strdup (html_url)); - urls = g_slist_append (urls, tmp); - debug (DEBUG_UPDATE, "(2) adding favicon search URL: %s", tmp); + urls = favicon_urls_append ("(2) adding favicon search URL", urls, tmp); } /* case 3: */ @@ -191,8 +209,7 @@ tmp = strrchr (tmp, '/'); if (tmp) { *tmp = 0; - urls = g_slist_append (urls, g_strdup (tmp2)); - debug (DEBUG_UPDATE, "(3) adding favicon search URL: %s", tmp2); + urls = favicon_urls_append ("(3) adding favicon search URL", urls, g_strdup (tmp2)); } g_free (tmp2); } @@ -206,13 +223,10 @@ tmp = strchr (tmp + 3, '/'); if (tmp) { *tmp = 0; - tmp = tmp2; - tmp2 = g_strdup_printf ("%s/favicon.ico", tmp); - urls = g_slist_append (urls, tmp2); - debug (DEBUG_UPDATE, "(4) adding favicon source URL: %s", tmp2); + urls = favicon_urls_append ("(4) adding favicon source URL:", urls, g_strdup_printf ("%s/favicon.ico", tmp2)); } } - g_free (tmp); + g_free (tmp2); } } @@ -222,12 +236,9 @@ tmp = strrchr(tmp, '/'); if (tmp) { *tmp = 0; - tmp = tmp2; - tmp2 = g_strdup_printf ("%s/favicon.ico", tmp); - urls = g_slist_append (urls, tmp2); - debug (DEBUG_UPDATE, "(5) adding favicon source URL: %s", tmp2); + urls = favicon_urls_append ("(5) adding favicon source URL", urls, g_strdup_printf ("%s/favicon.ico", tmp2)); } - g_free (tmp); + g_free (tmp2); /* case 6: */ tmp = tmp2 = g_strstrip (g_strdup (source_url)); @@ -236,13 +247,10 @@ tmp = strchr (tmp + 3, '/'); /* to skip to first subpath */ if (tmp) { *tmp = 0; - tmp = tmp2; - tmp2 = g_strdup_printf ("%s/favicon.ico", tmp); - urls = g_slist_append (urls, tmp2); - debug (DEBUG_UPDATE, "(6) adding favicon source URL: %s", tmp2); + urls = favicon_urls_append ("(6) adding favicon source URL", urls, g_strdup_printf ("%s/favicon.ico", tmp2)); } } - g_free (tmp); + g_free (tmp2); } return urls; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/liferea-1.16.9/src/net.c new/liferea-1.16.10/src/net.c --- old/liferea-1.16.9/src/net.c 2026-05-02 14:18:21.000000000 +0200 +++ new/liferea-1.16.10/src/net.c 2026-05-25 18:49:20.000000000 +0200 @@ -1,7 +1,7 @@ /** * @file net.c HTTP network access using libsoup * - * Copyright (C) 2007-2023 Lars Windolf <[email protected]> + * Copyright (C) 2007-2026 Lars Windolf <[email protected]> * Copyright (C) 2009 Emilio Pozuelo Monfort <[email protected]> * Copyright (C) 2021 Lorenzo L. Ancora <[email protected]> * @@ -75,7 +75,6 @@ SoupSession *session = SOUP_SESSION (obj); SoupMessage *msg; UpdateJob * job = (UpdateJob *)user_data; - GDateTime *last_modified; const gchar *tmp = NULL; GHashTable *params; gboolean revalidated = FALSE; @@ -127,32 +126,17 @@ job->result->contentType = g_strdup (soup_message_headers_get_content_type (soup_message_get_response_headers (msg), NULL)); - /* Update last-modified date */ - if (revalidated) { - job->result->updateState->lastModified = update_state_get_lastmodified (job->request->updateState); - } else { - tmp = soup_message_headers_get_one (soup_message_get_response_headers (msg), "Last-Modified"); - if (tmp) { - /* The string may be badly formatted, which will make - * soup_date_new_from_string() return NULL */ - last_modified = soup_date_time_new_from_http_string (tmp); - if (last_modified) { - job->result->updateState->lastModified = g_date_time_to_unix (last_modified); - g_date_time_unref (last_modified); - } - } - } - - /* Update ETag value */ + /* Update last-modified and etag */ if (revalidated) { + job->result->updateState->lastModified = g_strdup (update_state_get_lastmodified (job->request->updateState)); job->result->updateState->etag = g_strdup (update_state_get_etag (job->request->updateState)); } else { - tmp = soup_message_headers_get_one (soup_message_get_response_headers (msg), "ETag"); - if (tmp) { - job->result->updateState->etag = g_strdup (tmp); - } + update_state_set_lastmodified (job->result->updateState, soup_message_headers_get_one (soup_message_get_response_headers (msg), "Last-Modified")); + update_state_set_etag (job->result->updateState, soup_message_headers_get_one (soup_message_get_response_headers (msg), "ETag")); } + /* No cookie persisting, we support only cookie sending! */ + /* Update cache max-age */ tmp = soup_message_headers_get_list (soup_message_get_response_headers (msg), "Cache-Control"); if (tmp) { @@ -267,14 +251,9 @@ /* Set the If-Modified-Since: header */ if (job->request->updateState && update_state_get_lastmodified (job->request->updateState)) { - g_autofree gchar *datestr = NULL; - g_autoptr(GDateTime) date; - - date = g_date_time_new_from_unix_utc (update_state_get_lastmodified (job->request->updateState)); - datestr = soup_date_time_to_string (date, SOUP_DATE_HTTP); soup_message_headers_append (request_headers, "If-Modified-Since", - datestr); + update_state_get_lastmodified (job->request->updateState)); } /* Set the If-None-Match header */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/liferea-1.16.9/src/tests/favicon.c new/liferea-1.16.10/src/tests/favicon.c --- old/liferea-1.16.9/src/tests/favicon.c 2026-05-02 14:18:21.000000000 +0200 +++ new/liferea-1.16.10/src/tests/favicon.c 2026-05-25 18:49:20.000000000 +0200 @@ -1,7 +1,7 @@ /** * @file favicon.c Test cases for favicon auto discovery * - * Copyright (C) 2020 Lars Windolf <[email protected]> + * Copyright (C) 2020-2026 Lars Windolf <[email protected]> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,6 +20,7 @@ #include <glib.h> +#include "debug.h" #include "favicon.h" #include "metadata.h" #include "subscription.h" @@ -53,12 +54,8 @@ "https://slashdot.org/", NULL, { - // 1.) is missing - "https://slashdot.org/", "https://slashdot.org", "https://slashdot.org/favicon.ico", - "https://slashdot.org/favicon.ico", - "https://slashdot.org/favicon.ico", NULL } }; @@ -70,11 +67,9 @@ "https://slashdot.org/favicon.ico", { "https://slashdot.org/favicon.ico", - "https://slashdot.org/news/", + "https://slashdot.org/news", "https://slashdot.org/feed", - "https://slashdot.org/favicon.ico", "https://slashdot.org/feed/favicon.ico", - "https://slashdot.org/favicon.ico", NULL } }; @@ -85,12 +80,10 @@ "https://news.com/news/", NULL, { - // 1.) is missing - "https://news.com/news/", + "https://news.com/news", "https://example.com", "https://news.com/favicon.ico", "https://example.com/favicon.ico", - "https://example.com/favicon.ico", NULL } }; @@ -178,6 +171,10 @@ { g_test_init (&argc, &argv, NULL); + if (g_strv_contains ((const gchar **)argv, "--debug")) + debug_set_flags (DEBUG_UPDATE | DEBUG_HTML | DEBUG_PARSING); + + g_test_add_data_func ("/favicon/tc1", &tc1, &tc_favicon_get_urls); g_test_add_data_func ("/favicon/tc2", &tc2, &tc_favicon_get_urls); g_test_add_data_func ("/favicon/tc3", &tc3, &tc_favicon_get_urls); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/liferea-1.16.9/src/ui/liferea_browser.c new/liferea-1.16.10/src/ui/liferea_browser.c --- old/liferea-1.16.9/src/ui/liferea_browser.c 2026-05-02 14:18:21.000000000 +0200 +++ new/liferea-1.16.10/src/ui/liferea_browser.c 2026-05-25 18:49:20.000000000 +0200 @@ -1,7 +1,7 @@ /* * @file liferea_browser.c Liferea embedded browser * - * Copyright (C) 2003-2025 Lars Windolf <[email protected]> + * Copyright (C) 2003-2026 Lars Windolf <[email protected]> * Copyright (C) 2005-2006 Nathan J. Conrad <[email protected]> * * This program is free software; you can redistribute it and/or modify @@ -603,6 +603,8 @@ tmp = g_string_new (liferea_browser_get_template (browser, name)); g_string_replace (tmp, "REPLACE_MARKER", script, 1); + // do not use liferea_browser_write() as we need to write XHTML here + // which is produced by intltool liferea_webkit_write_html (browser->renderWidget, tmp->str, strlen (tmp->str), baseURL, "text/html"); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/liferea-1.16.9/src/update.c new/liferea-1.16.10/src/update.c --- old/liferea-1.16.9/src/update.c 2026-05-02 14:18:21.000000000 +0200 +++ new/liferea-1.16.10/src/update.c 2026-05-25 18:49:20.000000000 +0200 @@ -1,7 +1,7 @@ /** * @file update.c generic update request and state processing * - * Copyright (C) 2003-2024 Lars Windolf <[email protected]> + * Copyright (C) 2003-2026 Lars Windolf <[email protected]> * Copyright (C) 2004-2006 Nathan J. Conrad <[email protected]> * Copyright (C) 2009 Adrian Bunk <[email protected]> * @@ -30,16 +30,19 @@ return g_new0 (struct updateState, 1); } -glong +const gchar * update_state_get_lastmodified (updateStatePtr state) { return state->lastModified; } void -update_state_set_lastmodified (updateStatePtr state, glong lastModified) +update_state_set_lastmodified (updateStatePtr state, const gchar *lastModified) { - state->lastModified = lastModified; + g_free (state->lastModified); + state->lastModified = NULL; + if (lastModified) + state->lastModified = g_strdup (lastModified); } const gchar * @@ -54,7 +57,7 @@ g_free (state->etag); state->etag = NULL; if (etag) - state->etag = g_strdup(etag); + state->etag = g_strdup (etag); } void @@ -106,6 +109,7 @@ if (!updateState) return; + g_free (updateState->lastModified); g_free (updateState->cookies); g_free (updateState->etag); g_free (updateState); @@ -238,4 +242,4 @@ self->contentType = NULL; self->filterErrors = NULL; self->updateState = update_state_new (); -} \ No newline at end of file +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/liferea-1.16.9/src/update.h new/liferea-1.16.10/src/update.h --- old/liferea-1.16.9/src/update.h 2026-05-02 14:18:21.000000000 +0200 +++ new/liferea-1.16.10/src/update.h 2026-05-25 18:49:20.000000000 +0200 @@ -1,7 +1,7 @@ /** * @file update_request.h generic update request processing * - * Copyright (C) 2003-2024 Lars Windolf <[email protected]> + * Copyright (C) 2003-2026 Lars Windolf <[email protected]> * Copyright (C) 2004-2006 Nathan J. Conrad <[email protected]> * * This program is free software; you can redistribute it and/or modify @@ -54,7 +54,7 @@ /* defines all state data an updatable object (e.g. a feed) needs */ typedef struct updateState { - glong lastModified; /*<< Last modified string as sent by the server */ + gchar *lastModified; /*<< Last modified as sent by the server */ gint64 lastPoll; /*<< time at which the feed was last updated */ gint64 lastFaviconPoll; /*<< time at which the feeds favicon was last updated */ gchar *cookies; /*<< cookies to be used */ @@ -109,8 +109,8 @@ */ updateStatePtr update_state_copy (updateStatePtr state); -glong update_state_get_lastmodified (updateStatePtr state); -void update_state_set_lastmodified (updateStatePtr state, glong lastmodified); +const gchar * update_state_get_lastmodified (updateStatePtr state); +void update_state_set_lastmodified (updateStatePtr state, const gchar *lastmodified); const gchar * update_state_get_etag (updateStatePtr state); void update_state_set_etag (updateStatePtr state, const gchar *etag); ++++++ liferea.obsinfo ++++++ --- /var/tmp/diff_new_pack.u0hf7Y/_old 2026-05-30 22:57:52.187619343 +0200 +++ /var/tmp/diff_new_pack.u0hf7Y/_new 2026-05-30 22:57:52.195619671 +0200 @@ -1,5 +1,5 @@ name: liferea -version: 1.16.9 -mtime: 1777724301 -commit: 27e39b395bbc60ba1a8d231adeb9a2a3bdf340ae +version: 1.16.10 +mtime: 1779727760 +commit: 3a6096c2ce47db742931668dcddf215416292aa1
