Skip to content

Commit 655451d

Browse files
authored
Merge pull request #24 from Bilb/fix-libsession-type-issue
fix: init from dump was loosing memory when parsing dict
2 parents 0749068 + d6ae375 commit 655451d

File tree

6 files changed

+36
-26
lines changed

6 files changed

+36
-26
lines changed

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"main": "index.js",
33
"name": "libsession_util_nodejs",
44
"description": "Wrappers for the Session Util Library",
5-
"version": "0.4.33",
5+
"version": "0.4.34",
66
"license": "GPL-3.0",
77
"author": {
88
"name": "Oxen Project",
@@ -11,7 +11,7 @@
1111
"scripts": {
1212
"update_version": "sh update_version.sh",
1313
"clean": "rimraf .cache build",
14-
"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",
14+
"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",
1515
"prepare_release": "sh prepare_release.sh"
1616
},
1717
"devDependencies": {

src/base_config.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ Napi::Value ConfigBaseImpl::merge(const Napi::CallbackInfo& info) {
6161
assertIsArray(info[0]);
6262
Napi::Array asArray = info[0].As<Napi::Array>();
6363

64-
std::vector<std::pair<std::string, std::span<const unsigned char>>> conf_strs;
64+
std::vector<std::pair<std::string, std::vector<unsigned char>>> conf_strs;
6565
conf_strs.reserve(asArray.Length());
6666

6767
for (uint32_t i = 0; i < asArray.Length(); i++) {
@@ -73,7 +73,7 @@ Napi::Value ConfigBaseImpl::merge(const Napi::CallbackInfo& info) {
7373
Napi::Object itemObject = item.As<Napi::Object>();
7474
conf_strs.emplace_back(
7575
toCppString(itemObject.Get("hash"), "base.merge"),
76-
toCppBufferView(itemObject.Get("data"), "base.merge"));
76+
toCppBuffer(itemObject.Get("data"), "base.merge"));
7777
}
7878

7979
return get_config<ConfigBase>().merge(conf_strs);

src/base_config.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -94,12 +94,12 @@ class ConfigBaseImpl {
9494
// we should get secret key as first arg and optional dumped as second argument
9595
assertIsUInt8Array(info[0], "base construct");
9696
assertIsUInt8ArrayOrNull(info[1]);
97-
std::span<const unsigned char> secretKey = toCppBufferView(info[0], class_name + ".new");
97+
std::vector<unsigned char> secretKey = toCppBuffer(info[0], class_name + ".new");
9898

99-
std::optional<std::span<const unsigned char>> dump;
99+
std::optional<std::vector<unsigned char>> dump;
100100
auto second = info[1];
101101
if (!second.IsEmpty() && !second.IsNull() && !second.IsUndefined())
102-
dump = toCppBufferView(second, class_name + ".new");
102+
dump = toCppBuffer(second, class_name + ".new");
103103

104104
// return std::make_shared<Config>(secretKey, dump);
105105
std::shared_ptr<Config> config = std::make_shared<Config>(secretKey, dump);

src/groups/meta_group_wrapper.cpp

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -226,8 +226,7 @@ Napi::Value MetaGroupWrapper::metaMakeDump(const Napi::CallbackInfo& info) {
226226
// NOTE: the keys have to be in ascii-sorted order:
227227
combined.append("info", session::to_string(this->meta_group->info->make_dump()));
228228
combined.append("keys", session::to_string(this->meta_group->keys->make_dump()));
229-
combined.append(
230-
"members", session::to_string(this->meta_group->members->make_dump()));
229+
combined.append("members", session::to_string(this->meta_group->members->make_dump()));
231230
auto to_dump = std::move(combined).str();
232231

233232
return session::to_vector(to_dump);
@@ -328,7 +327,7 @@ Napi::Value MetaGroupWrapper::metaMerge(const Napi::CallbackInfo& info) {
328327
assertIsArray(groupInfo);
329328
auto asArr = groupInfo.As<Napi::Array>();
330329

331-
std::vector<std::pair<std::string, std::span<const unsigned char>>> conf_strs;
330+
std::vector<std::pair<std::string, std::vector<unsigned char>>> conf_strs;
332331
conf_strs.reserve(asArr.Length());
333332

334333
for (uint32_t i = 0; i < asArr.Length(); i++) {
@@ -342,7 +341,7 @@ Napi::Value MetaGroupWrapper::metaMerge(const Napi::CallbackInfo& info) {
342341
assertIsUInt8Array(itemObject.Get("data"), "groupInfo merge");
343342
conf_strs.emplace_back(
344343
toCppString(itemObject.Get("hash"), "meta.merge"),
345-
toCppBufferView(itemObject.Get("data"), "meta.merge"));
344+
toCppBuffer(itemObject.Get("data"), "meta.merge"));
346345
}
347346

348347
if (conf_strs.size()) {
@@ -355,7 +354,7 @@ Napi::Value MetaGroupWrapper::metaMerge(const Napi::CallbackInfo& info) {
355354
assertIsArray(groupMember);
356355
auto asArr = groupMember.As<Napi::Array>();
357356

358-
std::vector<std::pair<std::string, std::span<const unsigned char>>> conf_strs;
357+
std::vector<std::pair<std::string, std::vector<unsigned char>>> conf_strs;
359358
conf_strs.reserve(asArr.Length());
360359

361360
for (uint32_t i = 0; i < asArr.Length(); i++) {
@@ -369,7 +368,7 @@ Napi::Value MetaGroupWrapper::metaMerge(const Napi::CallbackInfo& info) {
369368
assertIsUInt8Array(itemObject.Get("data"), "groupMember merge");
370369
conf_strs.emplace_back(
371370
toCppString(itemObject.Get("hash"), "meta.merge"),
372-
toCppBufferView(itemObject.Get("data"), "meta.merge"));
371+
toCppBuffer(itemObject.Get("data"), "meta.merge"));
373372
}
374373

375374
if (conf_strs.size()) {
@@ -822,7 +821,8 @@ Napi::Value MetaGroupWrapper::makeSwarmSubAccount(const Napi::CallbackInfo& info
822821
assertIsString(info[0]);
823822

824823
auto memberPk = toCppString(info[0], "makeSwarmSubAccount");
825-
std::vector<unsigned char> subaccount = this->meta_group->keys->swarm_make_subaccount(memberPk);
824+
std::vector<unsigned char> subaccount =
825+
this->meta_group->keys->swarm_make_subaccount(memberPk);
826826

827827
session::nodeapi::checkOrThrow(
828828
subaccount.size() == 100, "expected subaccount to be 100 bytes long");
@@ -837,7 +837,8 @@ Napi::Value MetaGroupWrapper::swarmSubAccountToken(const Napi::CallbackInfo& inf
837837
assertIsString(info[0]);
838838

839839
auto memberPk = toCppString(info[0], "swarmSubAccountToken");
840-
std::vector<unsigned char> subaccount = this->meta_group->keys->swarm_subaccount_token(memberPk);
840+
std::vector<unsigned char> subaccount =
841+
this->meta_group->keys->swarm_subaccount_token(memberPk);
841842

842843
session::nodeapi::checkOrThrow(
843844
subaccount.size() == 36, "expected subaccount token to be 36 bytes long");

src/meta/meta_base_wrapper.hpp

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
#pragma once
22

33
#include <napi.h>
4-
#include <vector>
4+
55
#include <span>
6+
#include <vector>
67

78
#include "../base_config.hpp"
89
#include "../groups/meta_group.hpp"
@@ -65,9 +66,9 @@ class MetaBaseWrapper {
6566
std::optional<std::vector<unsigned char>> dumped_meta = maybeNonemptyBuffer(
6667
obj.Get("metaDumped"), class_name + ":constructGroupWrapper.metaDumped");
6768

68-
std::optional<std::span<const unsigned char>> dumped_info;
69-
std::optional<std::span<const unsigned char>> dumped_members;
70-
std::optional<std::span<const unsigned char>> dumped_keys;
69+
std::optional<std::string> dumped_info;
70+
std::optional<std::string> dumped_members;
71+
std::optional<std::string> dumped_keys;
7172

7273
if (dumped_meta) {
7374
auto dumped_meta_str = to_string(*dumped_meta);
@@ -76,30 +77,37 @@ class MetaBaseWrapper {
7677
// NB: must read in ascii-sorted order:
7778
if (!combined.skip_until("info"))
7879
throw std::runtime_error{"info dump not found in combined dump!"};
79-
dumped_info = session::to_span(combined.consume_string_view());
80+
dumped_info = combined.consume_string();
8081

8182
if (!combined.skip_until("keys"))
8283
throw std::runtime_error{"keys dump not found in combined dump!"};
83-
dumped_keys = session::to_span(combined.consume_string_view());
84+
dumped_keys = combined.consume_string();
8485

8586
if (!combined.skip_until("members"))
8687
throw std::runtime_error{"members dump not found in combined dump!"};
87-
dumped_members = session::to_span(combined.consume_string_view());
88+
dumped_members = combined.consume_string();
8889
}
8990

9091
// Note, we keep shared_ptr for those as the Keys one need a reference to Members and
9192
// Info on its own currently.
9293
auto info = std::make_shared<config::groups::Info>(
93-
group_ed25519_pubkey, group_ed25519_secretkey, dumped_info);
94+
group_ed25519_pubkey,
95+
group_ed25519_secretkey,
96+
(dumped_info ? std::make_optional(session::to_span(*dumped_info))
97+
: std::nullopt));
9498

9599
auto members = std::make_shared<config::groups::Members>(
96-
group_ed25519_pubkey, group_ed25519_secretkey, dumped_members);
100+
group_ed25519_pubkey,
101+
group_ed25519_secretkey,
102+
(dumped_members ? std::make_optional(session::to_span(*dumped_members))
103+
: std::nullopt));
97104

98105
auto keys = std::make_shared<config::groups::Keys>(
99106
user_ed25519_secretkey,
100107
group_ed25519_pubkey,
101108
group_ed25519_secretkey,
102-
dumped_keys,
109+
(dumped_keys ? std::make_optional(session::to_span(*dumped_keys))
110+
: std::nullopt),
103111
*info,
104112
*members);
105113

src/utilities.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,8 @@ auto getStringArgs(const Napi::CallbackInfo& info) {
5555

5656
std::string toCppString(Napi::Value x, const std::string& identifier);
5757
std::vector<unsigned char> toCppBuffer(Napi::Value x, const std::string& identifier);
58-
std::span<const unsigned char> toCppBufferView(Napi::Value x, const std::string& identifier);
58+
59+
5960
int64_t toCppInteger(Napi::Value x, const std::string& identifier, bool allowUndefined = false);
6061
std::optional<int64_t> maybeNonemptyInt(Napi::Value x, const std::string& identifier);
6162
std::optional<bool> maybeNonemptyBoolean(Napi::Value x, const std::string& identifier);

0 commit comments

Comments
 (0)