void egg_secure_strfree (char *str) { /* * 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. */ egg_secure_strclear (str); egg_secure_free_full (str, GKR_SECURE_USE_FALLBACK); }
static gboolean gkr_daemon_initialize_steps (const gchar *components) { g_assert (components); /* * Startup that can run after forking. * Note that we set initialized flags early so that two * initializations don't overlap */ if (!initialization_completed) { /* The LANG environment variable may have changed */ setlocale (LC_ALL, ""); initialization_completed = TRUE; if (timeout_id) g_source_remove (timeout_id); /* Initialize new style PKCS#11 components */ if (!gkd_pkcs11_initialize ()) return FALSE; /* * Unlock the login keyring if we were given a password on STDIN. * If it does not exist. We create it. */ if (login_password) { if (!gkd_login_unlock (login_password)) g_message ("failed to unlock login keyring on startup"); egg_secure_strclear (login_password); } dbus_started = TRUE; if (!gkd_dbus_setup ()) dbus_started = FALSE; } /* The Secret Service API */ if (strstr (components, GKD_COMP_SECRETS) || strstr (components, GKD_COMP_KEYRING)) { if (secrets_started) { g_message ("The Secret Service was already initialized"); } else { if (!dbus_started) { dbus_started = TRUE; if (!gkd_dbus_setup ()) dbus_started = FALSE; } if (dbus_started) { secrets_started = TRUE; if (!gkd_dbus_secrets_startup ()) { secrets_started = FALSE; return FALSE; } } } } /* The PKCS#11 remoting */ if (strstr (components, GKD_COMP_PKCS11)) { if (pkcs11_started) { g_message ("The PKCS#11 component was already initialized"); } else { pkcs11_started = TRUE; if (!gkd_pkcs11_startup_pkcs11 ()) { pkcs11_started = FALSE; return FALSE; } } } return TRUE; }