X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e84ba59e3e52c3a24f40bc23e69d5e9b7d86fdd4..69120ee48a66faa743b6e7c85a745806f53228ac:/src/msw/debughlp.cpp diff --git a/src/msw/debughlp.cpp b/src/msw/debughlp.cpp index 98b35f06e0..5f5e75037e 100644 --- a/src/msw/debughlp.cpp +++ b/src/msw/debughlp.cpp @@ -305,46 +305,53 @@ wxDbgHelpDLL::DumpField(PSYMBOL_INFO pSym, void *pVariable, unsigned level) break; case SYMBOL_TAG_DATA: - wxDbgHelpDLL::DataKind kind; - if ( !DoGetTypeInfo(pSym, TI_GET_DATAKIND, &kind) || - kind != DATA_MEMBER ) + if ( !pVariable ) { - // maybe it's a static member? we're not interested in them... - break; + s = _T("NULL"); } + else // valid location + { + wxDbgHelpDLL::DataKind kind; + if ( !DoGetTypeInfo(pSym, TI_GET_DATAKIND, &kind) || + kind != DATA_MEMBER ) + { + // maybe it's a static member? we're not interested in them... + break; + } - // get the offset of the child member, relative to its parent - DWORD ofs = 0; - if ( !DoGetTypeInfo(pSym, TI_GET_OFFSET, &ofs) ) - break; + // get the offset of the child member, relative to its parent + DWORD ofs = 0; + if ( !DoGetTypeInfo(pSym, TI_GET_OFFSET, &ofs) ) + break; - pVariable = (void *)((DWORD_PTR)pVariable + ofs); + pVariable = (void *)((DWORD_PTR)pVariable + ofs); - // now pass to the type representing the type of this member - SYMBOL_INFO sym = *pSym; - if ( !DoGetTypeInfo(pSym, TI_GET_TYPEID, &sym.TypeIndex) ) - break; + // now pass to the type representing the type of this member + SYMBOL_INFO sym = *pSym; + if ( !DoGetTypeInfo(pSym, TI_GET_TYPEID, &sym.TypeIndex) ) + break; - ULONG64 size; - DoGetTypeInfo(&sym, TI_GET_LENGTH, &size); + ULONG64 size; + DoGetTypeInfo(&sym, TI_GET_LENGTH, &size); - switch ( DereferenceSymbol(&sym, &pVariable) ) - { - case SYMBOL_TAG_BASE_TYPE: - { - BasicType bt = GetBasicType(&sym); - if ( bt ) + switch ( DereferenceSymbol(&sym, &pVariable) ) + { + case SYMBOL_TAG_BASE_TYPE: { - s = DumpBaseType(bt, size, pVariable); + BasicType bt = GetBasicType(&sym); + if ( bt ) + { + s = DumpBaseType(bt, size, pVariable); + } } - } - break; + break; - case SYMBOL_TAG_UDT: - case SYMBOL_TAG_BASE_CLASS: - s = DumpUDT(&sym, pVariable, level); - break; + case SYMBOL_TAG_UDT: + case SYMBOL_TAG_BASE_CLASS: + s = DumpUDT(&sym, pVariable, level); + break; + } } if ( !s.empty() ) @@ -458,7 +465,16 @@ wxDbgHelpDLL::DereferenceSymbol(PSYMBOL_INFO pSym, void **ppData) // remove one level of indirection except for the char strings: we want // to dump "char *" and not a single "char" for them if ( ppData && *ppData && GetBasicType(pSym) != BASICTYPE_CHAR ) - *ppData = (void *)*((DWORD_PTR *)*ppData); + { + DWORD_PTR *pData = (DWORD_PTR *)*ppData; + + if ( ::IsBadReadPtr(pData, sizeof(DWORD_PTR *)) ) + { + break; + } + + *ppData = (void *)*pData; + } } return tag; @@ -672,7 +688,7 @@ extern "C" void DumpTI(ULONG ti) } OutputDebugString(wxString::Format(_T("tag=%s%s"), - nested ? _T("nested ") : _T(""), + nested ? _T("nested ") : wxEmptyString, TagString(tag).c_str())); if ( tag == wxDbgHelpDLL::SYMBOL_TAG_UDT ) {