Further refine error handling in windows_getenv to correctly handle zero-length environment values. refs #1674

Signed-off-by: Daira Hopwood <daira@jacaranda.org>
This commit is contained in:
Daira Hopwood 2015-02-04 17:02:02 +00:00
parent 30987c1e7d
commit fc90607eec

View File

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