From a5faef330e5840f9bf46462000c41607d1194540 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Wed, 29 Jan 2014 11:01:00 -0500
Subject: [PATCH] display: fix memory leak if AddUserAuthentication called more
than once
Noted on downstream bug:
https://bugzilla.redhat.com/show_bug.cgi?id=1020885
---
daemon/gdm-display.c | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/daemon/gdm-display.c b/daemon/gdm-display.c
index b1adae8..352dd92 100644
--- a/daemon/gdm-display.c
+++ b/daemon/gdm-display.c
@@ -198,61 +198,68 @@ gdm_display_real_create_authority (GdmDisplay *display)
display->priv->access_file = access_file;
return TRUE;
}
gboolean
gdm_display_create_authority (GdmDisplay *display)
{
gboolean ret;
g_return_val_if_fail (GDM_IS_DISPLAY (display), FALSE);
g_object_ref (display);
ret = GDM_DISPLAY_GET_CLASS (display)->create_authority (display);
g_object_unref (display);
return ret;
}
static gboolean
gdm_display_real_add_user_authorization (GdmDisplay *display,
const char *username,
char **filename,
GError **error)
{
GdmDisplayAccessFile *access_file;
GError *access_file_error;
gboolean res;
g_return_val_if_fail (GDM_IS_DISPLAY (display), FALSE);
- g_return_val_if_fail (display->priv->access_file != NULL, FALSE);
+
+ if (display->priv->user_access_file != NULL) {
+ g_set_error (error,
+ G_DBUS_ERROR,
+ G_DBUS_ERROR_ACCESS_DENIED,
+ "user access already assigned");
+ return FALSE;
+ }
g_debug ("GdmDisplay: Adding user authorization for %s", username);
access_file_error = NULL;
access_file = _create_access_file_for_user (display,
username,
&access_file_error);
if (access_file == NULL) {
g_propagate_error (error, access_file_error);
return FALSE;
}
res = gdm_display_access_file_add_display_with_cookie (access_file,
display,
display->priv->x11_cookie,
display->priv->x11_cookie_size,
&access_file_error);
if (! res) {
g_debug ("GdmDisplay: Unable to add user authorization for %s: %s",
username,
access_file_error->message);
g_propagate_error (error, access_file_error);
gdm_display_access_file_close (access_file);
g_object_unref (access_file);
return FALSE;
}
*filename = gdm_display_access_file_get_path (access_file);
display->priv->user_access_file = access_file;
--
1.8.4.2