rpms/PackageKit/F-11 PackageKit-0.4.6-yum-dont-allow-SIGKILL.patch, NONE, 1.1 PackageKit.spec, 1.104, 1.105

Richard Hughes rhughes at fedoraproject.org
Thu Apr 23 11:29:37 UTC 2009


Author: rhughes

Update of /cvs/pkgs/rpms/PackageKit/F-11
In directory cvs1.fedora.phx.redhat.com:/tmp/cvs-serv9501

Modified Files:
	PackageKit.spec 
Added Files:
	PackageKit-0.4.6-yum-dont-allow-SIGKILL.patch 
Log Message:
* Thu Apr 23 2009 Richard Hughes  <rhughes at redhat.com> - 0.4.6-7
- Backport a patch from upstream to disallow SIGKILL when using the yum
  backend. This is recommended by Panu.


PackageKit-0.4.6-yum-dont-allow-SIGKILL.patch:

--- NEW FILE PackageKit-0.4.6-yum-dont-allow-SIGKILL.patch ---
diff --git a/backends/yum/pk-backend-yum.c b/backends/yum/pk-backend-yum.c
index 05f573c..87228b1 100644
--- a/backends/yum/pk-backend-yum.c
+++ b/backends/yum/pk-backend-yum.c
@@ -63,6 +63,7 @@ backend_initialize (PkBackend *backend)
 	pk_backend_spawn_set_filter_stderr (spawn, backend_stderr_cb);
 	pk_backend_spawn_set_filter_stdout (spawn, backend_stdout_cb);
 	pk_backend_spawn_set_name (spawn, "yum");
+	pk_backend_spawn_set_allow_sigkill (spawn, FALSE);
 }
 
 /**
diff --git a/etc/PackageKit.conf.in b/etc/PackageKit.conf.in
index 36b7e8f..5ab4cd6 100644
--- a/etc/PackageKit.conf.in
+++ b/etc/PackageKit.conf.in
@@ -53,6 +53,21 @@ BackendSpawnNiceValue=10
 # default=true
 BackendSpawnIdleIO=true
 
+# Set whether the spawned backends are allowed to be SIGKILLed if they do not
+# respond to SIGQUIT. This ensures that Cancel() works as expected, but
+# somtimes can corrupt databases if they are open.
+#
+# Only change this to FALSE if your backend can not be SIGKILLed without
+# database corruption.
+#
+# Even if this is set TRUE, the backend can still enforce this FALSE if it it
+# explicitly set in the compiled backend. You can think of this as a fallback
+# value that is used when backends do not enforce policy, or as a way to disable
+# SIGKILL even for backends that calim to support it.
+#
+# default=true
+BackendSpawnAllowSIGKILL=true
+
 # Default backend, as chosen in the configure script. This will be used where
 # no --backend="foo" option is given to the daemon.
 #
diff --git a/src/pk-backend-spawn.c b/src/pk-backend-spawn.c
index 417f142..2942584 100644
--- a/src/pk-backend-spawn.c
+++ b/src/pk-backend-spawn.c
@@ -63,6 +63,7 @@ struct PkBackendSpawnPrivate
 	guint			 backend_finished_id;
 	PkConf			*conf;
 	gboolean		 finished;
+	gboolean		 allow_sigkill;
 	PkBackendSpawnFilterFunc stdout_func;
 	PkBackendSpawnFilterFunc stderr_func;
 };
@@ -763,6 +764,27 @@ pk_backend_spawn_helper (PkBackendSpawn *backend_spawn, const gchar *first_eleme
 }
 
 /**
+ * pk_backend_spawn_set_allow_sigkill:
+ **/
+gboolean
+pk_backend_spawn_set_allow_sigkill (PkBackendSpawn *backend_spawn, gboolean allow_sigkill)
+{
+	gboolean ret = FALSE;
+
+	g_return_val_if_fail (PK_IS_BACKEND_SPAWN (backend_spawn), FALSE);
+
+	/* have we banned this in the config ile */
+	if (!backend_spawn->priv->allow_sigkill && allow_sigkill) {
+		egg_warning ("cannot set allow_cancel TRUE as BackendSpawnAllowSIGKILL is set to FALSE in PackageKit.conf");
+		goto out;
+	}
+
+	ret = pk_spawn_set_allow_sigkill (backend_spawn->priv->spawn, allow_sigkill);
+out:
+	return ret;
+}
+
+/**
  * pk_backend_spawn_finalize:
  **/
 static void
