aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTed Gould <ted@gould.cx>2011-04-14 14:27:49 -0500
committerTed Gould <ted@gould.cx>2011-04-14 14:27:49 -0500
commitb8ece12c8057d848a5b502bf659dddb6fe59fcd9 (patch)
treeb59252a763feee8db758039175657dd0cb5c5f8f
parentb0a027c1d23a80bdee99b119ec10567f51f80b66 (diff)
parentba6c0b194bd2072f98574a22db89a8dfe93734e5 (diff)
downloadayatana-indicator-application-b8ece12c8057d848a5b502bf659dddb6fe59fcd9.tar.gz
ayatana-indicator-application-b8ece12c8057d848a5b502bf659dddb6fe59fcd9.tar.bz2
ayatana-indicator-application-b8ece12c8057d848a5b502bf659dddb6fe59fcd9.zip
Import upstream version 0.3.2
-rw-r--r--ChangeLog36
-rwxr-xr-xconfigure20
-rw-r--r--configure.ac4
-rw-r--r--src/application-service-appstore.c56
4 files changed, 100 insertions, 16 deletions
diff --git a/ChangeLog b/ChangeLog
index de65255..1d8f58c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,41 @@
# Generated by Makefile. Do not edit.
+2011-04-14 Ted Gould <ted@gould.cx>
+
+ 0.3.2
+
+2011-04-12 Ted Gould <ted@gould.cx>
+
+ Make approver signals cancelable
+
+2011-04-12 Michael Terry <mike@mterry.name>
+
+ cancel approver requests too
+
+2011-04-12 Ted Gould <ted@gould.cx>
+
+ Ensure we can cancel GetAll()
+
+2011-04-11 Michael Terry <mike@mterry.name>
+
+ make sure we can cancel GetAll call
+
+2011-04-12 Ted Gould <ted@gould.cx>
+
+ Protect from canceling
+
+2011-04-11 Michael Terry <mike@mterry.name>
+
+ catch one more cancel-before-accessing freed memory instance -- this one resulting in a double free
+
+2011-04-12 Ted Gould <ted@gould.cx>
+
+ Makes sure to free the application using the application_free() function
+
+2011-04-08 Michael Terry <mike@mterry.name>
+
+ don't merely free an app, it has to be properly removed from list and such
+
2011-04-07 Ted Gould <ted@gould.cx>
0.3.1
diff --git a/configure b/configure
index 67f41fe..a177521 100755
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.67 for indicator-application 0.3.1.
+# Generated by GNU Autoconf 2.67 for indicator-application 0.3.2.
#
# Report bugs to <ted@canonical.com>.
#
@@ -703,8 +703,8 @@ MAKEFLAGS=
# Identity of this package.
PACKAGE_NAME='indicator-application'
PACKAGE_TARNAME='indicator-application'
-PACKAGE_VERSION='0.3.1'
-PACKAGE_STRING='indicator-application 0.3.1'
+PACKAGE_VERSION='0.3.2'
+PACKAGE_STRING='indicator-application 0.3.2'
PACKAGE_BUGREPORT='ted@canonical.com'
PACKAGE_URL=''
@@ -1446,7 +1446,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures indicator-application 0.3.1 to adapt to many kinds of systems.
+\`configure' configures indicator-application 0.3.2 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1517,7 +1517,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of indicator-application 0.3.1:";;
+ short | recursive ) echo "Configuration of indicator-application 0.3.2:";;
esac
cat <<\_ACEOF
@@ -1634,7 +1634,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-indicator-application configure 0.3.1
+indicator-application configure 0.3.2
generated by GNU Autoconf 2.67
Copyright (C) 2010 Free Software Foundation, Inc.
@@ -1914,7 +1914,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by indicator-application $as_me 0.3.1, which was
+It was created by indicator-application $as_me 0.3.2, which was
generated by GNU Autoconf 2.67. Invocation command line was
$ $0 $@
@@ -2735,7 +2735,7 @@ fi
# Define the identity of the package.
PACKAGE=indicator-application
- VERSION=0.3.1
+ VERSION=0.3.2
cat >>confdefs.h <<_ACEOF
@@ -12462,7 +12462,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
-This file was extended by indicator-application $as_me 0.3.1, which was
+This file was extended by indicator-application $as_me 0.3.2, which was
generated by GNU Autoconf 2.67. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -12528,7 +12528,7 @@ _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\
-indicator-application config.status 0.3.1
+indicator-application config.status 0.3.2
configured by $0, generated by GNU Autoconf 2.67,
with options \\"\$ac_cs_config\\"
diff --git a/configure.ac b/configure.ac
index 12bc68b..d29a293 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,11 +1,11 @@
-AC_INIT(indicator-application, 0.3.1, ted@canonical.com)
+AC_INIT(indicator-application, 0.3.2, ted@canonical.com)
AC_COPYRIGHT([Copyright 2009, 2010 Canonical])
AC_PREREQ(2.53)
AM_CONFIG_HEADER(config.h)
-AM_INIT_AUTOMAKE(indicator-application, 0.3.1)
+AM_INIT_AUTOMAKE(indicator-application, 0.3.2)
AM_MAINTAINER_MODE
diff --git a/src/application-service-appstore.c b/src/application-service-appstore.c
index 3e827d5..d2678fd 100644
--- a/src/application-service-appstore.c
+++ b/src/application-service-appstore.c
@@ -110,6 +110,7 @@ struct _Application {
gchar * guide;
gboolean currently_free;
guint ordering_index;
+ GList * approver_cancels;
GList * approved_by;
visible_state_t visible_state;
guint name_watcher;
@@ -498,7 +499,8 @@ got_all_properties (GObject * source_object, GAsyncResult * res,
if (menu == NULL || id == NULL || category == NULL || status == NULL ||
icon_name == NULL) {
g_warning("Notification Item on object %s of %s doesn't have enough properties.", app->dbus_object, app->dbus_name);
- g_free(app); // Need to do more than this, but it gives the idea of the flow we're going for.
+ if (!app->validated)
+ application_free(app);
}
else {
app->validated = TRUE;
@@ -576,6 +578,7 @@ static void
get_all_properties (Application * app)
{
if (app->props != NULL && app->props_cancel == NULL) {
+ app->props_cancel = g_cancellable_new();
g_dbus_proxy_call(app->props, "GetAll",
g_variant_new("(s)", NOTIFICATION_ITEM_DBUS_IFACE),
G_DBUS_CALL_FLAGS_NONE, -1, app->props_cancel,
@@ -745,6 +748,11 @@ application_free (Application * app)
if (app->guide != NULL) {
g_free(app->guide);
}
+ if (app->approver_cancels != NULL) {
+ g_list_foreach(app->approver_cancels, (GFunc)g_cancellable_cancel, NULL);
+ g_list_foreach(app->approver_cancels, (GFunc)g_object_unref, NULL);
+ g_list_free(app->approver_cancels);
+ }
if (app->approved_by != NULL) {
g_list_free(app->approved_by);
}
@@ -997,6 +1005,7 @@ application_service_appstore_application_add (ApplicationServiceAppstore * appst
app->guide = NULL;
app->currently_free = FALSE;
app->ordering_index = 0;
+ app->approver_cancels = NULL;
app->approved_by = NULL;
app->visible_state = VISIBLE_STATE_HIDDEN;
app->name_watcher = 0;
@@ -1110,6 +1119,11 @@ props_cb (GObject * object, GAsyncResult * res, gpointer user_data)
GDBusProxy * proxy = g_dbus_proxy_new_for_bus_finish(res, &error);
+ if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
+ g_error_free (error);
+ return; // Must exit before accessing freed memory
+ }
+
if (app->props_cancel != NULL) {
g_object_unref(app->props_cancel);
app->props_cancel = NULL;
@@ -1283,6 +1297,24 @@ static void
remove_approver (gpointer papp, gpointer pproxy)
{
Application * app = (Application *)papp;
+
+ /* Check for any pending approvals and cancel them */
+ GList * iter = app->approver_cancels;
+ while (iter != NULL) {
+ GCancellable * cancel = (GCancellable *)iter->data;
+ GDBusProxy * proxy = (GDBusProxy *)g_object_get_data(G_OBJECT(cancel), "proxy");
+ if (proxy == pproxy) {
+ g_cancellable_cancel(cancel);
+ g_object_unref(cancel);
+
+ GList * next = iter->next;
+ app->approver_cancels = g_list_delete_link(app->approver_cancels, iter);
+ iter = next;
+ } else {
+ iter = iter->next;
+ }
+ }
+
app->approved_by = g_list_remove(app->approved_by, pproxy);
apply_status(app);
return;
@@ -1323,19 +1355,29 @@ static void
approver_request_cb (GObject *object, GAsyncResult *res, gpointer user_data)
{
GDBusProxy * proxy = G_DBUS_PROXY(object);
- Application * app = (Application *)user_data;
+ GCancellable * cancel = (GCancellable *)user_data;
GError * error = NULL;
gboolean approved = TRUE; /* default to approved */
GVariant * result;
result = g_dbus_proxy_call_finish(proxy, res, &error);
+ if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
+ g_error_free (error);
+ return; // Must exit before accessing freed memory
+ }
+
+ Application * app = (Application *)g_object_get_data(G_OBJECT(cancel), "app");
+ app->approver_cancels = g_list_remove(app->approver_cancels, cancel);
+ g_object_unref(cancel);
+
if (error == NULL) {
g_variant_get(result, "(b)", &approved);
g_debug("Approver responded: %s", approved ? "approve" : "rejected");
}
else {
g_debug("Approver responded error: %s", error->message);
+ g_error_free (error);
}
if (approved) {
@@ -1354,12 +1396,18 @@ check_with_new_approver (gpointer papp, gpointer papprove)
{
Application * app = (Application *)papp;
Approver * approver = (Approver *)papprove;
+ GCancellable * cancel = NULL;
+
+ cancel = g_cancellable_new();
+ g_object_set_data(G_OBJECT(cancel), "app", app);
+ g_object_set_data(G_OBJECT(cancel), "proxy", approver->proxy);
+ app->approver_cancels = g_list_prepend(app->approver_cancels, cancel);
g_dbus_proxy_call(approver->proxy, "ApproveItem",
g_variant_new("(ssuso)", app->id, app->category,
0, app->dbus_name, app->dbus_object),
- G_DBUS_CALL_FLAGS_NONE, -1, NULL,
- approver_request_cb, app);
+ G_DBUS_CALL_FLAGS_NONE, -1, cancel,
+ approver_request_cb, cancel);
return;
}