1
=== modified file 'src/Makefile.am'
2
Index: lightdm/src/Makefile.am
3
===================================================================
4
--- lightdm.orig/src/Makefile.am 2013-01-31 11:10:09.868064035 -0500
5
+++ lightdm/src/Makefile.am 2013-01-31 11:10:09.860064035 -0500
13
pkglibexec_PROGRAMS = lightdm-guest-session-wrapper
14
Index: lightdm/src/greeter.c
15
===================================================================
16
--- lightdm.orig/src/greeter.c 2013-01-31 11:10:09.868064035 -0500
17
+++ lightdm/src/greeter.c 2013-01-31 11:10:09.864064035 -0500
25
#include "ldm-marshal.h"
27
/* Buffer for data read from greeter */
30
+ gboolean use_secure_memory;
32
/* Hints for the greeter */
35
greeter->priv->session = g_object_ref (session);
36
greeter->priv->pam_service = g_strdup (pam_service);
37
greeter->priv->autologin_pam_service = g_strdup (autologin_pam_service);
38
+ greeter->priv->use_secure_memory = config_get_boolean (config_get_instance (), "LightDM", "lock-memory");
43
g_hash_table_insert (greeter->priv->hints, g_strdup (name), g_strdup (value));
47
+secure_malloc (Greeter *greeter, size_t n)
49
+ if (greeter->priv->use_secure_memory)
50
+ return gcry_malloc_secure (n);
52
+ return g_malloc (n);
56
+secure_realloc (Greeter *greeter, void *ptr, size_t n)
58
+ if (greeter->priv->use_secure_memory)
59
+ return gcry_realloc (ptr, n);
61
+ return g_realloc (ptr, n);
65
+secure_free (Greeter *greeter, void *ptr)
67
+ if (greeter->priv->use_secure_memory)
68
+ return gcry_free (ptr);
70
+ return g_free (ptr);
77
struct pam_response *response;
78
response = calloc (messages_length, sizeof (struct pam_response));
79
session_respond (greeter->priv->authentication_session, response);
85
int msg_style = messages[i].msg_style;
86
if (msg_style == PAM_PROMPT_ECHO_OFF || msg_style == PAM_PROMPT_ECHO_ON)
88
- response[i].resp = strdup (secrets[j]); // FIXME: Need to convert from UTF-8
89
+ size_t secret_length = strlen (secrets[j]) + 1;
90
+ response[i].resp = secure_malloc (greeter, secret_length);
91
+ memcpy (response[i].resp, secrets[j], secret_length); // FIXME: Need to convert from UTF-8
96
session_respond (greeter->priv->authentication_session, response);
98
+ for (i = 0; i < messages_length; i++)
99
+ secure_free (greeter, response[i].resp);
108
-read_string (Greeter *greeter, gsize *offset)
109
+read_string_full (Greeter *greeter, gsize *offset, void* (*alloc_fn)(size_t n))
114
return g_strdup ("");
117
- value = g_malloc (sizeof (gchar *) * (length + 1));
118
+ value = (*alloc_fn) (sizeof (gchar *) * (length + 1));
119
memcpy (value, greeter->priv->read_buffer + *offset, length);
120
value[length] = '\0';
127
+read_string (Greeter *greeter, gsize *offset)
129
+ return read_string_full (greeter, offset, g_malloc);
133
+read_secret (Greeter *greeter, gsize *offset)
135
+ if (greeter->priv->use_secure_memory)
136
+ return read_string_full (greeter, offset, gcry_malloc_secure);
138
+ return read_string_full (greeter, offset, g_malloc);
142
read_cb (GIOChannel *source, GIOCondition condition, gpointer data)
145
n_to_read = read_int (greeter, &offset);
148
- greeter->priv->read_buffer = g_realloc (greeter->priv->read_buffer, HEADER_SIZE + n_to_read);
149
+ greeter->priv->read_buffer = secure_realloc (greeter, greeter->priv->read_buffer, HEADER_SIZE + n_to_read);
150
read_cb (source, condition, greeter);
153
@@ -690,10 +742,12 @@
154
n_secrets = read_int (greeter, &offset);
155
secrets = g_malloc (sizeof (gchar *) * (n_secrets + 1));
156
for (i = 0; i < n_secrets; i++)
157
- secrets[i] = read_string (greeter, &offset);
158
+ secrets[i] = read_secret (greeter, &offset);
160
handle_continue_authentication (greeter, secrets);
161
- g_strfreev (secrets);
162
+ for (i = 0; i < n_secrets; i++)
163
+ secure_free (greeter, secrets[i]);
166
case GREETER_MESSAGE_CANCEL_AUTHENTICATION:
167
handle_cancel_authentication (greeter);
169
greeter_init (Greeter *greeter)
171
greeter->priv = G_TYPE_INSTANCE_GET_PRIVATE (greeter, GREETER_TYPE, GreeterPrivate);
172
- greeter->priv->read_buffer = g_malloc (HEADER_SIZE);
173
+ greeter->priv->read_buffer = secure_malloc (greeter, HEADER_SIZE);
174
greeter->priv->hints = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
178
g_object_unref (self->priv->session);
179
g_free (self->priv->pam_service);
180
g_free (self->priv->autologin_pam_service);
181
- g_free (self->priv->read_buffer);
182
+ secure_free (self, self->priv->read_buffer);
183
g_hash_table_unref (self->priv->hints);
184
g_free (self->priv->remote_session);
185
if (self->priv->authentication_session)
186
Index: lightdm/src/lightdm.c
187
===================================================================
188
--- lightdm.orig/src/lightdm.c 2013-01-31 11:10:09.868064035 -0500
189
+++ lightdm/src/lightdm.c 2013-01-31 11:10:09.864064035 -0500
193
#include <sys/stat.h>
194
-#include <sys/mman.h>
196
#include "configuration.h"
197
#include "display-manager.h"
198
@@ -1079,12 +1078,6 @@
202
- if (config_get_boolean (config_get_instance (), "LightDM", "lock-memory"))
204
- /* Protect memory from being paged to disk, as we deal with passwords */
205
- mlockall (MCL_CURRENT | MCL_FUTURE);
209
g_debug ("Running in user mode");
210
if (getenv ("DISPLAY"))
211
Index: lightdm/src/session-child.c
212
===================================================================
213
--- lightdm.orig/src/session-child.c 2013-01-31 11:10:09.868064035 -0500
214
+++ lightdm/src/session-child.c 2013-01-31 11:10:09.864064035 -0500
217
#include <security/pam_appl.h>
219
+#include <sys/mman.h>
221
#include "session-child.h"
228
+read_string_full (void* (*alloc_fn)(size_t n))
236
- value = g_malloc (sizeof (char) * (length + 1));
237
+ value = (*alloc_fn) (sizeof (char) * (length + 1));
238
read_data (value, length);
239
value[length] = '\0';
247
+ return read_string_full (g_malloc);
251
pam_conv_cb (int msg_length, const struct pam_message **msg, struct pam_response **resp, void *app_data)
254
for (i = 0; i < msg_length; i++)
256
struct pam_response *r = &response[i];
257
- r->resp = read_string ();
258
+ // callers of this function inside pam will expect to be able to call
259
+ // free() on the strings we give back. So alloc with malloc.
260
+ r->resp = read_string_full (malloc);
261
read_data (&r->resp_retcode, sizeof (r->resp_retcode));
268
+ if (config_get_boolean (config_get_instance (), "LightDM", "lock-memory"))
270
+ /* Protect memory from being paged to disk, as we deal with passwords */
271
+ mlockall (MCL_CURRENT | MCL_FUTURE);
274
/* Make input non-blocking */
275
fd = open ("/dev/null", O_RDONLY);
276
dup2 (fd, STDIN_FILENO);