From 5fb901dd157b4a8bbfc3be916c6c1a9d02b5bfa6 Mon Sep 17 00:00:00 2001 From: zhangmeng <775834166@qq.com> Date: 星期日, 29 一月 2023 09:56:56 +0800 Subject: [PATCH] robust --- message.cpp | 61 ++++++++++++++++++++++-------- 1 files changed, 45 insertions(+), 16 deletions(-) diff --git a/message.cpp b/message.cpp index 8766730..b37d0ae 100644 --- a/message.cpp +++ b/message.cpp @@ -13,7 +13,7 @@ #include "google/protobuf/dynamic_message.h" #include "google/protobuf/compiler/importer.h" -#include "3dparty/yyjson/yyjson.h" +#include "3rdparty/yyjson/yyjson.h" #include "bhome_msg_api.pb.h" using namespace bhome_msg; @@ -269,8 +269,7 @@ char* entry = NULL; size_t entry_size = 0; json2str(sv, &entry, &entry_size); - arr[i] = ptrT<char>(entry_size+1); - memcpy(arr[i], entry, entry_size); + arr[i] = entry; } return make_tuple(arr, count); }; @@ -474,7 +473,11 @@ tie(msg->procid, msg->procidl) = copymemory(pid, pids); MsgRequestTopic msgRT; - if (!msgRT.ParseFromArray(data, size)) return NULL; + if (!msgRT.ParseFromArray(data, size)) { + free(msg->procid); + free(msg); + return NULL; + } tie(msg->msg, msg->msgl) = copymemory(msgRT.data()); return msg; @@ -488,8 +491,21 @@ msgRT.set_topic(topic, topicl); msgRT.set_data(data, datal); - auto pbstr = msgRT.SerializeAsString(); + const auto& pbstr = msgRT.SerializeAsString(); tie(msg->msg, msg->msgl) = copymemory(pbstr); + auto doc = yyjson_read(msg->msg, msg->msgl, 0); + yyjson_val* root = yyjson_doc_get_root(doc); + + auto obj = [](yyjson_val* v, const char* name){return yyjson_obj_get(v, name);}; + + auto jp = obj(root, "path"); + auto jb = obj(root, "body"); + if (jp && jb){ + tie(msg->path, msg->pathl) = copymemory(yyjson_get_str(jp), yyjson_get_len(jp)); + tie(msg->body, msg->bodyl) = copymemory(yyjson_get_str(jb), yyjson_get_len(jb)); + } + + yyjson_doc_free(doc); return msg; } @@ -498,11 +514,15 @@ if (msg){ free(msg->procid); free(msg->msg); + free(msg->path); + free(msg->body); free(msg); } } static tuple<const char*, size_t> json2body(yyjson_doc* doc){ + ignoreT(json2body); + yyjson_val* root = yyjson_doc_get_root(doc); auto obj = [](yyjson_val* v, const char* name){return yyjson_obj_get(v, name);}; @@ -511,15 +531,16 @@ if (!jp) return make_tuple((const char*)NULL, 0); auto jb = obj(root, "body"); if (!jb) return make_tuple((const char*)NULL, 0); - return make_tuple(yyjson_get_str(jb), yyjson_get_len(jp)); + return make_tuple(yyjson_get_str(jb), yyjson_get_len(jb)); } struct cstackmsgerr* get_reqmsg_stackerr(struct creqmsg* msg){ - auto doc0 = yyjson_read(msg->msg, msg->msgl, 0); - auto tpbody = json2body(doc0); - if (!get<0>(tpbody)) return NULL; + // auto doc0 = yyjson_read(msg->msg, msg->msgl, 0); + // auto tpbody = json2body(doc0); + // if (!get<0>(tpbody)) return NULL; + // auto doc = yyjson_read(get<0>(tpbody), get<1>(tpbody), 0); - auto doc = yyjson_read(get<0>(tpbody), get<1>(tpbody), 0); + auto doc = yyjson_read(msg->body, msg->bodyl, 0); auto root = yyjson_doc_get_root(doc); auto obj = [](yyjson_val* v, const char* name){return yyjson_obj_get(v, name);}; @@ -531,7 +552,7 @@ tie(smsg->fileid, smsg->fileidl) = copymemory(yyjson_get_str(jfid), yyjson_get_len(jfid)); yyjson_doc_free(doc); - yyjson_doc_free(doc0); + // yyjson_doc_free(doc0); return smsg; } @@ -544,11 +565,12 @@ } // decode success msg struct cstackmsg* get_reqmsg_stack(struct creqmsg* msg){ - auto doc0 = yyjson_read(msg->msg, msg->msgl, 0); - auto tpbody = json2body(doc0); - if (!get<0>(tpbody)) return NULL; + // auto doc0 = yyjson_read(msg->msg, msg->msgl, 0); + // auto tpbody = json2body(doc0); + // if (!get<0>(tpbody)) return NULL; + // auto doc = yyjson_read(get<0>(tpbody), get<1>(tpbody), 0); - auto doc = yyjson_read(get<0>(tpbody), get<1>(tpbody), 0); + auto doc = yyjson_read(msg->body, msg->bodyl, 0); auto root = yyjson_doc_get_root(doc); auto obj = [](yyjson_val* v, const char* name){return yyjson_obj_get(v, name);}; @@ -580,7 +602,7 @@ smsg->files[i] = file; } yyjson_doc_free(doc); - yyjson_doc_free(doc0); + // yyjson_doc_free(doc0); return smsg; } @@ -632,3 +654,10 @@ yyjson_mut_doc_free(doc); return cstr_ref(json, jsonl); } + +void free_query_procs(struct cqueryprocs* procs, const size_t count){ + for(size_t i = 0; i < count; i++){ + free(procs[i].id); + } + free(procs); +} -- Gitblit v1.8.0