]> granicus.if.org Git - python/commitdiff
Issue21349 Passing a memoryview to _winreg.SetValueEx now correctly raises a TypeErro...
authorTim Golden <mail@timgolden.me.uk>
Sat, 26 Apr 2014 14:47:08 +0000 (15:47 +0100)
committerTim Golden <mail@timgolden.me.uk>
Sat, 26 Apr 2014 14:47:08 +0000 (15:47 +0100)
Lib/test/test_winreg.py
Misc/ACKS
PC/_winreg.c

index e05d040998bc83729dcc35800c8aec8d44babec3..260c2245101f2f586d4e54aead60d797b8281957 100644 (file)
@@ -329,6 +329,15 @@ class LocalWinregTests(BaseWinregTests):
         finally:
             DeleteKey(HKEY_CURRENT_USER, test_key_name)
 
+    def test_setvalueex_with_memoryview(self):
+        try:
+            with CreateKey(HKEY_CURRENT_USER, test_key_name) as ck:
+                self.assertNotEqual(ck.handle, 0)
+                with self.assertRaises(TypeError):
+                    SetValueEx(ck, "test_name", None, REG_BINARY, memoryview('val'))
+        finally:
+            DeleteKey(HKEY_CURRENT_USER, test_key_name)
+
     def test_queryvalueex_return_value(self):
         # Test for Issue #16759, return unsigned int from QueryValueEx.
         # Reg2Py, which gets called by QueryValueEx, was returning a value
index 9a6f57adbd1080eede11be5728d6b2b0b1101d47..1c40bb338cb51a930ed984144f6f1deea89288b3 100644 (file)
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -657,6 +657,7 @@ Per Ã˜yvind Karlsen
 Anton Kasyanov
 Lou Kates
 Hiroaki Kawai
+Brian Kearns
 Sebastien Keim
 Ryan Kelly
 Dan Kenigsberg
index 472e84e24d49211ca3c4b44ea9e7fc1fa0b3e8d4..f90a282b5408235d8da32369cf559b5423bc0059 100644 (file)
@@ -888,7 +888,7 @@ Py2Reg(PyObject *value, DWORD typ, BYTE **retDataBuf, DWORD *retDataSize)
             else {
                 void *src_buf;
                 PyBufferProcs *pb = value->ob_type->tp_as_buffer;
-                if (pb==NULL) {
+                if (pb == NULL || pb->bf_getreadbuffer == NULL) {
                     PyErr_Format(PyExc_TypeError,
                         "Objects of type '%s' can not "
                         "be used as binary registry values",
@@ -896,9 +896,11 @@ Py2Reg(PyObject *value, DWORD typ, BYTE **retDataBuf, DWORD *retDataSize)
                     return FALSE;
                 }
                 *retDataSize = (*pb->bf_getreadbuffer)(value, 0, &src_buf);
-                *retDataBuf = (BYTE *)PyMem_NEW(char,
-                                                *retDataSize);
-                if (*retDataBuf==NULL){
+                if (*retDataSize < 0) {
+                    return FALSE;
+                }
+                *retDataBuf = (BYTE *)PyMem_NEW(char, *retDataSize);
+                if (*retDataBuf == NULL){
                     PyErr_NoMemory();
                     return FALSE;
                 }