@@ -821,6 +843,10 @@ pk_backend_spawn_init (PkBackendSpawn *backend_spawn)
 			  G_CALLBACK (pk_backend_spawn_stdout_cb), backend_spawn);
 	g_signal_connect (backend_spawn->priv->spawn, "stderr",
 			  G_CALLBACK (pk_backend_spawn_stderr_cb), backend_spawn);
+
+	/* set if SIGKILL is allowed */
+	backend_spawn->priv->allow_sigkill = pk_conf_get_bool (backend_spawn->priv->conf, "BackendSpawnAllowSIGKILL");
+	pk_spawn_set_allow_sigkill (backend_spawn->priv->spawn, backend_spawn->priv->allow_sigkill);
 }
 
 /**
diff --git a/src/pk-backend-spawn.h b/src/pk-backend-spawn.h
index 894c4a6..b55e7ad 100644
--- a/src/pk-backend-spawn.h
+++ b/src/pk-backend-spawn.h
@@ -58,6 +58,8 @@ gboolean	 pk_backend_spawn_kill			(PkBackendSpawn	*backend_spawn);
 const gchar	*pk_backend_spawn_get_name		(PkBackendSpawn	*backend_spawn);
 gboolean	 pk_backend_spawn_set_name		(PkBackendSpawn	*backend_spawn,
 							 const gchar	*name);
+gboolean	 pk_backend_spawn_set_allow_sigkill	(PkBackendSpawn	*backend_spawn,
+							 gboolean	 allow_sigkill);
 
 /* filtering */
 typedef gboolean (*PkBackendSpawnFilterFunc)		(PkBackend	*backend,
diff --git a/src/pk-spawn.c b/src/pk-spawn.c
index bd609e4..5c356a1 100644
--- a/src/pk-spawn.c
+++ b/src/pk-spawn.c
@@ -69,6 +69,7 @@ struct PkSpawnPrivate
 	gboolean		 finished;
 	gboolean		 is_sending_exit;
 	gboolean		 is_changing_dispatcher;
+	gboolean		 allow_sigkill;
 	PkSpawnExitType		 exit;
 	GString			*stdout_buf;
 	GString			*stderr_buf;
@@ -293,8 +294,7 @@ pk_spawn_is_running (PkSpawn *spawn)
 /**
  * pk_spawn_kill:
  *
- * We send SIGQUIT and after a few ms SIGKILL
- *
+ * We send SIGQUIT and after a few ms SIGKILL (if allowed)
  **/
 gboolean
 pk_spawn_kill (PkSpawn *spawn)
@@ -324,7 +324,26 @@ pk_spawn_kill (PkSpawn *spawn)
 	}
 
 	/* the program might not be able to handle SIGQUIT, give it a few seconds and then SIGKILL it */
-	spawn->priv->kill_id = g_timeout_add (PK_SPAWN_SIGKILL_DELAY, (GSourceFunc) pk_spawn_sigkill_cb, spawn);
+	if (spawn->priv->allow_sigkill)
+		spawn->priv->kill_id = g_timeout_add (PK_SPAWN_SIGKILL_DELAY, (GSourceFunc) pk_spawn_sigkill_cb, spawn);
+
+	return TRUE;
+}
+
+/**
+ * pk_spawn_set_allow_sigkill:
+ *
+ * Set whether the spawned backends are allowed to be SIGKILLed if they do not
+ * respond to SIGQUIT. This ensures that Cancel() works as expected, but
+ * somtimes can corrupt databases if they are open.
+ **/
+gboolean
+pk_spawn_set_allow_sigkill (PkSpawn *spawn, gboolean allow_sigkill)
+{
+	g_return_val_if_fail (PK_IS_SPAWN (spawn), FALSE);
+
+	egg_debug ("setting SIGKILL: %i", allow_sigkill);
+	spawn->priv->allow_sigkill = allow_sigkill;
 
 	return TRUE;
 }
