From 2f71c66cf3434da99517dcb4a57d9a8cac9e0cac Mon Sep 17 00:00:00 2001 From: Eric Kilmer Date: Tue, 29 Oct 2024 19:21:18 -0400 Subject: [PATCH] Ghidra 11.1.2 --- .../0001-Fix-UBSAN-errors-in-decompiler.patch | 63 +++++++------------ ...ead-of-stroul-to-parse-address-offse.patch | 8 +-- ...-check-to-prevent-errors-in-Windows.patch} | 10 +-- src/setup-ghidra-source.cmake | 4 +- 4 files changed, 33 insertions(+), 52 deletions(-) rename src/patches/stable/{0005-Add-missing-index-check-to-prevent-errors-in-Windows.patch => 0003-Add-missing-index-check-to-prevent-errors-in-Windows.patch} (79%) diff --git a/src/patches/stable/0001-Fix-UBSAN-errors-in-decompiler.patch b/src/patches/stable/0001-Fix-UBSAN-errors-in-decompiler.patch index e634f50bc..dfb4df328 100644 --- a/src/patches/stable/0001-Fix-UBSAN-errors-in-decompiler.patch +++ b/src/patches/stable/0001-Fix-UBSAN-errors-in-decompiler.patch @@ -1,11 +1,11 @@ -From 6c36965500d26d5a35dfbc91725956ae1d51e394 Mon Sep 17 00:00:00 2001 -From: Alex Cameron -Date: Mon, 5 Jun 2023 16:45:04 +1200 -Subject: [PATCH 1/5] Fix UBSAN errors in decompiler +From bed6020f641cc70ec1c391037836c7c5873d8d2f Mon Sep 17 00:00:00 2001 +From: Eric Kilmer +Date: Mon, 12 Aug 2024 12:02:35 -0400 +Subject: [PATCH 1/3] Fix UBSAN errors in decompiler +Co-authored-by: Alex Cameron --- .../Decompiler/src/decompile/cpp/fspec.cc | 8 ++++++-- - .../src/decompile/cpp/funcdata_varnode.cc | 8 +++++++- .../Decompiler/src/decompile/cpp/op.cc | 6 +++++- .../Decompiler/src/decompile/cpp/opbehavior.cc | 8 +++++++- .../src/decompile/cpp/pcodecompile.cc | 18 +++++++++++------- @@ -15,13 +15,13 @@ Subject: [PATCH 1/5] Fix UBSAN errors in decompiler .../src/decompile/cpp/slgh_compile.cc | 2 +- .../Decompiler/src/decompile/cpp/type.cc | 2 +- .../src/decompile/unittests/testfloatemu.cc | 2 +- - 11 files changed, 56 insertions(+), 20 deletions(-) + 10 files changed, 49 insertions(+), 19 deletions(-) diff --git a/Ghidra/Features/Decompiler/src/decompile/cpp/fspec.cc b/Ghidra/Features/Decompiler/src/decompile/cpp/fspec.cc -index dc96f0c19..3482cf17c 100644 +index 65c1cc7889..cb3284b787 100644 --- a/Ghidra/Features/Decompiler/src/decompile/cpp/fspec.cc +++ b/Ghidra/Features/Decompiler/src/decompile/cpp/fspec.cc -@@ -2727,8 +2727,12 @@ void ProtoModelMerged::decode(Decoder &decoder) +@@ -2868,8 +2868,12 @@ void ProtoModelMerged::decode(Decoder &decoder) modellist.push_back(mymodel); } decoder.closeElement(elemId); @@ -36,27 +36,8 @@ index dc96f0c19..3482cf17c 100644 } void ParameterBasic::setTypeLock(bool val) -diff --git a/Ghidra/Features/Decompiler/src/decompile/cpp/funcdata_varnode.cc b/Ghidra/Features/Decompiler/src/decompile/cpp/funcdata_varnode.cc -index fc094ee96..1f7e53ebe 100644 ---- a/Ghidra/Features/Decompiler/src/decompile/cpp/funcdata_varnode.cc -+++ b/Ghidra/Features/Decompiler/src/decompile/cpp/funcdata_varnode.cc -@@ -503,7 +503,13 @@ void Funcdata::setHighLevel(void) - void Funcdata::transferVarnodeProperties(Varnode *vn,Varnode *newVn,int4 lsbOffset) - - { -- uintb newConsume = (vn->getConsume() >> 8*lsbOffset) & calc_mask(newVn->getSize()); -+ uintb newConsume = vn->getConsume(); -+ if (8*lsbOffset < sizeof(newConsume)) { -+ newConsume >>= 8*lsbOffset; -+ } else { -+ newConsume = 0; -+ } -+ newConsume &= calc_mask(newVn->getSize()); - - uint4 vnFlags = vn->getFlags() & (Varnode::directwrite|Varnode::addrforce); - diff --git a/Ghidra/Features/Decompiler/src/decompile/cpp/op.cc b/Ghidra/Features/Decompiler/src/decompile/cpp/op.cc -index 921335173..46cdc39f3 100644 +index 9213351739..46cdc39f37 100644 --- a/Ghidra/Features/Decompiler/src/decompile/cpp/op.cc +++ b/Ghidra/Features/Decompiler/src/decompile/cpp/op.cc @@ -666,7 +666,11 @@ uintb PcodeOp::getNZMaskLocal(bool cliploop) const @@ -73,7 +54,7 @@ index 921335173..46cdc39f3 100644 break; case CPUI_INT_MULT: diff --git a/Ghidra/Features/Decompiler/src/decompile/cpp/opbehavior.cc b/Ghidra/Features/Decompiler/src/decompile/cpp/opbehavior.cc -index aebcfd910..6c47e6eb1 100644 +index aebcfd9103..6c47e6eb15 100644 --- a/Ghidra/Features/Decompiler/src/decompile/cpp/opbehavior.cc +++ b/Ghidra/Features/Decompiler/src/decompile/cpp/opbehavior.cc @@ -746,7 +746,13 @@ uintb OpBehaviorPiece::evaluateBinary(int4 sizeout,int4 sizein,uintb in1,uintb i @@ -92,7 +73,7 @@ index aebcfd910..6c47e6eb1 100644 } diff --git a/Ghidra/Features/Decompiler/src/decompile/cpp/pcodecompile.cc b/Ghidra/Features/Decompiler/src/decompile/cpp/pcodecompile.cc -index ca9d71ab9..85d4dd281 100644 +index ca9d71ab99..85d4dd281d 100644 --- a/Ghidra/Features/Decompiler/src/decompile/cpp/pcodecompile.cc +++ b/Ghidra/Features/Decompiler/src/decompile/cpp/pcodecompile.cc @@ -621,8 +621,10 @@ vector *PcodeCompile::assignBitRange(VarnodeTpl *vn,uint4 bitoffset,uin @@ -135,10 +116,10 @@ index ca9d71ab9..85d4dd281 100644 return res; } diff --git a/Ghidra/Features/Decompiler/src/decompile/cpp/ruleaction.cc b/Ghidra/Features/Decompiler/src/decompile/cpp/ruleaction.cc -index 3703c8ef5..ac6e21c00 100644 +index 74ec9ea4b7..c749a4c7a3 100644 --- a/Ghidra/Features/Decompiler/src/decompile/cpp/ruleaction.cc +++ b/Ghidra/Features/Decompiler/src/decompile/cpp/ruleaction.cc -@@ -976,7 +976,12 @@ int4 RulePullsubIndirect::applyOp(PcodeOp *op,Funcdata &data) +@@ -977,7 +977,12 @@ int4 RulePullsubIndirect::applyOp(PcodeOp *op,Funcdata &data) Varnode *outvn = op->getOut(); if (outvn->isPrecisLo()||outvn->isPrecisHi()) return 0; // Don't pull apart double precision object @@ -152,7 +133,7 @@ index 3703c8ef5..ac6e21c00 100644 consume = ~consume; if ((consume & indir->getIn(0)->getConsume())!=0) return 0; -@@ -6803,8 +6808,9 @@ int4 RulePtrsubCharConstant::applyOp(PcodeOp *op,Funcdata &data) +@@ -6785,8 +6790,9 @@ int4 RulePtrsubCharConstant::applyOp(PcodeOp *op,Funcdata &data) Varnode *sb = op->getIn(0); Datatype *sbType = sb->getTypeReadFacing(op); if (sbType->getMetatype() != TYPE_PTR) return 0; @@ -164,7 +145,7 @@ index 3703c8ef5..ac6e21c00 100644 Varnode *vn1 = op->getIn(1); if (!vn1->isConstant()) return 0; Varnode *outvn = op->getOut(); -@@ -8616,7 +8622,11 @@ int4 RuleSubvarSubpiece::applyOp(PcodeOp *op,Funcdata &data) +@@ -8590,7 +8596,11 @@ int4 RuleSubvarSubpiece::applyOp(PcodeOp *op,Funcdata &data) Varnode *outvn = op->getOut(); int4 flowsize = outvn->getSize(); uintb mask = calc_mask( flowsize ); @@ -178,7 +159,7 @@ index 3703c8ef5..ac6e21c00 100644 if (!aggressive) { if ((vn->getConsume() & mask) != vn->getConsume()) return 0; diff --git a/Ghidra/Features/Decompiler/src/decompile/cpp/semantics.cc b/Ghidra/Features/Decompiler/src/decompile/cpp/semantics.cc -index cd9b9835b..8a4616c3b 100644 +index cd9b9835b1..8a4616c3b9 100644 --- a/Ghidra/Features/Decompiler/src/decompile/cpp/semantics.cc +++ b/Ghidra/Features/Decompiler/src/decompile/cpp/semantics.cc @@ -22,6 +22,7 @@ ConstTpl::ConstTpl(const_type tp) @@ -198,7 +179,7 @@ index cd9b9835b..8a4616c3b 100644 bool ConstTpl::isConstSpace(void) const diff --git a/Ghidra/Features/Decompiler/src/decompile/cpp/semantics.hh b/Ghidra/Features/Decompiler/src/decompile/cpp/semantics.hh -index e0b069959..9117a45c7 100644 +index e0b069959d..9117a45c75 100644 --- a/Ghidra/Features/Decompiler/src/decompile/cpp/semantics.hh +++ b/Ghidra/Features/Decompiler/src/decompile/cpp/semantics.hh @@ -47,7 +47,7 @@ class ConstTpl { @@ -211,7 +192,7 @@ index e0b069959..9117a45c7 100644 type=op2.type; value=op2.value; value_real=op2.value_real; select=op2.select; } ConstTpl(const_type tp,uintb val); diff --git a/Ghidra/Features/Decompiler/src/decompile/cpp/slgh_compile.cc b/Ghidra/Features/Decompiler/src/decompile/cpp/slgh_compile.cc -index c060053bf..c9004023c 100644 +index 50d85e22ba..9f3b456229 100644 --- a/Ghidra/Features/Decompiler/src/decompile/cpp/slgh_compile.cc +++ b/Ghidra/Features/Decompiler/src/decompile/cpp/slgh_compile.cc @@ -2164,8 +2164,8 @@ string SleighCompile::checkSymbols(SymbolScope *scope) @@ -225,10 +206,10 @@ index c060053bf..c9004023c 100644 msg << " Label <" << sym->getName() << "> was placed but not used" << endl; else if (!sym->isPlaced()) diff --git a/Ghidra/Features/Decompiler/src/decompile/cpp/type.cc b/Ghidra/Features/Decompiler/src/decompile/cpp/type.cc -index e6292e138..bd31b7470 100644 +index eeeb1231c0..c13cade288 100644 --- a/Ghidra/Features/Decompiler/src/decompile/cpp/type.cc +++ b/Ghidra/Features/Decompiler/src/decompile/cpp/type.cc -@@ -3561,8 +3561,8 @@ void TypeFactory::recalcPointerSubmeta(Datatype *base,sub_metatype sub) +@@ -3564,8 +3564,8 @@ void TypeFactory::recalcPointerSubmeta(Datatype *base,sub_metatype sub) top.submeta = sub; // Search on the incorrect submeta iter = tree.lower_bound(&top); while(iter != tree.end()) { @@ -239,7 +220,7 @@ index e6292e138..bd31b7470 100644 ++iter; if (ptr->submeta == sub) { diff --git a/Ghidra/Features/Decompiler/src/decompile/unittests/testfloatemu.cc b/Ghidra/Features/Decompiler/src/decompile/unittests/testfloatemu.cc -index c35bde877..061e53677 100644 +index c35bde8774..061e536775 100644 --- a/Ghidra/Features/Decompiler/src/decompile/unittests/testfloatemu.cc +++ b/Ghidra/Features/Decompiler/src/decompile/unittests/testfloatemu.cc @@ -346,7 +346,7 @@ TEST(float_opTrunc_to_int) { @@ -252,5 +233,5 @@ index c35bde877..061e53677 100644 uintb true_result = ((uintb)(int32_t)f) & 0xffffffff; uintb encoding = format.getEncoding(f); -- -2.44.0 +2.47.0 diff --git a/src/patches/stable/0002-Use-stroull-instead-of-stroul-to-parse-address-offse.patch b/src/patches/stable/0002-Use-stroull-instead-of-stroul-to-parse-address-offse.patch index 63e211770..3edebf3b4 100644 --- a/src/patches/stable/0002-Use-stroull-instead-of-stroul-to-parse-address-offse.patch +++ b/src/patches/stable/0002-Use-stroull-instead-of-stroul-to-parse-address-offse.patch @@ -1,7 +1,7 @@ -From 290b06621c7a8c32c1470d16dbd8740876d57640 Mon Sep 17 00:00:00 2001 +From c62057f5051b485f4eee43367d9a2ddb06a28b3e Mon Sep 17 00:00:00 2001 From: Alex Cameron Date: Wed, 3 Aug 2022 20:01:18 +1000 -Subject: [PATCH 2/5] Use `stroull` instead of `stroul` to parse address +Subject: [PATCH 2/3] Use `stroull` instead of `stroul` to parse address offsets --- @@ -9,7 +9,7 @@ Subject: [PATCH 2/5] Use `stroull` instead of `stroul` to parse address 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Ghidra/Features/Decompiler/src/decompile/cpp/space.cc b/Ghidra/Features/Decompiler/src/decompile/cpp/space.cc -index bda09fc94..d077ee375 100644 +index bda09fc94c..d077ee375e 100644 --- a/Ghidra/Features/Decompiler/src/decompile/cpp/space.cc +++ b/Ghidra/Features/Decompiler/src/decompile/cpp/space.cc @@ -16,6 +16,8 @@ @@ -34,5 +34,5 @@ index bda09fc94..d077ee375 100644 enddata = (const char *) tmpdata; if (enddata - s.c_str() == s.size()) { // If no size or offset override -- -2.44.0 +2.47.0 diff --git a/src/patches/stable/0005-Add-missing-index-check-to-prevent-errors-in-Windows.patch b/src/patches/stable/0003-Add-missing-index-check-to-prevent-errors-in-Windows.patch similarity index 79% rename from src/patches/stable/0005-Add-missing-index-check-to-prevent-errors-in-Windows.patch rename to src/patches/stable/0003-Add-missing-index-check-to-prevent-errors-in-Windows.patch index b09809fa2..55159c39e 100644 --- a/src/patches/stable/0005-Add-missing-index-check-to-prevent-errors-in-Windows.patch +++ b/src/patches/stable/0003-Add-missing-index-check-to-prevent-errors-in-Windows.patch @@ -1,7 +1,7 @@ -From a7fc8b440ab58cb377460e11c7449488ff5abc96 Mon Sep 17 00:00:00 2001 +From 33e8049a11cb5a27541130568bf3bfdbac605570 Mon Sep 17 00:00:00 2001 From: Eric Kilmer Date: Sat, 30 Mar 2024 18:46:16 -0400 -Subject: [PATCH 5/5] Add missing index check to prevent errors in Windows +Subject: [PATCH 3/3] Add missing index check to prevent errors in Windows Not sure why this only appears when testing on Windows. --- @@ -9,10 +9,10 @@ Not sure why this only appears when testing on Windows. 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Ghidra/Features/Decompiler/src/decompile/cpp/ifacedecomp.cc b/Ghidra/Features/Decompiler/src/decompile/cpp/ifacedecomp.cc -index ac94d261c..a76ad389b 100644 +index 0237adb820..5048a9d480 100644 --- a/Ghidra/Features/Decompiler/src/decompile/cpp/ifacedecomp.cc +++ b/Ghidra/Features/Decompiler/src/decompile/cpp/ifacedecomp.cc -@@ -1842,7 +1842,7 @@ void IfcProtooverride::execute(istream &s) +@@ -1844,7 +1844,7 @@ void IfcProtooverride::execute(istream &s) s >> ws; Address callpoint(parse_machaddr(s,discard,*dcp->conf->types)); int4 i; @@ -22,5 +22,5 @@ index ac94d261c..a76ad389b 100644 if (i == dcp->fd->numCalls()) throw IfaceExecutionError("No call is made at this address"); -- -2.44.0 +2.47.0 diff --git a/src/setup-ghidra-source.cmake b/src/setup-ghidra-source.cmake index ba4a086de..aa57d3605 100644 --- a/src/setup-ghidra-source.cmake +++ b/src/setup-ghidra-source.cmake @@ -22,7 +22,7 @@ set_property(CACHE sleigh_RELEASE_TYPE PROPERTY STRINGS "stable" "HEAD") find_package(Git REQUIRED) # Ghidra pinned stable version commit -set(ghidra_version "11.1.1") +set(ghidra_version "11.1.2") set(ghidra_git_tag "Ghidra_${ghidra_version}_build") set(ghidra_shallow TRUE) @@ -40,7 +40,7 @@ set(ghidra_patches "${GIT_EXECUTABLE}" am --ignore-space-change --ignore-whitespace --no-gpg-sign "${CMAKE_CURRENT_LIST_DIR}/patches/stable/0001-Fix-UBSAN-errors-in-decompiler.patch" "${CMAKE_CURRENT_LIST_DIR}/patches/stable/0002-Use-stroull-instead-of-stroul-to-parse-address-offse.patch" - "${CMAKE_CURRENT_LIST_DIR}/patches/stable/0005-Add-missing-index-check-to-prevent-errors-in-Windows.patch" + "${CMAKE_CURRENT_LIST_DIR}/patches/stable/0003-Add-missing-index-check-to-prevent-errors-in-Windows.patch" ) # Ghidra pinned commits used for pinning last known working HEAD commit