From: Roger U. <ru...@us...> - 2007-07-04 16:43:36
|
Update of /cvsroot/pywin32/pywin32/com/win32com/src/extensions In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv19986/com/win32com/src/extensions Modified Files: PyILockBytes.cpp Log Message: Fix a memory leak and a buffer overflow Index: PyILockBytes.cpp =================================================================== RCS file: /cvsroot/pywin32/pywin32/com/win32com/src/extensions/PyILockBytes.cpp,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** PyILockBytes.cpp 2 Jul 2007 03:19:53 -0000 1.3 --- PyILockBytes.cpp 4 Jul 2007 16:43:37 -0000 1.4 *************** *** 35,56 **** // @pyparm <o ULARGE_INTEGER>|ulOffset||Offset to start reading // @pyparm int|cb||Number of bytes to read - PyObject *obulOffset; ULONG cb; - if ( !PyArg_ParseTuple(args, "Oi:ReadAt", &obulOffset, &cb) ) - return NULL; ULARGE_INTEGER ulOffset; ! BOOL bPythonIsHappy = TRUE; ! if (!PyWinObject_AsULARGE_INTEGER(obulOffset, &ulOffset)) bPythonIsHappy = FALSE; ! if (!bPythonIsHappy) return NULL; ! char *pv = (char *)malloc(cb); ! ULONG pcbRead; PY_INTERFACE_PRECALL; ! HRESULT hr = pILB->ReadAt( ulOffset, pv, cb, &pcbRead ); PY_INTERFACE_POSTCALL; ! if ( FAILED(hr) ) return PyCom_BuildPyException(hr, pILB, IID_ILockBytes); ! // @comm The result is a binary buffer returned in a string. ! PyObject *pyretval = PyString_FromStringAndSize(pv, pcbRead); return pyretval; } --- 35,56 ---- // @pyparm <o ULARGE_INTEGER>|ulOffset||Offset to start reading // @pyparm int|cb||Number of bytes to read ULONG cb; ULARGE_INTEGER ulOffset; ! if ( !PyArg_ParseTuple(args, "Kk:ReadAt", &ulOffset.QuadPart, &cb) ) ! return NULL; ! ! PyObject *pyretval=PyString_FromStringAndSize(NULL, cb); ! if (pyretval==NULL) ! return NULL; ! ULONG cbRead; PY_INTERFACE_PRECALL; ! HRESULT hr = pILB->ReadAt( ulOffset, PyString_AS_STRING(pyretval), cb, &cbRead ); PY_INTERFACE_POSTCALL; ! if ( FAILED(hr) ){ ! Py_DECREF(pyretval); return PyCom_BuildPyException(hr, pILB, IID_ILockBytes); ! } // @comm The result is a binary buffer returned in a string. ! _PyString_Resize(&pyretval, cbRead); return pyretval; } *************** *** 249,267 **** Py_XDECREF(obulOffset); if (FAILED(hr)) return hr; - // Process the Python results, and convert back to the real params - hr = E_FAIL; - int len = PyObject_Length(result); - if ( len == -1 ) - return PyCom_HandlePythonFailureToCOM(/*pexcepinfo*/); - const char *s = PyString_AsString(result); - if ( s == NULL ) - return PyCom_HandlePythonFailureToCOM(/*pexcepinfo*/); ! memcpy(pv, s, len); ! if ( pcbRead != NULL ) ! *pcbRead = len; ! hr = S_OK; Py_DECREF(result); ! return PyCom_SetCOMErrorFromSimple(hr, GetIID()); } --- 249,269 ---- Py_XDECREF(obulOffset); if (FAILED(hr)) return hr; ! // Process the Python results, and convert back to the real params ! // Length of returned object must fit in buffer ! ! DWORD resultlen; ! VOID *buf; ! if (PyWinObject_AsReadBuffer(result, &buf, &resultlen, FALSE)){ ! if (resultlen > cb) ! PyErr_SetString(PyExc_ValueError,"Returned data longer than requested"); ! else{ ! memcpy(pv, buf, resultlen); ! if (pcbRead) ! *pcbRead = resultlen; ! hr = S_OK; ! } ! } Py_DECREF(result); ! return MAKE_PYCOM_GATEWAY_FAILURE_CODE("Read"); } |