summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Walter <stefw@src.gnome.org>2007-06-25 17:07:41 +0000
committerStefan Walter <stefw@src.gnome.org>2007-06-25 17:07:41 +0000
commit920d3e8a4081b9717864916448551075f09a1d68 (patch)
tree04f50d0585dccebee0766dc10f308aa33d40567f
parentf820acea09de70110d27fdbdbf2d69b3834f3877 (diff)
Use gnome_keyring_free_password() to zero out passwords even when not
* daemon/gnome-keyring-daemon-ops.c: * keyrings/gkr-keyring-item.c: * keyrings/gkr-keyring.c: * library/gnome-keyring-proto.c: * library/gnome-keyring-utils.c: * library/gnome-keyring.c: * library/gnome-keyring.h: * ui/gkr-ask-request.c: Use gnome_keyring_free_password() to zero out passwords even when not using nonpageable memory. svn path=/trunk/; revision=655
-rw-r--r--ChangeLog15
-rw-r--r--daemon/gnome-keyring-daemon-ops.c26
-rw-r--r--keyrings/gkr-keyring-item.c2
-rw-r--r--keyrings/gkr-keyring.c8
-rw-r--r--library/gnome-keyring-memory.c6
-rw-r--r--library/gnome-keyring-proto.c8
-rw-r--r--library/gnome-keyring-utils.c28
-rw-r--r--library/gnome-keyring.c4
-rw-r--r--library/gnome-keyring.h2
-rw-r--r--ui/gkr-ask-request.c8
10 files changed, 69 insertions, 38 deletions
diff --git a/ChangeLog b/ChangeLog
index 2e1b8518..1cbad3f3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,20 @@
2007-06-25 Stef Walter <stef@memberwebs.com>
+ * daemon/gnome-keyring-daemon-ops.c:
+ * keyrings/gkr-keyring-item.c:
+ * keyrings/gkr-keyring.c:
+ * library/gnome-keyring-proto.c:
+ * library/gnome-keyring-utils.c:
+ * library/gnome-keyring.c:
+ * library/gnome-keyring.h:
+ * ui/gkr-ask-request.c: Use gnome_keyring_free_password() to zero out
+ passwords even when not using nonpageable memory.
+ * library/gnome-keyring-memory.c: Make warnings about memory be simple
+ messages, so that they don't abort the program even when running a
+ beta version of GNOME. Fixes bug #450953
+
+2007-06-25 Stef Walter <stef@memberwebs.com>
+
* configure.in:
* common/Makefile.am:
* common/gkr-async.c: (from cryptoki branch)
diff --git a/daemon/gnome-keyring-daemon-ops.c b/daemon/gnome-keyring-daemon-ops.c
index d6f4c177..0bb1c45d 100644
--- a/daemon/gnome-keyring-daemon-ops.c
+++ b/daemon/gnome-keyring-daemon-ops.c
@@ -772,7 +772,7 @@ unlock_keyring (GkrKeyring *keyring, const char *password)
keyring->password = gnome_keyring_memory_strdup (password);
if (!gkr_keyring_update_from_disk (keyring, TRUE)) {
- gnome_keyring_memory_free (keyring->password);
+ gnome_keyring_free_password (keyring->password);
keyring->password = NULL;
}
if (keyring->locked) {
@@ -797,7 +797,7 @@ lock_keyring (GkrKeyring *keyring)
}
g_assert (keyring->password != NULL);
- gnome_keyring_memory_free (keyring->password);
+ gnome_keyring_free_password (keyring->password);
keyring->password = NULL;
if (!gkr_keyring_update_from_disk (keyring, TRUE)) {
/* Failed to re-read, remove the keyring */
@@ -1025,7 +1025,7 @@ op_create_keyring_collect (GkrBuffer *packet, GkrKeyringRequest *req)
out:
g_free (keyring_name);
- gnome_keyring_memory_free (password);
+ gnome_keyring_free_password (password);
return TRUE;
}
@@ -1087,7 +1087,7 @@ op_create_keyring_execute (GkrBuffer *packet,
out:
g_free (keyring_name);
- gnome_keyring_memory_free (password);
+ gnome_keyring_free_password (password);
return TRUE;
}
@@ -1123,7 +1123,7 @@ op_unlock_keyring_execute (GkrBuffer *packet,
}
g_free (keyring_name);
- gnome_keyring_memory_free (password);
+ gnome_keyring_free_password (password);
return TRUE;
}
@@ -1199,8 +1199,8 @@ op_change_keyring_password_collect (GkrBuffer *packet, GkrKeyringRequest *req)
}
g_free (keyring_name);
- gnome_keyring_memory_free (original);
- gnome_keyring_memory_free (password);
+ gnome_keyring_free_password (original);
+ gnome_keyring_free_password (password);
return TRUE;
}
@@ -1271,8 +1271,8 @@ op_change_keyring_password_execute (GkrBuffer *packet,
out:
g_free (keyring_name);
- gnome_keyring_memory_free (original);
- gnome_keyring_memory_free (password);
+ gnome_keyring_free_password (original);
+ gnome_keyring_free_password (password);
return TRUE;
}
@@ -1505,7 +1505,7 @@ op_create_item_execute (GkrBuffer *packet,
g_free (item->display_name);
item->display_name = g_strdup (display_name);
- gnome_keyring_memory_free (item->secret);
+ gnome_keyring_free_password (item->secret);
item->secret = gnome_keyring_memory_strdup (secret);
if (item->attributes != NULL) {
gnome_keyring_attribute_list_free (item->attributes);
@@ -1523,7 +1523,7 @@ op_create_item_execute (GkrBuffer *packet,
bail:
g_free (keyring_name);
g_free (display_name);
- gnome_keyring_memory_free (secret);
+ gnome_keyring_free_password (secret);
gnome_keyring_attribute_list_free (attributes);
gnome_keyring_proto_add_uint32 (result, res);
@@ -1984,7 +1984,7 @@ op_set_item_info_execute (GkrBuffer *packet,
item->display_name = g_strdup (item_name);
}
if (secret != NULL) {
- gnome_keyring_memory_free (item->secret);
+ gnome_keyring_free_password (item->secret);
item->secret = gnome_keyring_memory_strdup (secret);
}
@@ -1992,7 +1992,7 @@ out:
g_free (keyring_name);
g_free (item_name);
- gnome_keyring_memory_free (secret);
+ gnome_keyring_free_password (secret);
return TRUE;
}
diff --git a/keyrings/gkr-keyring-item.c b/keyrings/gkr-keyring-item.c
index 9b9d7867..40637970 100644
--- a/keyrings/gkr-keyring-item.c
+++ b/keyrings/gkr-keyring-item.c
@@ -66,7 +66,7 @@ gkr_keyring_item_finalize (GObject *obj)
if (item->acl != NULL)
gnome_keyring_acl_free (item->acl);
g_free (item->display_name);
- gnome_keyring_memory_free (item->secret);
+ gnome_keyring_free_password (item->secret);
G_OBJECT_CLASS (gkr_keyring_item_parent_class)->finalize (obj);
}
diff --git a/keyrings/gkr-keyring.c b/keyrings/gkr-keyring.c
index ca91d8f9..357dcef2 100644
--- a/keyrings/gkr-keyring.c
+++ b/keyrings/gkr-keyring.c
@@ -635,7 +635,7 @@ update_keyring_from_data (GkrKeyring *keyring, GkrBuffer *buffer)
goto bail;
}
if (!verify_decrypted_buffer (&to_decrypt)) {
- gnome_keyring_memory_free (keyring->password);
+ gnome_keyring_free_password (keyring->password);
keyring->password = NULL;
} else {
locked = FALSE;
@@ -723,7 +723,7 @@ update_keyring_from_data (GkrKeyring *keyring, GkrBuffer *buffer)
g_free (item->display_name);
item->display_name = NULL;
- gnome_keyring_memory_free (item->secret);
+ gnome_keyring_free_password (item->secret);
item->secret = NULL;
if (item->acl) {
gnome_keyring_acl_free (item->acl);
@@ -760,7 +760,7 @@ update_keyring_from_data (GkrKeyring *keyring, GkrBuffer *buffer)
if (items != NULL) {
for (i = 0; i < num_items; i++) {
g_free (items[i].display_name);
- gnome_keyring_memory_free (items[i].secret);
+ gnome_keyring_free_password (items[i].secret);
gnome_keyring_attribute_list_free (items[i].hashed_attributes);
gnome_keyring_attribute_list_free (items[i].attributes);
gnome_keyring_acl_free (items[i].acl);
@@ -862,7 +862,7 @@ gkr_keyring_dispose (GObject *obj)
g_list_free (keyring->items);
keyring->items = NULL;
- gnome_keyring_memory_free (keyring->password);
+ gnome_keyring_free_password (keyring->password);
keyring->password = NULL;
G_OBJECT_CLASS (gkr_keyring_parent_class)->dispose (obj);
diff --git a/library/gnome-keyring-memory.c b/library/gnome-keyring-memory.c
index 036cf758..9f4c5b48 100644
--- a/library/gnome-keyring-memory.c
+++ b/library/gnome-keyring-memory.c
@@ -88,7 +88,7 @@ gnome_keyring_memory_alloc (gulong sz)
}
if (do_warning) {
- g_warning (WARNING);
+ g_message (WARNING);
do_warning = FALSE;
}
@@ -157,7 +157,7 @@ gnome_keyring_memory_realloc (gpointer p, gulong sz)
}
if (do_warning) {
- g_warning (WARNING);
+ g_message (WARNING);
do_warning = FALSE;
}
@@ -201,8 +201,6 @@ gnome_keyring_memory_try_realloc (gpointer p, gulong sz)
return g_try_realloc (p, sz);
}
-gpointer gnome_keyring_memory_try_realloc (gpointer p, gulong sz);
-
/**
* gnome_keyring_memory_free:
* @p: The pointer to the beginning of the block of memory to free.
diff --git a/library/gnome-keyring-proto.c b/library/gnome-keyring-proto.c
index 0854de09..65d48187 100644
--- a/library/gnome-keyring-proto.c
+++ b/library/gnome-keyring-proto.c
@@ -662,7 +662,7 @@ gnome_keyring_proto_decode_create_item (GkrBuffer *buffer,
g_free (*display_name);
}
if (secret != NULL) {
- gnome_keyring_memory_free (*secret);
+ gnome_keyring_free_password (*secret);
}
return FALSE;
@@ -1449,13 +1449,13 @@ gnome_keyring_proto_decode_get_item_info_reply (GkrBuffer *buff
if (!gnome_keyring_proto_get_time (buffer, offset, &offset,
&mtime)) {
g_free (name);
- gnome_keyring_memory_free (secret);
+ gnome_keyring_free_password (secret);
return FALSE;
}
if (!gnome_keyring_proto_get_time (buffer, offset, &offset,
&ctime)) {
g_free (name);
- gnome_keyring_memory_free (secret);
+ gnome_keyring_free_password (secret);
return FALSE;
}
@@ -1577,7 +1577,7 @@ gnome_keyring_proto_decode_set_item_info (GkrBuffer *buffer,
bail:
g_free (*keyring);
g_free (*display_name);
- gnome_keyring_memory_free (*secret);
+ gnome_keyring_free_password (*secret);
return FALSE;
}
diff --git a/library/gnome-keyring-utils.c b/library/gnome-keyring-utils.c
index 3198273a..4c7a82dc 100644
--- a/library/gnome-keyring-utils.c
+++ b/library/gnome-keyring-utils.c
@@ -39,9 +39,28 @@
* secret information.
*/
void
-gnome_keyring_free_password (char *str)
+gnome_keyring_free_password (gchar *str)
{
- memset (str, 0, strlen (str));
+ volatile char *vp;
+ size_t len;
+
+ if (!str)
+ return;
+
+ /*
+ * If we're using unpageable 'secure' memory, then the free call
+ * should zero out the memory, but because on certain platforms
+ * we may be using normal memory, zero it out here just in case.
+ */
+
+ vp = (volatile char*)str;
+ len = strlen (str);
+ while (len) {
+ *vp = 0xAA;
+ vp++;
+ len--;
+ }
+
gnome_keyring_memory_free (str);
}
@@ -58,7 +77,7 @@ void
gnome_keyring_found_free (GnomeKeyringFound *found)
{
g_free (found->keyring);
- gnome_keyring_memory_free (found->secret);
+ gnome_keyring_free_password (found->secret);
gnome_keyring_attribute_list_free (found->attributes);
g_free (found);
}
@@ -152,8 +171,7 @@ gnome_keyring_item_info_free (GnomeKeyringItemInfo *item_info)
{
if (item_info != NULL) {
g_free (item_info->display_name);
- if (item_info->secret != NULL)
- gnome_keyring_memory_free (item_info->secret);
+ gnome_keyring_free_password (item_info->secret);
g_free (item_info);
}
}
diff --git a/library/gnome-keyring.c b/library/gnome-keyring.c
index 1f055f8a..13b56491 100644
--- a/library/gnome-keyring.c
+++ b/library/gnome-keyring.c
@@ -2388,7 +2388,7 @@ void
gnome_keyring_item_info_set_secret (GnomeKeyringItemInfo *item_info,
const char *value)
{
- gnome_keyring_memory_free (item_info->secret);
+ gnome_keyring_free_password (item_info->secret);
item_info->secret = gnome_keyring_memory_strdup (value);
}
@@ -2536,7 +2536,7 @@ gnome_keyring_network_password_free (GnomeKeyringNetworkPasswordData *data)
g_free (data->authtype);
g_free (data->user);
g_free (data->domain);
- gnome_keyring_memory_free (data->password);
+ gnome_keyring_free_password (data->password);
g_free (data);
}
diff --git a/library/gnome-keyring.h b/library/gnome-keyring.h
index e5d67dcb..299e09ed 100644
--- a/library/gnome-keyring.h
+++ b/library/gnome-keyring.h
@@ -138,7 +138,7 @@ GnomeKeyringAttributeList *gnome_keyring_attribute_list_copy (GnomeKeyr
gboolean gnome_keyring_is_available (void);
-void gnome_keyring_free_password (char *password);
+void gnome_keyring_free_password (gchar *password);
void gnome_keyring_found_free (GnomeKeyringFound *found);
void gnome_keyring_found_list_free (GList *found_list);
diff --git a/ui/gkr-ask-request.c b/ui/gkr-ask-request.c
index 977eca6a..a79bca37 100644
--- a/ui/gkr-ask-request.c
+++ b/ui/gkr-ask-request.c
@@ -144,9 +144,9 @@ finish_ask_io (GkrAskRequest *ask, gboolean failed)
pv->ask_pid = 0;
/* Cleanup for response processing */
- gnome_keyring_memory_free (ask->typed_password);
+ gnome_keyring_free_password (ask->typed_password);
ask->typed_password = NULL;
- gnome_keyring_memory_free (ask->original_password);
+ gnome_keyring_free_password (ask->original_password);
ask->original_password = NULL;
/* A failed request */
@@ -371,10 +371,10 @@ gkr_ask_request_dispose (GObject *obj)
cancel_ask_if_active (ask);
g_assert (pv->ask_pid == 0);
- gnome_keyring_memory_free (ask->original_password);
+ gnome_keyring_free_password (ask->original_password);
ask->original_password = NULL;
- gnome_keyring_memory_free (ask->typed_password);
+ gnome_keyring_free_password (ask->typed_password);
ask->typed_password = NULL;
G_OBJECT_CLASS(gkr_ask_request_parent_class)->dispose (obj);