Fix #14420. Use PyLong_AsUnsignedLong to support the full range of DWORD.

This fixes an OverflowError seen in winreg.SetValueEx when passed
winreg.REG_DWORD values that should be supported by the underlying API.
This commit is contained in:
Brian Curtin 2012-12-27 10:12:45 -06:00
parent e26568f812
commit 12706f2082
3 changed files with 16 additions and 1 deletions

View file

@ -323,6 +323,18 @@ class LocalWinregTests(BaseWinregTests):
finally: finally:
DeleteKey(HKEY_CURRENT_USER, test_key_name) DeleteKey(HKEY_CURRENT_USER, test_key_name)
def test_setvalueex_value_range(self):
# Test for Issue #14420, accept proper ranges for SetValueEx.
# Py2Reg, which gets called by SetValueEx, was using PyLong_AsLong,
# thus raising OverflowError. The implementation now uses
# PyLong_AsUnsignedLong to match DWORD's size.
try:
with CreateKey(HKEY_CURRENT_USER, test_key_name) as ck:
self.assertNotEqual(ck.handle, 0)
SetValueEx(ck, "test_name", None, REG_DWORD, 0x80000000)
finally:
DeleteKey(HKEY_CURRENT_USER, test_key_name)
@unittest.skipUnless(REMOTE_NAME, "Skipping remote registry tests") @unittest.skipUnless(REMOTE_NAME, "Skipping remote registry tests")
class RemoteWinregTests(BaseWinregTests): class RemoteWinregTests(BaseWinregTests):

View file

@ -10,6 +10,9 @@ What's New in Python 3.2.4
Core and Builtins Core and Builtins
----------------- -----------------
- Issue #14420: Support the full DWORD (unsigned long) range in Py2Reg
when passed a REG_DWORD value. Fixes OverflowError in winreg.SetValueEx.
- Issue #16602: When a weakref's target was part of a long deallocation - Issue #16602: When a weakref's target was part of a long deallocation
chain, the object could remain reachable through its weakref even though chain, the object could remain reachable through its weakref even though
its refcount had dropped to zero. its refcount had dropped to zero.

View file

@ -785,7 +785,7 @@ Py2Reg(PyObject *value, DWORD typ, BYTE **retDataBuf, DWORD *retDataSize)
memcpy(*retDataBuf, &zero, sizeof(DWORD)); memcpy(*retDataBuf, &zero, sizeof(DWORD));
} }
else { else {
DWORD d = PyLong_AsLong(value); DWORD d = PyLong_AsUnsignedLong(value);
memcpy(*retDataBuf, &d, sizeof(DWORD)); memcpy(*retDataBuf, &d, sizeof(DWORD));
} }
break; break;