Skip to content

Commit fcf5b74

Browse files
KojiNakamarugitster
authored andcommitted
osxkeychain: exclusive lock to serialize execution of operations
git passes a credential that has been used successfully to the helpers to record. If "git-credential-osxkeychain store" commands run in parallel (with fetch.parallel configuration and/or by running multiple git commands simultaneously), some of them may exit with the error "failed to store: -25299". This is because SecItemUpdate() in add_internet_password() may return errSecDuplicateItem (-25299) in this situation. Apple's documentation [1] also states as below: In macOS, some of the functions of this API block while waiting for input from the user (for example, when the user is asked to unlock a keychain or give permission to change trust settings). In general, it is safe to use this API in threads other than your main thread, but avoid calling the functions from multiple operations, work queues, or threads concurrently. Instead, serialize function calls or confine them to a single thread. The error has not been noticed before, because the former implementation ignored the error. Introduce an exclusive lock to serialize execution of operations. [1] https://developer.apple.com/documentation/security/certificate_key_and_trust_services/working_with_concurrency Signed-off-by: Koji Nakamaru <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 786a3e4 commit fcf5b74

File tree

1 file changed

+3
-0
lines changed

1 file changed

+3
-0
lines changed

contrib/credential/osxkeychain/git-credential-osxkeychain.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -414,6 +414,9 @@ int main(int argc, const char **argv)
414414
if (!argv[1])
415415
die("%s", usage);
416416

417+
if (open(argv[0], O_RDONLY | O_EXLOCK) == -1)
418+
die("failed to lock %s", argv[0]);
419+
417420
read_credential();
418421

419422
if (!strcmp(argv[1], "get"))

0 commit comments

Comments
 (0)