From 37f87212919dcdfbbdf8551ff29c72f03e6fc198 Mon Sep 17 00:00:00 2001 From: ilikethese Date: Mon, 22 Jan 2024 17:20:45 +0800 Subject: [PATCH] fix(dom): add log for deserializer crash --- .../footstone/include/footstone/deserializer.h | 4 +++- modules/footstone/src/deserializer.cc | 12 +++++++++++- .../main/cpp/src/renderer/native_render_jni.cc | 18 ++++++++++++------ 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/modules/footstone/include/footstone/deserializer.h b/modules/footstone/include/footstone/deserializer.h index 95ee2a7f2ec..5851d98a160 100644 --- a/modules/footstone/include/footstone/deserializer.h +++ b/modules/footstone/include/footstone/deserializer.h @@ -37,7 +37,9 @@ class Deserializer { Deserializer(const Deserializer&) = delete; Deserializer& operator=(const Deserializer&) = delete; - void ReadHeader(); + bool ReadHeader(); + + void ReadHeaderChecked(); bool ReadValue(HippyValue& value); diff --git a/modules/footstone/src/deserializer.cc b/modules/footstone/src/deserializer.cc index e2fe681367b..72087924f16 100644 --- a/modules/footstone/src/deserializer.cc +++ b/modules/footstone/src/deserializer.cc @@ -47,7 +47,17 @@ bool Deserializer::ReadValue(HippyValue& value) { return ret; } -void Deserializer::ReadHeader() { +bool Deserializer::ReadHeader() { + if (position_ < end_ && *position_ == static_cast(SerializationTag::kVersion)) { + SerializationTag tag; + ReadTag(tag); + version_ = ReadVarint(); + if (version_ <= kSupportedVersion) return true; + } + return false; +} + +void Deserializer::ReadHeaderChecked() { if (position_ < end_ && *position_ == static_cast(SerializationTag::kVersion)) { SerializationTag tag; ReadTag(tag); diff --git a/renderer/native/android/src/main/cpp/src/renderer/native_render_jni.cc b/renderer/native/android/src/main/cpp/src/renderer/native_render_jni.cc index 1106f8e8855..59c8113db93 100644 --- a/renderer/native/android/src/main/cpp/src/renderer/native_render_jni.cc +++ b/renderer/native/android/src/main/cpp/src/renderer/native_render_jni.cc @@ -265,9 +265,12 @@ void DoCallBack(JNIEnv *j_env, jobject j_object, if (j_buffer != nullptr && j_length > 0) { jbyte params_buffer[j_length]; j_env->GetByteArrayRegion(j_buffer, j_offset, j_length, params_buffer); - footstone::value::Deserializer deserializer((const uint8_t*) params_buffer, - footstone::check::checked_numeric_cast(j_length)); - deserializer.ReadHeader(); + footstone::value::Deserializer deserializer((const uint8_t*)params_buffer, + footstone::check::checked_numeric_cast(j_length)); + ret = deserializer.ReadHeader(); + FOOTSTONE_CHECK(ret) << "Deserializer read header failed. function name " << func_name << ", root id " << root_id + << ", node id " << node_id << "callback id " << cb_id << ", offset " << j_offset << ", length " + << j_length; deserializer.ReadValue(*params); } @@ -334,9 +337,12 @@ void OnReceivedEvent(JNIEnv* j_env, jobject j_object, jint j_render_manager_id, jbyte params_buffer[j_length]; j_env->GetByteArrayRegion(j_buffer, j_offset, j_length, params_buffer); params = std::make_shared(); - footstone::value::Deserializer deserializer((const uint8_t*) params_buffer, - footstone::check::checked_numeric_cast(j_length)); - deserializer.ReadHeader(); + footstone::value::Deserializer deserializer((const uint8_t*)params_buffer, + footstone::check::checked_numeric_cast(j_length)); + ret = deserializer.ReadHeader(); + FOOTSTONE_CHECK(ret) << "Deserializer read header failed. event name " << event_name << ", root id " << root_id + << ", node id " << dom_id << ", offset " << j_offset << ", length " + << j_length; deserializer.ReadValue(*params); }