From fc90607eecc4fabc1edca6fd4657fad946d862dc Mon Sep 17 00:00:00 2001 From: Daira Hopwood <daira@jacaranda.org> Date: Wed, 4 Feb 2015 17:02:02 +0000 Subject: [PATCH] Further refine error handling in windows_getenv to correctly handle zero-length environment values. refs #1674 Signed-off-by: Daira Hopwood <daira@jacaranda.org> --- src/allmydata/util/fileutil.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/allmydata/util/fileutil.py b/src/allmydata/util/fileutil.py index 7bb25e8e..74132733 100644 --- a/src/allmydata/util/fileutil.py +++ b/src/allmydata/util/fileutil.py @@ -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 -- 2.45.2