]> git.99rst.org Git - git.git/commit
wincred: prevent silent credential loss when storing OAuth tokens
authorJohannes Schindelin <redacted>
Thu, 16 Jul 2026 14:27:51 +0000 (14:27 +0000)
committerJunio C Hamano <redacted>
Thu, 16 Jul 2026 18:31:32 +0000 (11:31 -0700)
commitf635ab9ab496ad710fec16f3d854e064110d158f
tree632a19e34df9344d4015a6adac6555a49c9ffc90
parent936eb75730b6e25248fcf0537811f867311d1341
wincred: prevent silent credential loss when storing OAuth tokens

When `git credential approve` hands the wincred helper a password
together with an `oauth_refresh_token`, the OAuth branch of
`store_credential()` writes one WCHAR past the allocation while
formatting both fields into a single `CredentialBlob`. On Windows
this trips heap verification and tears the helper down with status
`0xC0000374`; `approve` masks the failure, so the credential the
user meant to save never reaches `CredWriteW()` and the next
session prompts for it again.

The bug has the same shape as the one fixed in the previous commit:
the allocation leaves no room for the terminating NUL, and the
`sizeOfBuffer` argument to `_snwprintf_s()` is a byte count where
the API expects a WCHAR count, which lets the safe-CRT runtime
write the terminator out of bounds.

Apply the same remedy d22a488482 (wincred: avoid memory corruption,
2025-11-17) applied in `get_credential()`: allocate `(wlen + 1) *
sizeof(WCHAR)` bytes and pass `wlen + 1` as the destination
capacity in WCHARs.

This closes the second of the two heap writes tracked under
GHSA-rxqw-wxqg-g7hw.

Assisted-by: Opus 4.7
Signed-off-by: Johannes Schindelin <redacted>
Signed-off-by: Junio C Hamano <redacted>
contrib/credential/wincred/git-credential-wincred.c
git clone https://git.99rst.org/PROJECT