Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package at-spi2-core for openSUSE:Factory checked in at 2026-09-19 22:19:35 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/at-spi2-core (Old) and /work/SRC/openSUSE:Factory/.at-spi2-core.new.383539 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "at-spi2-core" Sat Sep 19 22:19:35 2026 rev:129 rq:1378743 version:2.60.7 Changes: -------- --- /work/SRC/openSUSE:Factory/at-spi2-core/at-spi2-core.changes 2026-08-09 21:32:18.535982963 +0200 +++ /work/SRC/openSUSE:Factory/.at-spi2-core.new.383539/at-spi2-core.changes 2026-09-19 22:19:44.060086185 +0200 @@ -1,0 +2,8 @@ +Wed Sep 16 15:25:57 UTC 2026 - Bjørn Lie <[email protected]> + +- Update to version 2.60.7: + + libatspi: Fix transfer annotation on + atspi_document_get_text_selections. + + atk-bridge: Release disconnected direct connections. + +------------------------------------------------------------------- Old: ---- at-spi2-core-2.60.6.tar.xz New: ---- at-spi2-core-2.60.7.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ at-spi2-core.spec ++++++ --- /var/tmp/diff_new_pack.6fdwqT/_old 2026-09-19 22:19:45.251135462 +0200 +++ /var/tmp/diff_new_pack.6fdwqT/_new 2026-09-19 22:19:45.253135544 +0200 @@ -23,7 +23,7 @@ %define atspiconfdir %{?_distconfdir}%{!?_distconfdir:%{_sysconfdir}} Name: at-spi2-core -Version: 2.60.6 +Version: 2.60.7 Release: 0 Summary: Assistive Technology Service Provider Interface - D-Bus based implementation License: LGPL-2.1-or-later ++++++ _scmsync.obsinfo ++++++ --- /var/tmp/diff_new_pack.6fdwqT/_old 2026-09-19 22:19:45.282136744 +0200 +++ /var/tmp/diff_new_pack.6fdwqT/_new 2026-09-19 22:19:45.285136868 +0200 @@ -1,6 +1,7 @@ -mtime: 1785657245 -commit: 95c3aca3ba19c83013429728ccbd7be3f2dafffb9b92ad7d4688304870052066 +mtime: 1789572453 +commit: fe6945d05b32b761ffd3831f3742bd6bf5407288008c67cc575e4c9669dc3415 url: https://src.opensuse.org/GNOME/at-spi2-core -revision: 95c3aca3ba19c83013429728ccbd7be3f2dafffb9b92ad7d4688304870052066 +revision: fe6945d05b32b761ffd3831f3742bd6bf5407288008c67cc575e4c9669dc3415 +trackingbranch: factory projectscmsync: https://src.opensuse.org/GNOME/_ObsPrj ++++++ _service ++++++ --- /var/tmp/diff_new_pack.6fdwqT/_old 2026-09-19 22:19:45.300137489 +0200 +++ /var/tmp/diff_new_pack.6fdwqT/_new 2026-09-19 22:19:45.305137696 +0200 @@ -3,7 +3,7 @@ <service name="obs_scm" mode="manual"> <param name="scm">git</param> <param name="url">https://gitlab.gnome.org/GNOME/at-spi2-core.git</param> - <param name="revision">2.60.6</param> + <param name="revision">2.60.7</param> <param name="versionformat">@PARENT_TAG@+@TAG_OFFSET@</param> <param name="versionrewrite-pattern">(.*)\+0</param> <param name="versionrewrite-replacement">\1</param> ++++++ at-spi2-core-2.60.6.tar.xz -> at-spi2-core-2.60.7.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/at-spi2-core-2.60.6/NEWS new/at-spi2-core-2.60.7/NEWS --- old/at-spi2-core-2.60.6/NEWS 2026-07-31 20:32:41.000000000 +0200 +++ new/at-spi2-core-2.60.7/NEWS 2026-09-16 17:18:14.000000000 +0200 @@ -1,3 +1,9 @@ +What's new in at-spi2-core 2.60.7: + +* libatspi: Fix transfer annotation on atspi_document_get_text_selections. + +* atk-bridge: Release disconnected direct connections. + What's new in at-spi2-core 2.60.6: * atk-bridge: Attempt to fix a crash in get_registered_event_listeners diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/at-spi2-core-2.60.6/atk-adaptor/bridge.c new/at-spi2-core-2.60.7/atk-adaptor/bridge.c --- old/at-spi2-core-2.60.6/atk-adaptor/bridge.c 2026-07-31 20:32:41.000000000 +0200 +++ new/at-spi2-core-2.60.7/atk-adaptor/bridge.c 2026-09-16 17:18:14.000000000 +0200 @@ -681,15 +681,51 @@ } static void +remove_direct_connection (DBusConnection *connection) +{ + GList *link; + + link = g_list_find (spi_global_app_data->direct_connections, connection); + if (!link) + return; + + droute_context_unregister (spi_global_app_data->droute, connection); + droute_unintercept_dbus (connection); + spi_global_app_data->direct_connections = + g_list_delete_link (spi_global_app_data->direct_connections, link); + dbus_connection_unref (connection); +} + +static DBusHandlerResult +direct_connection_filter (DBusConnection *connection, + DBusMessage *message, + void *user_data) +{ + if (dbus_message_is_signal (message, DBUS_INTERFACE_LOCAL, "Disconnected")) + { + dbus_connection_remove_filter (connection, + direct_connection_filter, + NULL); + remove_direct_connection (connection); + } + + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; +} + +static void new_connection_cb (DBusServer *server, DBusConnection *con, void *data) { dbus_connection_set_unix_user_function (con, user_check, NULL, NULL); + if (!dbus_connection_add_filter (con, direct_connection_filter, NULL, NULL)) + return; + dbus_connection_ref (con); atspi_dbus_connection_setup_with_g_main (con, spi_context); droute_intercept_dbus (con); droute_context_register (spi_global_app_data->droute, con); - spi_global_app_data->direct_connections = g_list_append (spi_global_app_data->direct_connections, con); + spi_global_app_data->direct_connections = + g_list_append (spi_global_app_data->direct_connections, con); } static gchar *atspi_dbus_name = NULL; @@ -1314,7 +1350,6 @@ void atk_bridge_adaptor_cleanup (void) { - GList *l; GSList *ls; if (!inited) @@ -1330,19 +1365,18 @@ deactivate_bus (); - for (l = spi_global_app_data->direct_connections; l; l = l->next) + while (spi_global_app_data->direct_connections) { DBusConnection *connection; - connection = l->data; + connection = spi_global_app_data->direct_connections->data; - droute_context_unregister (spi_global_app_data->droute, connection); - droute_unintercept_dbus (connection); + dbus_connection_remove_filter (connection, + direct_connection_filter, + NULL); dbus_connection_close (connection); - dbus_connection_unref (connection); + remove_direct_connection (connection); } - g_list_free (spi_global_app_data->direct_connections); - spi_global_app_data->direct_connections = NULL; for (ls = clients; ls; ls = ls->next) g_free (ls->data); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/at-spi2-core-2.60.6/atspi/atspi-document.c new/at-spi2-core-2.60.7/atspi/atspi-document.c --- old/at-spi2-core-2.60.6/atspi/atspi-document.c 2026-07-31 20:32:41.000000000 +0200 +++ new/at-spi2-core-2.60.7/atspi/atspi-document.c 2026-09-16 17:18:14.000000000 +0200 @@ -23,6 +23,27 @@ #include "atspi-private.h" +static AtspiTextSelection * +atspi_text_selection_copy (AtspiTextSelection *src) +{ + AtspiTextSelection *dst = g_new (AtspiTextSelection, 1); + dst->start_object = g_object_ref (src->start_object); + dst->start_offset = src->start_offset; + dst->end_object = g_object_ref (src->end_object); + dst->end_offset = src->end_offset; + return dst; +} + +static void +atspi_text_selection_free (AtspiTextSelection *selection) +{ + g_clear_object (&selection->start_object); + g_clear_object (&selection->end_object); + g_free (selection); +} + +G_DEFINE_BOXED_TYPE (AtspiTextSelection, atspi_text_selection, atspi_text_selection_copy, atspi_text_selection_free) + /** * atspi_document_get_locale: * @obj: a pointer to the #AtspiDocument object on which to operate. @@ -187,7 +208,7 @@ * * Returns an array of AtspiTextSelections within this document. * - * Returns: (element-type AtspiTextSelection) (transfer full): a GArray of + * Returns: (element-type AtspiTextSelection) (transfer container): a GArray of * AtspiTextSelection structures representing the selection. * * Since: 2.52 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/at-spi2-core-2.60.6/atspi/atspi-document.h new/at-spi2-core-2.60.7/atspi/atspi-document.h --- old/at-spi2-core-2.60.6/atspi/atspi-document.h 2026-07-31 20:32:41.000000000 +0200 +++ new/at-spi2-core-2.60.7/atspi/atspi-document.h 2026-09-16 17:18:14.000000000 +0200 @@ -81,6 +81,15 @@ gboolean start_is_active; }; +/** + * ATSPI_TYPE_TEXT_SELECTION: + * + * The #GType for a boxed type holding a text selection within a document. + */ +#define ATSPI_TYPE_TEXT_SELECTION atspi_text_selection_get_type () + +GType atspi_text_selection_get_type (); + struct _AtspiDocument { GTypeInterface parent; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/at-spi2-core-2.60.6/meson.build new/at-spi2-core-2.60.7/meson.build --- old/at-spi2-core-2.60.6/meson.build 2026-07-31 20:32:41.000000000 +0200 +++ new/at-spi2-core-2.60.7/meson.build 2026-09-16 17:18:14.000000000 +0200 @@ -1,5 +1,5 @@ project('at-spi2-core', 'c', - version: '2.60.6', + version: '2.60.7', license: 'LGPLv2.1+', default_options: [ 'buildtype=debugoptimized', diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/at-spi2-core-2.60.6/tests/at-spi2-atk/meson.build new/at-spi2-core-2.60.7/tests/at-spi2-atk/meson.build --- old/at-spi2-core-2.60.6/tests/at-spi2-atk/meson.build 2026-07-31 20:32:41.000000000 +0200 +++ new/at-spi2-core-2.60.7/tests/at-spi2-atk/meson.build 2026-09-16 17:18:14.000000000 +0200 @@ -79,4 +79,16 @@ endif endforeach +direct_connection_test_bin = executable( + 'direct-connection-test', + 'test-direct-connection.c', + dependencies: gio_dep, + c_args: [ + '-DTESTS_BUILD_DIR="@0@"'.format(meson.current_build_dir()), + '-DTESTS_DATA_DIR="@0@"'.format(join_paths(meson.current_source_dir(), 'data')), + ], +) + +test('direct-connection', direct_connection_test_bin, timeout: 30) + test('atk-test', atk_test_bin, timeout: 300) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/at-spi2-core-2.60.6/tests/at-spi2-atk/test-direct-connection.c new/at-spi2-core-2.60.7/tests/at-spi2-atk/test-direct-connection.c --- old/at-spi2-core-2.60.6/tests/at-spi2-atk/test-direct-connection.c 1970-01-01 01:00:00.000000000 +0100 +++ new/at-spi2-core-2.60.7/tests/at-spi2-atk/test-direct-connection.c 2026-09-16 17:18:14.000000000 +0200 @@ -0,0 +1,296 @@ +/* + * AT-SPI - Assistive Technology Service Provider Interface + * + * Copyright 2026 Azamat Almazbek uulu + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + */ + +#include <gio/gio.h> +#include <glib.h> +#include <signal.h> +#include <sys/wait.h> +#include <unistd.h> + +#define TEST_APP_NAME "org.a11y.atspi.test.DirectConnection" +#define ATSPI_ROOT_PATH "/org/a11y/atspi/accessible/root" +#define ATSPI_APPLICATION_INTERFACE "org.a11y.atspi.Application" + +static guint +count_pidfds (GPid pid) +{ + g_autofree gchar *directory_path = NULL; + g_autoptr (GDir) directory = NULL; + const gchar *entry; + guint count = 0; + + directory_path = g_strdup_printf ("/proc/%d/fd", pid); + directory = g_dir_open (directory_path, 0, NULL); + if (!directory) + return 0; + + while ((entry = g_dir_read_name (directory))) + { + g_autofree gchar *fd_path = g_build_filename (directory_path, entry, NULL); + g_autofree gchar *target = g_file_read_link (fd_path, NULL); + + if (g_strcmp0 (target, "anon_inode:[pidfd]") == 0) + count++; + } + + return count; +} + +static gboolean +wait_for_pidfd_count (GPid pid, guint expected) +{ + gint64 deadline = g_get_monotonic_time () + (2 * G_TIME_SPAN_SECOND); + + do + { + if (count_pidfds (pid) == expected) + return TRUE; + g_usleep (10 * 1000); + } + while (g_get_monotonic_time () < deadline); + + return FALSE; +} + +static gboolean +wait_for_pidfd_increase (GPid pid, guint baseline) +{ + gint64 deadline = g_get_monotonic_time () + (2 * G_TIME_SPAN_SECOND); + + do + { + if (count_pidfds (pid) > baseline) + return TRUE; + g_usleep (10 * 1000); + } + while (g_get_monotonic_time () < deadline); + + return FALSE; +} + +static gchar * +get_accessibility_bus_address (void) +{ + g_autoptr (GDBusConnection) session_bus = NULL; + g_autoptr (GVariant) reply = NULL; + g_autoptr (GError) error = NULL; + const gchar *address; + + session_bus = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error); + if (!session_bus) + g_error ("Failed to connect to session bus: %s", error->message); + + reply = g_dbus_connection_call_sync (session_bus, + "org.a11y.Bus", + "/org/a11y/bus", + "org.a11y.Bus", + "GetAddress", + NULL, + G_VARIANT_TYPE ("(s)"), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); + if (!reply) + g_error ("Failed to get accessibility bus address: %s", error->message); + + g_variant_get (reply, "(&s)", &address); + return g_strdup (address); +} + +static gchar * +wait_for_application_address (GDBusConnection *accessibility_bus) +{ + guint attempt; + + for (attempt = 0; attempt < 100; attempt++) + { + g_autoptr (GVariant) reply = NULL; + g_autoptr (GError) error = NULL; + const gchar *address; + + reply = g_dbus_connection_call_sync (accessibility_bus, + TEST_APP_NAME, + ATSPI_ROOT_PATH, + ATSPI_APPLICATION_INTERFACE, + "GetApplicationBusAddress", + NULL, + G_VARIANT_TYPE ("(s)"), + G_DBUS_CALL_FLAGS_NONE, + 100, + NULL, + &error); + if (reply) + { + g_variant_get (reply, "(&s)", &address); + return g_strdup (address); + } + + g_usleep (10 * 1000); + } + + return NULL; +} + +static GDBusConnection * +open_direct_connection (const gchar *address, GError **error) +{ + return g_dbus_connection_new_for_address_sync ( + address, + G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT, + NULL, + NULL, + error); +} + +static gboolean +query_direct_connection (GDBusConnection *connection, GError **error) +{ + g_autoptr (GVariant) reply = NULL; + + reply = g_dbus_connection_call_sync (connection, + NULL, + ATSPI_ROOT_PATH, + ATSPI_APPLICATION_INTERFACE, + "GetApplicationBusAddress", + NULL, + G_VARIANT_TYPE ("(s)"), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + error); + return reply != NULL; +} + +static void +test_direct_connection_is_released (void) +{ + g_autofree gchar *accessibility_bus_address = NULL; + g_autofree gchar *application_address = NULL; + g_autoptr (GDBusConnection) accessibility_bus = NULL; + g_autoptr (GDBusConnection) direct_connection = NULL; + g_autoptr (GError) error = NULL; + gchar *app_argv[] = { + TESTS_BUILD_DIR "/app-test", + "--test-data-file", + TESTS_DATA_DIR "/test.xml", + "--atspi-dbus-name", + TEST_APP_NAME, + NULL, + }; + GPid app_pid = 0; + guint baseline; + guint iteration; + + accessibility_bus_address = get_accessibility_bus_address (); + accessibility_bus = g_dbus_connection_new_for_address_sync ( + accessibility_bus_address, + G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT | + G_DBUS_CONNECTION_FLAGS_MESSAGE_BUS_CONNECTION, + NULL, + NULL, + &error); + if (!accessibility_bus) + g_error ("Failed to connect to accessibility bus: %s", error->message); + + if (!g_spawn_async (NULL, + app_argv, + NULL, + G_SPAWN_DO_NOT_REAP_CHILD, + NULL, + NULL, + &app_pid, + &error)) + g_error ("Failed to start test application: %s", error->message); + + application_address = wait_for_application_address (accessibility_bus); + if (!application_address) + { + g_test_fail_printf ("Test application did not publish its direct bus address"); + goto out; + } + + baseline = count_pidfds (app_pid); + direct_connection = open_direct_connection (application_address, &error); + if (!direct_connection) + { + g_test_fail_printf ("Failed to open direct connection: %s", error->message); + goto out; + } + + if (!query_direct_connection (direct_connection, &error)) + { + g_test_fail_printf ("Failed to query direct connection: %s", error->message); + goto out; + } + + if (!wait_for_pidfd_increase (app_pid, baseline)) + { + g_test_skip ("libdbus does not retain peer credentials in a pidfd"); + goto out; + } + + if (!g_dbus_connection_close_sync (direct_connection, NULL, &error)) + { + g_test_fail_printf ("Failed to close direct connection: %s", error->message); + goto out; + } + g_clear_object (&direct_connection); + + if (!wait_for_pidfd_count (app_pid, baseline)) + { + g_test_fail_printf ("Direct connection pidfd was not released"); + goto out; + } + + for (iteration = 0; iteration < 10; iteration++) + { + direct_connection = open_direct_connection (application_address, &error); + if (!direct_connection) + { + g_test_fail_printf ("Failed to open direct connection: %s", error->message); + goto out; + } + + if (!query_direct_connection (direct_connection, &error)) + { + g_test_fail_printf ("Failed to query direct connection: %s", + error->message); + goto out; + } + + if (!g_dbus_connection_close_sync (direct_connection, NULL, &error)) + { + g_test_fail_printf ("Failed to close direct connection: %s", error->message); + goto out; + } + g_clear_object (&direct_connection); + } + + if (!wait_for_pidfd_count (app_pid, baseline)) + g_test_fail_printf ("Direct connection pidfds accumulated after reconnecting"); + +out: + if (direct_connection) + g_dbus_connection_close_sync (direct_connection, NULL, NULL); + kill (app_pid, SIGTERM); + waitpid (app_pid, NULL, 0); + g_spawn_close_pid (app_pid); +} + +int +main (int argc, char **argv) +{ + g_test_init (&argc, &argv, NULL); + g_test_add_func ("/atk-bridge/direct-connection-is-released", + test_direct_connection_is_released); + return g_test_run (); +} ++++++ at-spi2-core.obsinfo ++++++ --- /var/tmp/diff_new_pack.6fdwqT/_old 2026-09-19 22:19:45.502145846 +0200 +++ /var/tmp/diff_new_pack.6fdwqT/_new 2026-09-19 22:19:45.508146095 +0200 @@ -1,5 +1,5 @@ name: at-spi2-core -version: 2.60.6 -mtime: 1785522761 -commit: fff349553d16f99de3258bdeed7b8a663469b84b +version: 2.60.7 +mtime: 1789571894 +commit: 66707c370bef824ed4edb08a909fc6a61449c12c ++++++ 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-09-16 17:27:33.000000000 +0200 @@ -0,0 +1,5 @@ +*.obscpio +*.osc +_build.* +.pbuild +osc-collab.*
