gnome-keyring r1120 - in trunk: . library ui



Author: nnielsen
Date: Thu Mar 13 21:18:17 2008
New Revision: 1120
URL: http://svn.gnome.org/viewvc/gnome-keyring?rev=1120&view=rev

Log:
	* library/gnome-keyring.c: 
	* ui/gkr-ask-request.c: Avoid usage of the 'environ' global
	variable and use g_list_env() instead. Fixes bug #522027


Modified:
   trunk/ChangeLog
   trunk/library/gnome-keyring.c
   trunk/ui/gkr-ask-request.c

Modified: trunk/library/gnome-keyring.c
==============================================================================
--- trunk/library/gnome-keyring.c	(original)
+++ trunk/library/gnome-keyring.c	Thu Mar 13 21:18:17 2008
@@ -1784,12 +1784,27 @@
 {
 	GkrBuffer send, receive;
 	GnomeKeyringResult res;
-	gchar **daemonenv, **e;
+	gchar **envp, **e, *name;
 	gchar **parts;
+	gboolean ret;
 
 	gkr_buffer_init_full (&send, 128, NORMAL_ALLOCATOR);
 
-	if (!gkr_proto_encode_prepare_environment (&send, (const gchar**)environ)) {
+	/* Get all the environment names */
+	envp = g_listenv ();
+	g_return_val_if_fail (envp, GNOME_KEYRING_RESULT_BAD_ARGUMENTS);
+	
+	/* Transform them into NAME=VALUE pairs */
+	for (e = envp; *e; ++e) {
+		name = *e;
+		*e = g_strdup_printf ("%s=%s", name, g_getenv (name));
+		g_free (name);
+	}
+
+	ret = gkr_proto_encode_prepare_environment (&send, (const gchar**)envp);
+	g_strfreev (envp);
+	
+	if (!ret) {
 		gkr_buffer_uninit (&send);
 		return GNOME_KEYRING_RESULT_BAD_ARGUMENTS;
 	}
@@ -1802,22 +1817,23 @@
 		return res;
 	}
 
-	if (!gkr_proto_decode_prepare_environment_reply (&receive, &res, &daemonenv)) {
+	if (!gkr_proto_decode_prepare_environment_reply (&receive, &res, &envp)) {
 		gkr_buffer_uninit (&receive);
 		return GNOME_KEYRING_RESULT_IO_ERROR;
 	}
 	gkr_buffer_uninit (&receive);
 	
 	if (res == GNOME_KEYRING_RESULT_OK) {
-		for (e = daemonenv; *e; ++e) {
+		g_return_val_if_fail (envp, GNOME_KEYRING_RESULT_IO_ERROR);
+		for (e = envp; *e; ++e) {
 			parts = g_strsplit (*e, "=", 2);
 			if (parts && parts[0] && parts[1])
 				g_setenv (parts[0], parts[1], TRUE);
 			g_strfreev (parts);
-}
+		}
 	}
 	
-	g_strfreev (daemonenv);
+	g_strfreev (envp);
 
 	return res;
 }

Modified: trunk/ui/gkr-ask-request.c
==============================================================================
--- trunk/ui/gkr-ask-request.c	(original)
+++ trunk/ui/gkr-ask-request.c	Thu Mar 13 21:18:17 2008
@@ -539,30 +539,38 @@
 launch_ask_helper (GkrAskRequest *ask)
 {
 	GkrAskRequestPrivate *pv = GKR_ASK_REQUEST_GET_PRIVATE (ask);
-	char **envp;
+	gchar **names, **envp;
 	int i, n;
 	GError *error = NULL;
+	gboolean ret;
+	
 	char *argv[] = {
 		LIBEXECDIR "/gnome-keyring-ask",
 		NULL,
 	};
 
 	/* Calculate us some environment */
-	i = 0;
-	while (environ[i])
+	names = g_listenv ();
+	g_return_val_if_fail (names, FALSE);
+	i = 0; 
+	while (names[i])
 		++i;
 	n = i;
 	
 	/* Any environment we have */
 	envp = g_new (char*, n + 2);
 	for (i = 0; i < n; i++)
-		envp[i] = g_strdup (environ[i]);
+		envp[i] = g_strdup_printf ("%s=%s", names[i], g_getenv (names[i]));
 	envp[i++] = NULL;
+	g_strfreev (names);
 
 	gkr_buffer_resize (&pv->buffer, 0);
 	
-	if (!g_spawn_async_with_pipes (NULL, argv, envp, 0, NULL, NULL, &pv->ask_pid, 
-	                               &pv->in_fd, &pv->out_fd, NULL, &error)) {
+	ret = g_spawn_async_with_pipes (NULL, argv, envp, 0, NULL, NULL, &pv->ask_pid, 
+	                                &pv->in_fd, &pv->out_fd, NULL, &error);
+	g_strfreev (envp);
+	
+	if (!ret) {
 		g_warning ("couldn't spawn gnome-keyring-ask tool: %s", 
 		           error && error->message ? error->message : "unknown error");
 		pv->out_fd = -1;
@@ -570,7 +578,6 @@
 		return FALSE;
 	} 
 	
-	g_strfreev (envp);
 	return TRUE;
 }
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]