Skip to content
This repository was archived by the owner on Nov 9, 2017. It is now read-only.

Commit 52ab6cb

Browse files
jberezanskikblees
authored andcommitted
wincred: handle empty username/password correctly
Empty (length 0) usernames and/or passwords, when saved in the Windows Credential Manager, come back as null when reading the credential. One use case for such empty credentials is with NTLM authentication, where empty username and password instruct libcurl to authenticate using the credentials of the currently logged-on user (single sign-on). When locating the relevant credentials, make empty username match null. When outputting the credentials, handle nulls correctly. Signed-off-by: Jakub Bereżański <kuba@berezanscy.pl>
1 parent 0dd0cfb commit 52ab6cb

File tree

1 file changed

+8
-2
lines changed

1 file changed

+8
-2
lines changed

contrib/credential/wincred/git-credential-wincred.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,12 @@ static WCHAR *wusername, *password, *protocol, *host, *path, target[1024];
9494
static void write_item(const char *what, LPCWSTR wbuf, int wlen)
9595
{
9696
char *buf;
97+
98+
if (!wbuf || !wlen) {
99+
printf("%s=\n", what);
100+
return;
101+
}
102+
97103
int len = WideCharToMultiByte(CP_UTF8, 0, wbuf, wlen, NULL, 0, NULL,
98104
FALSE);
99105
buf = xmalloc(len);
@@ -141,7 +147,7 @@ static int match_part(LPCWSTR *ptarget, LPCWSTR want, LPCWSTR delim)
141147
static int match_cred(const CREDENTIALW *cred)
142148
{
143149
LPCWSTR target = cred->TargetName;
144-
if (wusername && wcscmp(wusername, cred->UserName))
150+
if (wusername && wcscmp(wusername, cred->UserName ? cred->UserName : L""))
145151
return 0;
146152

147153
return match_part(&target, L"git", L":") &&
@@ -164,7 +170,7 @@ static void get_credential(void)
164170
for (i = 0; i < num_creds; ++i)
165171
if (match_cred(creds[i])) {
166172
write_item("username", creds[i]->UserName,
167-
wcslen(creds[i]->UserName));
173+
creds[i]->UserName ? wcslen(creds[i]->UserName) : 0);
168174
write_item("password",
169175
(LPCWSTR)creds[i]->CredentialBlob,
170176
creds[i]->CredentialBlobSize / sizeof(WCHAR));

0 commit comments

Comments
 (0)