diff --git a/src/transports/cred.c b/src/transports/cred.c index 4916c6e18..ba5de6e93 100644 --- a/src/transports/cred.c +++ b/src/transports/cred.c @@ -17,7 +17,7 @@ static void plaintext_free(struct git_cred *cred) git__free(c->username); /* Zero the memory which previously held the password */ - memset(c->password, 0x0, pass_len); + git__memzero(c->password, pass_len); git__free(c->password); memset(c, 0, sizeof(*c)); @@ -73,7 +73,7 @@ static void ssh_keyfile_passphrase_free(struct git_cred *cred) if (c->passphrase) { /* Zero the memory which previously held the passphrase */ - memset(c->passphrase, 0x0, pass_len); + git__memzero(c->passphrase, pass_len); git__free(c->passphrase); } diff --git a/src/util.c b/src/util.c index 1d084daa8..da15a039d 100644 --- a/src/util.c +++ b/src/util.c @@ -722,12 +722,3 @@ void git__insertsort_r( if (freeswap) git__free(swapel); } - -void git__memzero(volatile void *data, size_t size) -{ - volatile uint8_t *scan = data; - uint8_t *end = scan + size; - - while (scan < end) - *scan++ = 0x0; -} diff --git a/src/util.h b/src/util.h index 0de466677..1ef9e65b5 100644 --- a/src/util.h +++ b/src/util.h @@ -325,6 +325,16 @@ extern size_t git__unescape(char *str); * Safely zero-out memory, making sure that the compiler * doesn't optimize away the operation. */ -extern void git__memzero(volatile void *data, size_t size); +GIT_INLINE(void) git__memzero(void *data, size_t size) +{ +#ifdef _MSC_VER + SecureZeroMemory((PVOID)data, size); +#else + volatile uint8_t *scan = (volatile uint8_t *)data; + + while (size--) + *scan++ = 0x0; +#endif +} #endif /* INCLUDE_util_h__ */