diff options
author | Tim Kientzle <kientzle@gmail.com> | 2014-09-26 01:51:57 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2015-04-09 18:08:43 (GMT) |
commit | 1f33b45d5daca380e0be0ecfc595eac881328f29 (patch) | |
tree | 8e525f8ddc59afac475b78a8839710b9783bf0f4 /Utilities | |
parent | 732d8a467ab8a295b1bbf580f865980f8a1a9b29 (diff) | |
download | CMake-1f33b45d5daca380e0be0ecfc595eac881328f29.zip CMake-1f33b45d5daca380e0be0ecfc595eac881328f29.tar.gz CMake-1f33b45d5daca380e0be0ecfc595eac881328f29.tar.bz2 |
libarchive: Fix string concatentation in Windows mktemp implementation
Port upstream LibArchive commit "compute string pointers after
concatenation" (2014-09-25) and commit "Move variables to top of
function for non-C99 compilers" (2014-11-15) to our CMake copy.
Otherwise we may compute a pointer to memory that is about to be freed
and then compute a bad size to give to CryptGenRandom.
Inspired-by: Tim Kientzle <kientzle@gmail.com>
Diffstat (limited to 'Utilities')
-rw-r--r-- | Utilities/cmlibarchive/libarchive/archive_util.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/Utilities/cmlibarchive/libarchive/archive_util.c b/Utilities/cmlibarchive/libarchive/archive_util.c index 96b88d8..d136498 100644 --- a/Utilities/cmlibarchive/libarchive/archive_util.c +++ b/Utilities/cmlibarchive/libarchive/archive_util.c @@ -249,6 +249,8 @@ __archive_errx(int retvalue, const char *msg) int __archive_mktemp(const char *tmpdir) { + static const wchar_t *prefix = L"libarchive_"; + static const wchar_t *suffix = L"XXXXXXXXXX"; static const wchar_t num[] = { L'0', L'1', L'2', L'3', L'4', L'5', L'6', L'7', L'8', L'9', L'A', L'B', L'C', L'D', L'E', L'F', @@ -323,10 +325,10 @@ __archive_mktemp(const char *tmpdir) /* * Create a temporary file. */ - archive_wstrcat(&temp_name, L"libarchive_"); - xp = temp_name.s + archive_strlen(&temp_name); - archive_wstrcat(&temp_name, L"XXXXXXXXXX"); + archive_wstrcat(&temp_name, prefix); + archive_wstrcat(&temp_name, suffix); ep = temp_name.s + archive_strlen(&temp_name); + xp = ep - wcslen(suffix); if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) { |