~brian-murray/lightdm/bug-967229

« back to all changes in this revision

Viewing changes to debian/patches/10_selective_mlock.patch

  • Committer: robert.ancell at canonical
  • Date: 2011-02-12 00:48:57 UTC
  • Revision ID: robert.ancell@canonical.com-20110212004857-45gpv6k0m0uf0liv
Update changelog link

Show diffs side-by-side

added added

removed removed

Lines of Context:
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
6
 
@@ -91,6 +91,7 @@
7
 
 
8
 
 lightdm_LDADD = \
9
 
        $(LIGHTDM_LIBS) \
10
 
+       -lgcrypt \
11
 
        -lpam
12
 
 
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
18
 
@@ -15,6 +15,7 @@
19
 
 #include <string.h>
20
 
 #include <errno.h>
21
 
 #include <fcntl.h>
22
 
+#include <gcrypt.h>
23
 
 
24
 
 #include "greeter.h"
25
 
 #include "ldm-marshal.h"
26
 
@@ -40,6 +41,7 @@
27
 
     /* Buffer for data read from greeter */
28
 
     guint8 *read_buffer;
29
 
     gsize n_read;
30
 
+    gboolean use_secure_memory;
31
 
   
32
 
     /* Hints for the greeter */
33
 
     GHashTable *hints;
34
 
@@ -105,6 +107,7 @@
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");
39
 
 
40
 
     return greeter;
41
 
 }
42
 
@@ -121,6 +124,33 @@
43
 
     g_hash_table_insert (greeter->priv->hints, g_strdup (name), g_strdup (value));
44
 
 }
45
 
 
46
 
+static void *
47
 
+secure_malloc (Greeter *greeter, size_t n)
48
 
+{
49
 
+    if (greeter->priv->use_secure_memory)
50
 
+        return gcry_malloc_secure (n);
51
 
+    else
52
 
+        return g_malloc (n);
53
 
+}
54
 
+
55
 
+static void *
56
 
+secure_realloc (Greeter *greeter, void *ptr, size_t n)
57
 
+{
58
 
+    if (greeter->priv->use_secure_memory)
59
 
+        return gcry_realloc (ptr, n);
60
 
+    else
61
 
+        return g_realloc (ptr, n);
62
 
+}
63
 
+
64
 
+static void
65
 
+secure_free (Greeter *greeter, void *ptr)
66
 
+{
67
 
+    if (greeter->priv->use_secure_memory)
68
 
+        return gcry_free (ptr);
69
 
+    else
70
 
+        return g_free (ptr);
71
 
+}
72
 
+
73
 
 static guint32
74
 
 int_length ()
75
 
 {
76
 
@@ -259,6 +289,7 @@
77
 
         struct pam_response *response;
78
 
         response = calloc (messages_length, sizeof (struct pam_response));
79
 
         session_respond (greeter->priv->authentication_session, response);
80
 
+        free (response);
81
 
     }
82
 
 }
83
 
 
84
 
@@ -490,12 +521,18 @@
85
 
         int msg_style = messages[i].msg_style;
86
 
         if (msg_style == PAM_PROMPT_ECHO_OFF || msg_style == PAM_PROMPT_ECHO_ON)
87
 
         {
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
92
 
             j++;
93
 
         }
94
 
     }
95
 
 
96
 
     session_respond (greeter->priv->authentication_session, response);
97
 
+
98
 
+    for (i = 0; i < messages_length; i++)
99
 
+        secure_free (greeter, response[i].resp);
100
 
+    free (response);
101
 
 }
102
 
 
103
 
 static void
104
 
@@ -587,7 +624,7 @@
105
 
 }
106
 
 
107
 
 static gchar *
108
 
-read_string (Greeter *greeter, gsize *offset)
109
 
+read_string_full (Greeter *greeter, gsize *offset, void* (*alloc_fn)(size_t n))
110
 
 {
111
 
     guint32 length;
112
 
     gchar *value;
113
 
@@ -599,7 +636,7 @@
114
 
         return g_strdup ("");
115
 
     }
116
 
 
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';
121
 
     *offset += length;
122
 
@@ -607,6 +644,21 @@
123
 
     return value;
124
 
 }
125
 
 
126
 
+static gchar *
127
 
