Ticket #10224: 0001-Added-nullptr-chcking-after-dynamic-casts.patch

File 0001-Added-nullptr-chcking-after-dynamic-casts.patch, 5.0 KB (added by Ezodev, 10 years ago)

new patch

  • src/apps/debugger/arch/x86/ArchitectureX86.cpp

    From 33fbde77f2be8b03685a891bb7fbdbc9727d2e94 Mon Sep 17 00:00:00 2001
    From: Ezo <ezo.dev@gmail.com>
    Date: Wed, 20 Nov 2013 03:13:47 +0000
    Subject: [PATCH] Added nullptr chcking after dynamic casts
    
    ---
     src/apps/debugger/arch/x86/ArchitectureX86.cpp             | 8 +++++++-
     src/apps/debugger/model/Type.cpp                           | 7 +++++--
     src/apps/debugger/user_interface/gui/util/SettingsMenu.cpp | 4 +++-
     src/apps/debugger/value/value_nodes/ArrayValueNode.cpp     | 2 ++
     src/apps/debugger/value/value_nodes/BMessageValueNode.cpp  | 7 +++++++
     5 files changed, 24 insertions(+), 4 deletions(-)
    
    diff --git a/src/apps/debugger/arch/x86/ArchitectureX86.cpp b/src/apps/debugger/arch/x86/ArchitectureX86.cpp
    index b0bec17..8650dca 100644
    a b ArchitectureX86::CreateStackFrame(Image* image, FunctionDebugInfo* function,  
    272272    CpuState*& _previousCpuState)
    273273{
    274274    CpuStateX86* cpuState = dynamic_cast<CpuStateX86*>(_cpuState);
     275    if(cpuState == NULL)
     276        exit(2);
    275277
    276278    uint32 framePointer = cpuState->IntRegisterValue(X86_REGISTER_EBP);
    277279    uint32 eip = cpuState->IntRegisterValue(X86_REGISTER_EIP);
    ArchitectureX86::UpdateStackFrameCpuState(const StackFrame* frame,  
    416418    // This is not a top frame, so we want to offset eip to the previous
    417419    // (calling) instruction.
    418420    CpuStateX86* cpuState = dynamic_cast<CpuStateX86*>(previousCpuState);
    419 
     421    if(cpuState == NULL)
     422        exit(2);
     423       
    420424    // get eip
    421425    uint32 eip = cpuState->IntRegisterValue(X86_REGISTER_EIP);
    422426    if (previousFunction == NULL || eip <= previousFunction->Address())
    ArchitectureX86::GetReturnAddressLocation(StackFrame* frame,  
    676680    } else {
    677681        ValuePieceLocation piece;
    678682        CpuStateX86* state = dynamic_cast<CpuStateX86*>(frame->GetCpuState());
     683        if(state == NULL)
     684            exit(2);
    679685        piece.SetToMemory(state->IntRegisterValue(X86_REGISTER_EAX));
    680686        piece.SetSize(valueSize);
    681687        if (!location->AddPiece(piece))
  • src/apps/debugger/model/Type.cpp

    diff --git a/src/apps/debugger/model/Type.cpp b/src/apps/debugger/model/Type.cpp
    index 318abf2..d13ae1e 100644
    a b ArrayDimension::CountElements() const  
    4444{
    4545    Type* type = GetType();
    4646
    47     if (type->Kind() == TYPE_ENUMERATION)
     47    if (type->Kind() == TYPE_ENUMERATION)   
    4848        return dynamic_cast<EnumerationType*>(type)->CountValues();
    49 
     49   
    5050    if (type->Kind() == TYPE_SUBRANGE) {
    5151        SubrangeType* subrangeType = dynamic_cast<SubrangeType*>(type);
     52        if(subrangeType == NULL)
     53         exit(2);
     54       
    5255        BVariant lower = subrangeType->LowerBound();
    5356        BVariant upper = subrangeType->UpperBound();
    5457        bool isSigned;
  • src/apps/debugger/user_interface/gui/util/SettingsMenu.cpp

    diff --git a/src/apps/debugger/user_interface/gui/util/SettingsMenu.cpp b/src/apps/debugger/user_interface/gui/util/SettingsMenu.cpp
    index 6165eef..8e34705 100644
    a b public:  
    176176    {
    177177        SettingsOption* selectedOption = settings->OptionValue(
    178178            dynamic_cast<OptionsSetting*>(GetSetting()));
    179 
     179        if(selectedOption == NULL)
     180            exit(2);
     181           
    180182        for (int32 i = 0; BMenuItem* item = Submenu()->ItemAt(i); i++) {
    181183            OptionMenuItem* optionItem = dynamic_cast<OptionMenuItem*>(item);
    182184            if (optionItem != NULL)
  • src/apps/debugger/value/value_nodes/ArrayValueNode.cpp

    diff --git a/src/apps/debugger/value/value_nodes/ArrayValueNode.cpp b/src/apps/debugger/value/value_nodes/ArrayValueNode.cpp
    index bc05323..061cf48 100644
    a b ArrayValueNodeChild::ResolveLocation(ValueLoader* valueLoader,  
    315315
    316316        child = dynamic_cast<AbstractArrayValueNodeChild*>(
    317317            child->ArrayParent()->NodeChild());
     318        if(child == NULL)
     319            exit(2);
    318320    }
    319321
    320322    // resolve the element location
  • src/apps/debugger/value/value_nodes/BMessageValueNode.cpp

    diff --git a/src/apps/debugger/value/value_nodes/BMessageValueNode.cpp b/src/apps/debugger/value/value_nodes/BMessageValueNode.cpp
    index 0da34fe..165a504 100644
    a b public:  
    7070        ValueLocation* parentLocation = fParent->Location();
    7171        ValueLocation* location;
    7272        CompoundType* type = dynamic_cast<CompoundType*>(fParent->GetType());
     73        if(type == NULL)
     74            exit(2);
    7375        status_t error = B_OK;
    7476        if (fParent->fIsFlatMessage) {
    7577            location = new ValueLocation();
    BMessageValueNode::ResolvedLocationAndValue(ValueLoader* valueLoader,  
    175177    BVariant what;
    176178
    177179    CompoundType* baseType = dynamic_cast<CompoundType*>(fType);
     180    if(baseType == NULL)
     181        exit(2);
    178182
    179183    if (fIsFlatMessage) {
    180184        headerAddress.SetTo(location->PieceAt(0).address);
    BMessageValueNode::CreateChildren()  
    334338{
    335339    DataMember* member = NULL;
    336340    CompoundType* messageType = dynamic_cast<CompoundType*>(fType);
     341    if(messageType == NULL)
     342        exit(2);
     343       
    337344    for (int32 i = 0; i < messageType->CountDataMembers(); i++) {
    338345        member = messageType->DataMemberAt(i);
    339346        if (strcmp(member->Name(), "what") == 0) {