diff options
author | David Zeuthen <david@fubar.dk> | 2006-03-16 23:28:47 +0000 |
---|---|---|
committer | David Zeuthen <david@fubar.dk> | 2006-03-16 23:28:47 +0000 |
commit | 4fa68a3d911f91c2a6c8af07c673ee8656d3b082 (patch) | |
tree | 02b17aba244b90b9a4e3ab5831eb7e9b30c6d962 | |
parent | f6dd9fa05c574803a2594ed93abb986ae6ec4dcf (diff) | |
download | polkit-4fa68a3d911f91c2a6c8af07c673ee8656d3b082.tar.gz |
Unref when the child dies (polkit_session_initiate_auth): Ref the object
after creating child (polkit_session_initiator_disconnected): Make sure
to nuke the kids
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | polkitd/main.c | 6 | ||||
-rw-r--r-- | polkitd/polkit-session.c | 11 |
3 files changed, 22 insertions, 1 deletions
@@ -1,3 +1,9 @@ +2006-03-16 David Zeuthen <davidz@redhat.com> + + * polkitd/polkit-session.c (data_from_pam): Unref when the child dies + (polkit_session_initiate_auth): Ref the object after creating child + (polkit_session_initiator_disconnected): Make sure to nuke the kids + 2006-03-15 David Zeuthen <davidz@redhat.com> * polkitd/polkit-manager.h: Include sys/types.h; fixed fd.o diff --git a/polkitd/main.c b/polkitd/main.c index 49e2810..f996540 100644 --- a/polkitd/main.c +++ b/polkitd/main.c @@ -214,8 +214,12 @@ main (int argc, char *argv[]) g_error_free (error); goto out; } - + if (request_name_result != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) { + g_warning ("There is already a primary owner of the name org.freedesktop.PolicyKit"); + goto out; + } + manager = polkit_manager_new (bus, bus_proxy); diff --git a/polkitd/polkit-session.c b/polkitd/polkit-session.c index 2356bdf..4e28ab5 100644 --- a/polkitd/polkit-session.c +++ b/polkitd/polkit-session.c @@ -688,6 +688,10 @@ data_from_pam (GIOChannel *source, session->priv->child_pid = 0; waitpid (session->priv->child_pid, &status, 0); } + + /* release the ref we made when creating the child */ + g_object_unref (session); + /* remove the source */ return FALSE; } @@ -773,6 +777,9 @@ polkit_session_initiate_auth (PolicyKitSession *session, session->priv->pam_channel_write = g_io_channel_unix_new (fdsb[1]); session->priv->pam_channel = g_io_channel_unix_new (fds[0]); + /* ref because we need the object in data_from_pam */ + g_object_ref (session); + g_io_add_watch (session->priv->pam_channel, G_IO_IN | G_IO_ERR | G_IO_HUP, data_from_pam, @@ -987,6 +994,10 @@ polkit_session_initiator_disconnected (PolicyKitSession *session) { /*g_debug ("initiator disconnected");*/ + /* if we have a child... kill it */ + if (session->priv->child_pid != 0) + kill (session->priv->child_pid, SIGTERM); + if (session->priv->have_granted_temp_privileges) { if (!polkit_manager_remove_temporary_privilege (session->priv->manager, session->priv->grant_to_uid, |