[PATCH 1 of 4] win32: work around a WinError problem handling HRESULT types

Matt Harbison mharbison72 at gmail.com
Thu Jul 13 22:40:05 UTC 2017


# HG changeset patch
# User Matt Harbison <matt_harbison at yahoo.com>
# Date 1490848380 14400
#      Thu Mar 30 00:33:00 2017 -0400
# Node ID 34ade5bfcf96b840ee3643d2429f44865b977749
# Parent  26e4ba058215e536d3827befbea99ff6203d35f8
win32: work around a WinError problem handling HRESULT types

I ran into this ctypes bug while working with the Crypto API.  While this could
be an issue with any Win32 API in theory, the handful of things that we call are
older functions that are unlikely to return COM errors, so I didn't retrofit
this everywhere.

diff --git a/mercurial/win32.py b/mercurial/win32.py
--- a/mercurial/win32.py
+++ b/mercurial/win32.py
@@ -212,7 +212,12 @@ except AttributeError:
 _kernel32.PeekNamedPipe.restype = _BOOL
 
 def _raiseoserror(name):
-    err = ctypes.WinError()
+    # Force the code to a signed int to avoid an 'int too large' error.
+    # See https://bugs.python.org/issue28474
+    code = _kernel32.GetLastError()
+    if code > 0x7fffffff:
+        code -= 2**32
+    err = ctypes.WinError(code=code)
     raise OSError(err.errno, '%s: %s' % (name, err.strerror))
 
 def _getfileinfo(name):


More information about the Mercurial-devel mailing list