+read_string (Greeter *greeter, gsize *offset)
128
 
+{
129
 
+    return read_string_full (greeter, offset, g_malloc);
130
 
+}
131
 
+
132
 
+static gchar *
133
 
+read_secret (Greeter *greeter, gsize *offset)
134
 
+{
135
 
+    if (greeter->priv->use_secure_memory)
136
 
+        return read_string_full (greeter, offset, gcry_malloc_secure);
137
 
+    else
138
 
+        return read_string_full (greeter, offset, g_malloc);
139
 
+}
140
 
+
141
 
 static gboolean
142
 
 read_cb (GIOChannel *source, GIOCondition condition, gpointer data)
143
 
 {
144
 
@@ -654,7 +706,7 @@
145
 
         n_to_read = read_int (greeter, &offset);
146
 
         if (n_to_read > 0)
147
 
         {
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);
151
 
             return TRUE;
152
 
         }
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);
159
 
         secrets[i] = NULL;
160
 
         handle_continue_authentication (greeter, secrets);
161
 
-        g_strfreev (secrets);
162
 
+        for (i = 0; i < n_secrets; i++)
163
 
+            secure_free (greeter, secrets[i]);
164
 
+        g_free (secrets);
165
 
         break;
166
 
     case GREETER_MESSAGE_CANCEL_AUTHENTICATION:
167
 
         handle_cancel_authentication (greeter);
168
 
@@ -796,7 +850,7 @@
169
 
 greeter_init (Greeter *greeter)
170
 
 {
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);
175
 
 }
176
 
 
177
 
@@ -811,7 +865,7 @@
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
190
 
@@ -19,7 +19,6 @@
191
 
 #include <unistd.h>
192
 
 #include <fcntl.h>
193
 
 #include <sys/stat.h>
194
 
-#include <sys/mman.h>
195
 
 
196
 
 #include "configuration.h"
197
 
 #include "display-manager.h"
198
 
@@ -1079,12 +1078,6 @@
199
 
                              NULL,
200
 
                              NULL);
201
 
 
202
 
-    if (config_get_boolean (config_get_instance (), "LightDM", "lock-memory"))
203
 
-    {
204
 
-        /* Protect memory from being paged to disk, as we deal with passwords */
205
 
-        mlockall (MCL_CURRENT | MCL_FUTURE);
206
 
-    }
207
 
-
208
 
     if (getuid () != 0)
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
215
 
@@ -12,6 +12,7 @@
216
 
 #include <glib.h>
217
 
 #include <security/pam_appl.h>
218
 
 #include <utmpx.h>
219
 
+#include <sys/mman.h>
220
 
 
221
 
 #include "session-child.h"
222
 
 #include "session.h"
223
 
@@ -65,7 +66,7 @@
224
 
 }
225
 
 
226
 
 static gchar *
227
 
-read_string ()
228
 
+read_string_full (void* (*alloc_fn)(size_t n))
229
 
 {
230
 
     int length;
231
 
     char *value;
232
 
@@ -80,13 +81,19 @@
233
 
         return NULL;
234
 
     }
235
 
   
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';      
240
 
 
241
 
     return value;
242
 
 }
243
 
 
244
 
+static gchar *
245
 
+read_string ()
246
 
+{
247
 
+    return read_string_full (g_malloc);
248
 
+}
249
 
+
250
 
 static int
251
 
 pam_conv_cb (int msg_length, const struct pam_message **msg, struct pam_response **resp, void *app_data)
252
 
 {
253
 
@@ -137,7 +144,9 @@
254
 
     for (i = 0; i < msg_length; i++)
255
 
     {
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));
262
 
     }
263
 
 
264
 
@@ -186,6 +195,12 @@
265
 
 
266
 
     g_type_init ();
267
 
 
268
 
+    if (config_get_boolean (config_get_instance (), "LightDM", "lock-memory"))
269
 
+    {
270
 
+        /* Protect memory from being paged to disk, as we deal with passwords */
271
 
+        mlockall (MCL_CURRENT | MCL_FUTURE);
272
 
+    }
273
 
+
274
 
     /* Make input non-blocking */
275
 
     fd = open ("/dev/null", O_RDONLY);
276
 
     dup2 (fd, STDIN_FILENO);