diff options
author | Steve Dower <steve.dower@microsoft.com> | 2016-09-17 17:25:42 -0700 |
---|---|---|
committer | Steve Dower <steve.dower@microsoft.com> | 2016-09-17 17:25:42 -0700 |
commit | 1ec262be80f9439296918c20b55a5a6686af5347 (patch) | |
tree | 42f5b521ed55c302a02bfbabb6d52282b280eba5 /Lib/platform.py | |
parent | 1c75c18ed2242a9e274eea11815c67fe8a67df40 (diff) | |
download | cpython-git-1ec262be80f9439296918c20b55a5a6686af5347.tar.gz |
Issue #27932: Prevent memory leak in win32_ver().
Diffstat (limited to 'Lib/platform.py')
-rwxr-xr-x | Lib/platform.py | 61 |
1 files changed, 1 insertions, 60 deletions
diff --git a/Lib/platform.py b/Lib/platform.py index e7eaa32f9a..3e726a7856 100755 --- a/Lib/platform.py +++ b/Lib/platform.py @@ -498,65 +498,6 @@ _WIN32_SERVER_RELEASES = { (6, None): "post2012ServerR2", } -def _get_real_winver(maj, min, build): - if maj < 6 or (maj == 6 and min < 2): - return maj, min, build - - from ctypes import (c_buffer, POINTER, byref, create_unicode_buffer, - Structure, WinDLL) - from ctypes.wintypes import DWORD, HANDLE - - class VS_FIXEDFILEINFO(Structure): - _fields_ = [ - ("dwSignature", DWORD), - ("dwStrucVersion", DWORD), - ("dwFileVersionMS", DWORD), - ("dwFileVersionLS", DWORD), - ("dwProductVersionMS", DWORD), - ("dwProductVersionLS", DWORD), - ("dwFileFlagsMask", DWORD), - ("dwFileFlags", DWORD), - ("dwFileOS", DWORD), - ("dwFileType", DWORD), - ("dwFileSubtype", DWORD), - ("dwFileDateMS", DWORD), - ("dwFileDateLS", DWORD), - ] - - kernel32 = WinDLL('kernel32') - version = WinDLL('version') - - # We will immediately double the length up to MAX_PATH, but the - # path may be longer, so we retry until the returned string is - # shorter than our buffer. - name_len = actual_len = 130 - while actual_len == name_len: - name_len *= 2 - name = create_unicode_buffer(name_len) - actual_len = kernel32.GetModuleFileNameW(HANDLE(kernel32._handle), - name, len(name)) - if not actual_len: - return maj, min, build - - size = version.GetFileVersionInfoSizeW(name, None) - if not size: - return maj, min, build - - ver_block = c_buffer(size) - if (not version.GetFileVersionInfoW(name, None, size, ver_block) or - not ver_block): - return maj, min, build - - pvi = POINTER(VS_FIXEDFILEINFO)() - if not version.VerQueryValueW(ver_block, "", byref(pvi), byref(DWORD())): - return maj, min, build - - maj = pvi.contents.dwProductVersionMS >> 16 - min = pvi.contents.dwProductVersionMS & 0xFFFF - build = pvi.contents.dwProductVersionLS >> 16 - - return maj, min, build - def win32_ver(release='', version='', csd='', ptype=''): try: from sys import getwindowsversion @@ -568,7 +509,7 @@ def win32_ver(release='', version='', csd='', ptype=''): from _winreg import OpenKeyEx, QueryValueEx, CloseKey, HKEY_LOCAL_MACHINE winver = getwindowsversion() - maj, min, build = _get_real_winver(*winver[:3]) + maj, min, build = winver._platform_version or winver[:3] version = '{0}.{1}.{2}'.format(maj, min, build) release = (_WIN32_CLIENT_RELEASES.get((maj, min)) or |