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