]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[*** Not tested as I don't have Windows running right now! ***]
authorFred Drake <fdrake@acm.org>
Fri, 30 Jun 2000 17:48:51 +0000 (17:48 +0000)
committerFred Drake <fdrake@acm.org>
Fri, 30 Jun 2000 17:48:51 +0000 (17:48 +0000)
Trent Mick <trentm@activestate.com>:

Fix PC/msvcrtmodule.c and PC/winreg.c for Win64. Basically:

- sizeof(HKEY) > sizeof(long) on Win64, so use PyLong_FromVoidPtr()
instead of PyInt_FromLong() to return HKEY values on Win64

- Check for string overflow of an arbitrary registry value (I know
that ensuring that a registry value does not overflow 2**31 characters
seems ridiculous but it is *possible*).

Closes SourceForge patch #100517.

PC/_winreg.c
PC/msvcrtmodule.c

index 45399590e6ff27f90b3edbed44f0c530ee73def7..75ceb8b1abcc8199ae3e4b75a39149d3989ba472 100644 (file)
@@ -592,7 +592,6 @@ PyHKEY_AsHKEY(PyObject *ob, HKEY *pHANDLE, BOOL bNoneOK)
                *pHANDLE = (HKEY)PyLong_AsVoidPtr(ob);
                if (PyErr_Occurred())
                        return FALSE;
-               *pHANDLE = (HKEY)PyInt_AsLong(ob);
        }
        else {
                PyErr_SetString(
@@ -628,12 +627,21 @@ PyWinObject_CloseHKEY(PyObject *obHandle)
        if (PyHKEY_Check(obHandle)) {
                ok = PyHKEY_Close(obHandle);
        }
+#if SIZEOF_LONG >= SIZEOF_HKEY
        else if (PyInt_Check(obHandle)) {
                long rc = RegCloseKey((HKEY)PyInt_AsLong(obHandle));
                ok = (rc == ERROR_SUCCESS);
                if (!ok)
                        PyErr_SetFromWindowsErrWithFunction(rc, "RegCloseKey");
        }
+#else
+       else if (PyLong_Check(obHandle)) {
+               long rc = RegCloseKey((HKEY)PyLong_AsVoidPtr(obHandle));
+               ok = (rc == ERROR_SUCCESS);
+               if (!ok)
+                       PyErr_SetFromWindowsErrWithFunction(rc, "RegCloseKey");
+       }
+#endif
        else {
                PyErr_SetString(
                        PyExc_TypeError,
@@ -880,13 +888,22 @@ Reg2Py(char *retDataBuf, DWORD retDataSize, DWORD typ)
 
                                fixupMultiSZ(str, retDataBuf, retDataSize);
                                obData = PyList_New(s);
+                               if (obData == NULL)
+                                       return NULL;
                                for (index = 0; index < s; index++)
                                {
+                                       size_t len = _mbstrlen(str[index]);
+                                       if (len > INT_MAX) {
+                                               PyErr_SetString(PyExc_OverflowError,
+                                                       "registry string is too long for a Python string");
+                                               Py_DECREF(obData);
+                                               return NULL;
+                                       }
                                        PyList_SetItem(obData,
                                                       index,
                                                       PyUnicode_DecodeMBCS(
                                                            (const char *)str[index],
-                                                           _mbstrlen(str[index]),
+                                                          (int)len,
                                                            NULL)
                                                       );
                                }
index 21be21a5c9f2cb1b6791dc19a935ad2841749739..613e173c8460cfd2c3a7fc9c076697bb09f45eeb 100755 (executable)
@@ -90,7 +90,7 @@ static PyObject *msvcrt_open_osfhandle(PyObject *self, PyObject *args)
 static PyObject *msvcrt_get_osfhandle(PyObject *self, PyObject *args)
 {
        int fd;
-       long handle;
+       intptr_t handle;
 
        if (!PyArg_ParseTuple(args,"i:get_osfhandle", &fd))
                return NULL;
@@ -99,7 +99,10 @@ static PyObject *msvcrt_get_osfhandle(PyObject *self, PyObject *args)
        if (handle == -1)
                return PyErr_SetFromErrno(PyExc_IOError);
 
-       return PyInt_FromLong(handle);
+       /* technically 'handle' is not a pointer, but a integer as
+          large as a pointer, Python's *VoidPtr interface is the
+          most appropriate here */
+       return PyLong_FromVoidPtr((void*)handle);
 }
 
 /* Console I/O */