From d6ae375d22a9f4f37328a2cbf06e9f5cc63d8bf9 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Tue, 15 Apr 2025 11:40:13 +1000 Subject: [PATCH] fix: init from dump was loosing memory when parsing dict --- package.json | 4 ++-- src/base_config.cpp | 4 ++-- src/base_config.hpp | 6 +++--- src/groups/meta_group_wrapper.cpp | 17 +++++++++-------- src/meta/meta_base_wrapper.hpp | 28 ++++++++++++++++++---------- src/utilities.hpp | 3 ++- 6 files changed, 36 insertions(+), 26 deletions(-) diff --git a/package.json b/package.json index fff3e52..496d999 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "main": "index.js", "name": "libsession_util_nodejs", "description": "Wrappers for the Session Util Library", - "version": "0.4.33", + "version": "0.4.34", "license": "GPL-3.0", "author": { "name": "Oxen Project", @@ -11,7 +11,7 @@ "scripts": { "update_version": "sh update_version.sh", "clean": "rimraf .cache build", - "install": "cmake-js compile --runtime=electron --runtime-version=34.2.0 --CDSUBMODULE_CHECK=OFF --CDLOCAL_MIRROR=https://oxen.rocks/deps --CDENABLE_ONIONREQ=OFF --CDWITH_TESTS=OFF", + "install": "cmake-js build --runtime=electron --runtime-version=34.2.0 --CDSUBMODULE_CHECK=OFF --CDLOCAL_MIRROR=https://oxen.rocks/deps --CDENABLE_ONIONREQ=OFF --CDWITH_TESTS=OFF", "prepare_release": "sh prepare_release.sh" }, "devDependencies": { diff --git a/src/base_config.cpp b/src/base_config.cpp index fe832d7..0c01592 100644 --- a/src/base_config.cpp +++ b/src/base_config.cpp @@ -61,7 +61,7 @@ Napi::Value ConfigBaseImpl::merge(const Napi::CallbackInfo& info) { assertIsArray(info[0]); Napi::Array asArray = info[0].As(); - std::vector>> conf_strs; + std::vector>> conf_strs; conf_strs.reserve(asArray.Length()); for (uint32_t i = 0; i < asArray.Length(); i++) { @@ -73,7 +73,7 @@ Napi::Value ConfigBaseImpl::merge(const Napi::CallbackInfo& info) { Napi::Object itemObject = item.As(); conf_strs.emplace_back( toCppString(itemObject.Get("hash"), "base.merge"), - toCppBufferView(itemObject.Get("data"), "base.merge")); + toCppBuffer(itemObject.Get("data"), "base.merge")); } return get_config().merge(conf_strs); diff --git a/src/base_config.hpp b/src/base_config.hpp index 6499da5..2980375 100644 --- a/src/base_config.hpp +++ b/src/base_config.hpp @@ -94,12 +94,12 @@ class ConfigBaseImpl { // we should get secret key as first arg and optional dumped as second argument assertIsUInt8Array(info[0], "base construct"); assertIsUInt8ArrayOrNull(info[1]); - std::span secretKey = toCppBufferView(info[0], class_name + ".new"); + std::vector secretKey = toCppBuffer(info[0], class_name + ".new"); - std::optional> dump; + std::optional> dump; auto second = info[1]; if (!second.IsEmpty() && !second.IsNull() && !second.IsUndefined()) - dump = toCppBufferView(second, class_name + ".new"); + dump = toCppBuffer(second, class_name + ".new"); // return std::make_shared(secretKey, dump); std::shared_ptr config = std::make_shared(secretKey, dump); diff --git a/src/groups/meta_group_wrapper.cpp b/src/groups/meta_group_wrapper.cpp index 23561ad..ff11c5e 100644 --- a/src/groups/meta_group_wrapper.cpp +++ b/src/groups/meta_group_wrapper.cpp @@ -226,8 +226,7 @@ Napi::Value MetaGroupWrapper::metaMakeDump(const Napi::CallbackInfo& info) { // NOTE: the keys have to be in ascii-sorted order: combined.append("info", session::to_string(this->meta_group->info->make_dump())); combined.append("keys", session::to_string(this->meta_group->keys->make_dump())); - combined.append( - "members", session::to_string(this->meta_group->members->make_dump())); + combined.append("members", session::to_string(this->meta_group->members->make_dump())); auto to_dump = std::move(combined).str(); return session::to_vector(to_dump); @@ -328,7 +327,7 @@ Napi::Value MetaGroupWrapper::metaMerge(const Napi::CallbackInfo& info) { assertIsArray(groupInfo); auto asArr = groupInfo.As(); - std::vector>> conf_strs; + std::vector>> conf_strs; conf_strs.reserve(asArr.Length()); for (uint32_t i = 0; i < asArr.Length(); i++) { @@ -342,7 +341,7 @@ Napi::Value MetaGroupWrapper::metaMerge(const Napi::CallbackInfo& info) { assertIsUInt8Array(itemObject.Get("data"), "groupInfo merge"); conf_strs.emplace_back( toCppString(itemObject.Get("hash"), "meta.merge"), - toCppBufferView(itemObject.Get("data"), "meta.merge")); + toCppBuffer(itemObject.Get("data"), "meta.merge")); } if (conf_strs.size()) { @@ -355,7 +354,7 @@ Napi::Value MetaGroupWrapper::metaMerge(const Napi::CallbackInfo& info) { assertIsArray(groupMember); auto asArr = groupMember.As(); - std::vector>> conf_strs; + std::vector>> conf_strs; conf_strs.reserve(asArr.Length()); for (uint32_t i = 0; i < asArr.Length(); i++) { @@ -369,7 +368,7 @@ Napi::Value MetaGroupWrapper::metaMerge(const Napi::CallbackInfo& info) { assertIsUInt8Array(itemObject.Get("data"), "groupMember merge"); conf_strs.emplace_back( toCppString(itemObject.Get("hash"), "meta.merge"), - toCppBufferView(itemObject.Get("data"), "meta.merge")); + toCppBuffer(itemObject.Get("data"), "meta.merge")); } if (conf_strs.size()) { @@ -822,7 +821,8 @@ Napi::Value MetaGroupWrapper::makeSwarmSubAccount(const Napi::CallbackInfo& info assertIsString(info[0]); auto memberPk = toCppString(info[0], "makeSwarmSubAccount"); - std::vector subaccount = this->meta_group->keys->swarm_make_subaccount(memberPk); + std::vector subaccount = + this->meta_group->keys->swarm_make_subaccount(memberPk); session::nodeapi::checkOrThrow( subaccount.size() == 100, "expected subaccount to be 100 bytes long"); @@ -837,7 +837,8 @@ Napi::Value MetaGroupWrapper::swarmSubAccountToken(const Napi::CallbackInfo& inf assertIsString(info[0]); auto memberPk = toCppString(info[0], "swarmSubAccountToken"); - std::vector subaccount = this->meta_group->keys->swarm_subaccount_token(memberPk); + std::vector subaccount = + this->meta_group->keys->swarm_subaccount_token(memberPk); session::nodeapi::checkOrThrow( subaccount.size() == 36, "expected subaccount token to be 36 bytes long"); diff --git a/src/meta/meta_base_wrapper.hpp b/src/meta/meta_base_wrapper.hpp index 83bbeae..d3a78ae 100644 --- a/src/meta/meta_base_wrapper.hpp +++ b/src/meta/meta_base_wrapper.hpp @@ -1,8 +1,9 @@ #pragma once #include -#include + #include +#include #include "../base_config.hpp" #include "../groups/meta_group.hpp" @@ -65,9 +66,9 @@ class MetaBaseWrapper { std::optional> dumped_meta = maybeNonemptyBuffer( obj.Get("metaDumped"), class_name + ":constructGroupWrapper.metaDumped"); - std::optional> dumped_info; - std::optional> dumped_members; - std::optional> dumped_keys; + std::optional dumped_info; + std::optional dumped_members; + std::optional dumped_keys; if (dumped_meta) { auto dumped_meta_str = to_string(*dumped_meta); @@ -76,30 +77,37 @@ class MetaBaseWrapper { // NB: must read in ascii-sorted order: if (!combined.skip_until("info")) throw std::runtime_error{"info dump not found in combined dump!"}; - dumped_info = session::to_span(combined.consume_string_view()); + dumped_info = combined.consume_string(); if (!combined.skip_until("keys")) throw std::runtime_error{"keys dump not found in combined dump!"}; - dumped_keys = session::to_span(combined.consume_string_view()); + dumped_keys = combined.consume_string(); if (!combined.skip_until("members")) throw std::runtime_error{"members dump not found in combined dump!"}; - dumped_members = session::to_span(combined.consume_string_view()); + dumped_members = combined.consume_string(); } // Note, we keep shared_ptr for those as the Keys one need a reference to Members and // Info on its own currently. auto info = std::make_shared( - group_ed25519_pubkey, group_ed25519_secretkey, dumped_info); + group_ed25519_pubkey, + group_ed25519_secretkey, + (dumped_info ? std::make_optional(session::to_span(*dumped_info)) + : std::nullopt)); auto members = std::make_shared( - group_ed25519_pubkey, group_ed25519_secretkey, dumped_members); + group_ed25519_pubkey, + group_ed25519_secretkey, + (dumped_members ? std::make_optional(session::to_span(*dumped_members)) + : std::nullopt)); auto keys = std::make_shared( user_ed25519_secretkey, group_ed25519_pubkey, group_ed25519_secretkey, - dumped_keys, + (dumped_keys ? std::make_optional(session::to_span(*dumped_keys)) + : std::nullopt), *info, *members); diff --git a/src/utilities.hpp b/src/utilities.hpp index 1d26799..a472758 100644 --- a/src/utilities.hpp +++ b/src/utilities.hpp @@ -55,7 +55,8 @@ auto getStringArgs(const Napi::CallbackInfo& info) { std::string toCppString(Napi::Value x, const std::string& identifier); std::vector toCppBuffer(Napi::Value x, const std::string& identifier); -std::span toCppBufferView(Napi::Value x, const std::string& identifier); + + int64_t toCppInteger(Napi::Value x, const std::string& identifier, bool allowUndefined = false); std::optional maybeNonemptyInt(Napi::Value x, const std::string& identifier); std::optional maybeNonemptyBoolean(Napi::Value x, const std::string& identifier);