From bd32d276835edb707f8ae0024c566690be1899da Mon Sep 17 00:00:00 2001 From: "lijie.byte" Date: Mon, 22 Apr 2024 17:06:54 +0800 Subject: [PATCH] fix go probe crash bescause of .go.buildinfo --- rasp/golang/go/symbol/build_info.cpp | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/rasp/golang/go/symbol/build_info.cpp b/rasp/golang/go/symbol/build_info.cpp index e62a11f68..97ea645cb 100644 --- a/rasp/golang/go/symbol/build_info.cpp +++ b/rasp/golang/go/symbol/build_info.cpp @@ -18,7 +18,7 @@ constexpr auto POINTER_FREE_OFFSET = 32; constexpr auto MAX_VAR_INT_LENGTH = 10; -static bool readUVarInt(const unsigned char **pp, unsigned long &value) { +static int readUVarInt(const unsigned char **pp, unsigned long &value) { unsigned int v = 0; unsigned int shift = 0; @@ -29,19 +29,19 @@ static bool readUVarInt(const unsigned char **pp, unsigned long &value) { if (b < 0x80) { if (i == MAX_VAR_INT_LENGTH - 1 && b > 1) - return false; + return 0; *pp = p; value = v | b << shift; - return true; + return i + 1; } v |= (b & 0x7f) << shift; shift += 7; } - return false; + return 0; } bool BuildInfo::load(const std::string &file) { @@ -113,15 +113,18 @@ bool BuildInfo::load(const std::string &file, unsigned long base) { unsigned long length = 0; char *p = &data[POINTER_FREE_OFFSET]; + int ret = 0; - if (!readUVarInt((const unsigned char **)&p, length)) - return false; + ret = readUVarInt((const unsigned char **)&p, length); + if (ret <= 0) return false; + p += ret; buildVersion = {p, (ptrdiff_t)length}; p += length; - if (!readUVarInt((const unsigned char **)&p, length)) - return false; + ret = readUVarInt((const unsigned char **)&p, length); + if (ret <= 0) return false; + p += ret; modInfo = {p, (ptrdiff_t)length}; } else {