Compare commits

...

1 Commits

Author SHA1 Message Date
Daira Hopwood 69a2979040 Further refine error handling in windows_getenv to avoid a Win32 API design flaw.
Signed-off-by: Daira Hopwood <daira@jacaranda.org>
2015-02-04 16:49:40 +00:00
1 changed files with 8 additions and 6 deletions

View File

@ -408,13 +408,15 @@ def windows_getenv(name):
raise AssertionError("name must be Unicode")
n = GetEnvironmentVariableW(name, None, 0)
# GetEnvironmentVariableW returns DWORD, so n cannot be negative.
if n == 0:
err = GetLastError()
raise OSError("Windows error %d attempting to read size of environment variable %r"
% (err, name))
elif n < 0:
raise OSError("Unexpected result %d from GetEnvironmentVariableW attempting to read size of environment variable %r"
% (n, name))
if n == 1:
# Avoid an ambiguity between a zero-length string and an error in the return value of the
# call to GetEnvironmentVariableW below.
return u""
buf = create_unicode_buffer(u'\0'*n)
retval = GetEnvironmentVariableW(name, buf, n)
@ -422,9 +424,9 @@ def windows_getenv(name):
err = GetLastError()
raise OSError("Windows error %d attempting to read environment variable %r"
% (err, name))
elif retval != n-1:
raise OSError("Unexpected result %d from GetEnvironmentVariableW attempting to read environment variable %r"
% (n, name))
if retval >= n:
raise OSError("Unexpected result %d (expected less than %d) from GetEnvironmentVariableW attempting to read environment variable %r"
% (retval, n, name))
return buf.value