@@ -592,6 +611,7 @@ pk_spawn_init (PkSpawn *spawn)
 	spawn->priv->finished = FALSE;
 	spawn->priv->is_sending_exit = FALSE;
 	spawn->priv->is_changing_dispatcher = FALSE;
+	spawn->priv->allow_sigkill = TRUE;
 	spawn->priv->last_argv0 = NULL;
 	spawn->priv->last_envp = NULL;
 	spawn->priv->exit = PK_SPAWN_EXIT_TYPE_UNKNOWN;
diff --git a/src/pk-spawn.h b/src/pk-spawn.h
index 6d81bab..8901fb0 100644
--- a/src/pk-spawn.h
+++ b/src/pk-spawn.h
@@ -73,6 +73,8 @@ gboolean	 pk_spawn_argv				(PkSpawn	*spawn,
 gboolean	 pk_spawn_is_running			(PkSpawn	*spawn);
 gboolean	 pk_spawn_kill				(PkSpawn	*spawn);
 gboolean	 pk_spawn_exit				(PkSpawn	*spawn);
+gboolean	 pk_spawn_set_allow_sigkill		(PkSpawn	*spawn,
+							 gboolean	 allow_sigkill);
 
 G_END_DECLS
 


Index: PackageKit.spec
===================================================================
RCS file: /cvs/pkgs/rpms/PackageKit/F-11/PackageKit.spec,v
retrieving revision 1.104
retrieving revision 1.105
diff -u -r1.104 -r1.105
--- PackageKit.spec	22 Apr 2009 11:09:34 -0000	1.104
+++ PackageKit.spec	23 Apr 2009 11:29:06 -0000	1.105
@@ -10,7 +10,7 @@
 Name:      PackageKit
 Version:   0.4.6
 #Release:   0.3.%{?alphatag}git%{?dist}
-Release:   6%{?dist}
+Release:   7%{?dist}
 License:   GPLv2+
 Group:     System Environment/Libraries
 URL:       http://www.packagekit.org
@@ -51,6 +51,9 @@
 # Already upstream: 6ed10da156d9130f5443c1348405434cdc0cdfce
 Patch10:   PackageKit-0.4.6-send-package-finished.patch
 
+# Already upstream: 33894239b42dcb6069ab3a99e3cb47667448d499..a782056c337562594155a9405adcd9d5e65be32d
+Patch11:   PackageKit-0.4.6-yum-dont-allow-SIGKILL.patch
+
 Requires: dbus >= %{dbus_version}
 Requires: dbus-glib >= %{dbus_glib_version}
 Requires: PackageKit-glib = %{version}-%{release}
@@ -260,6 +263,7 @@
 %patch8 -p1 -b .presto-filter
 %patch9 -p1 -b .presto-downloading-updates
 %patch10 -p1 -b .send-package-finished
+%patch11 -p1 -b .disallow-sigkill
 
 %build
 %configure --enable-yum --enable-smart --with-default-backend=yum --disable-local --disable-ruck
@@ -454,6 +458,10 @@
 %{_includedir}/PackageKit/backend/*.h
 
 %changelog
+* Thu Apr 23 2009 Richard Hughes  <rhughes at redhat.com> - 0.4.6-7
+- Backport a patch from upstream to disallow SIGKILL when using the yum
+  backend. This is recommended by Panu.
+
 * Wed Apr 22 2009 Richard Hughes  <rhughes at redhat.com> - 0.4.6-6
 - Send ::Package(finished) when we've finished downloading a file rather than
   relying for the daemon to clean up for us.




More information about the fedora-extras-commits mailing list