File gnome-keyring-fixes-from-git.patch of Package gnome-keyring
diff --git a/daemon/Makefile.am b/daemon/Makefile.am
index be96523..9edb13f 100644
--- a/daemon/Makefile.am
+++ b/daemon/Makefile.am
@@ -54,19 +54,21 @@ gnome_keyring_daemon_LDADD = \
EXTRA_DIST = \
org.gnome.keyring.service.in \
+ org.freedesktop.secrets.service.in \
$(desktop_in_files)
CLEANFILES = \
org.gnome.keyring.service \
+ org.freedesktop.secrets.service \
$(desktop_DATA)
servicedir = $(DBUS_SERVICES_DIR)
-service_in_files = org.gnome.keyring.service.in
+service_in_files = org.gnome.keyring.service.in org.freedesktop.secrets.service.in
service_DATA = $(service_in_files:.service.in=.service)
service_PATH = $(VALGRIND_RUN)$(bindir)
# Rule to make the service file with bindir expanded
-$(service_DATA): $(service_in_files) Makefile
+%.service: %.service.in Makefile
@sed -e "s|\@PATH\@|$(service_PATH)|" $< > $@
desktop_in_files = \
diff --git a/daemon/gkd-main.c b/daemon/gkd-main.c
index 6ac0b65..55790eb 100644
--- a/daemon/gkd-main.c
+++ b/daemon/gkd-main.c
@@ -396,7 +396,7 @@ read_login_password (int fd)
/*
* When --login is specified then the login password is passed
* in on stdin. All data (including newlines) are part of the
- * password.
+ * password. A zero length password is no password.
*/
gchar *buf = egg_secure_alloc (MAX_BLOCK);
@@ -412,17 +412,15 @@ read_login_password (int fd)
egg_secure_free (buf);
return NULL;
- } else {
- char *n = egg_secure_realloc (ret, len + r + 1);
- memset(n + len, 0, r + 1);
- ret = n;
- len = len + r;
+ } else if (r == 0 || len > MAX_LENGTH) {
+ break;
+ } else {
+ ret = egg_secure_realloc (ret, len + r + 1);
+ memset (ret + len, 0, r + 1);
+ len = len + r;
strncat (ret, buf, r);
}
-
- if (r == 0 || len > MAX_LENGTH)
- break;
}
egg_secure_free (buf);
diff --git a/daemon/org.freedesktop.secrets.service.in b/daemon/org.freedesktop.secrets.service.in
new file mode 100644
index 0000000..d4db713
--- /dev/null
+++ b/daemon/org.freedesktop.secrets.service.in
@@ -0,0 +1,3 @@
+[D-BUS Service]
+Name=org.freedesktop.secrets
+Exec=@PATH@/gnome-keyring-daemon --start --foreground --components=secrets
diff --git a/daemon/prompt/gkd-prompt.c b/daemon/prompt/gkd-prompt.c
index a4ea7fc..645255a 100644
--- a/daemon/prompt/gkd-prompt.c
+++ b/daemon/prompt/gkd-prompt.c
@@ -796,7 +796,7 @@ gkd_prompt_get_transport_param (GkdPrompt *self, const gchar *name, gsize *n_val
{
g_return_val_if_fail (GKD_IS_PROMPT (self), NULL);
g_return_val_if_fail (name, NULL);
- g_return_val_if_fail (*n_value, NULL);
+ g_return_val_if_fail (n_value, NULL);
if (self->pv->failure)
return NULL;
diff --git a/pam/gkr-pam-module.c b/pam/gkr-pam-module.c
index bf3c844..d6fc17d 100644
--- a/pam/gkr-pam-module.c
+++ b/pam/gkr-pam-module.c
@@ -318,14 +318,11 @@ cleanup_free_password (pam_handle_t *ph, void *data, int pam_end_status)
}
static void
-setup_child (int inp[2], int outp[2], int errp[2],
- pam_handle_t *ph, struct passwd *pwd, const char *password)
+setup_child (int inp[2], int outp[2], int errp[2], pam_handle_t *ph, struct passwd *pwd)
{
const char* display;
int i, ret;
- /* The --login argument comes last, because of code below */
-
#ifdef VALGRIND
char *args[] = { VALGRIND, VALGRIND_ARG, GNOME_KEYRING_DAEMON, "--daemonize", "--login", NULL};
#else
@@ -335,14 +332,6 @@ setup_child (int inp[2], int outp[2], int errp[2],
assert (pwd);
assert (pwd->pw_dir);
- /* If no password, don't pass in --login */
- if (password == NULL) {
- for (i = 0; args[i]; ++i) {
- if (strcmp ("--login", args[i]) == 0)
- args[i] = NULL;
- }
- }
-
/* Fix up our end of the pipes */
if (dup2 (inp[READ_END], STDIN) < 0 ||
dup2 (outp[WRITE_END], STDOUT) < 0 ||
@@ -499,7 +488,7 @@ start_daemon (pam_handle_t *ph, struct passwd *pwd, const char *password)
/* This is the child */
case 0:
- setup_child (inp, outp, errp, ph, pwd, password);
+ setup_child (inp, outp, errp, ph, pwd);
/* Should never be reached */
break;
@@ -507,19 +496,23 @@ start_daemon (pam_handle_t *ph, struct passwd *pwd, const char *password)
default:
break;
};
-
+
/* Close our unneeded ends of the pipes */
close (inp[READ_END]);
close (outp[WRITE_END]);
close (errp[WRITE_END]);
inp[READ_END] = outp[WRITE_END] = errp[WRITE_END] = -1;
- if (password) {
- /* Write the login keyring password */
+ /*
+ * We always pass in a --login argument, even when we have a NULL password
+ * since this controls the startup behavior. When using --login daemon waits
+ * for a password. Closing input signifies password is done.
+ */
+
+ if (password)
write_string (inp[WRITE_END], password);
- close (inp[WRITE_END]);
- }
-
+ close (inp[WRITE_END]);
+
/*
* Note that we're not using select() or any such. We know how the
* daemon sends its data.