Skip to content

Commit

Permalink
Merge pull request #2519 from meganz/hotfix/SDK-1377
Browse files Browse the repository at this point in the history
SDK-1377. Get keys memory leak (hotfix for v3.8.1)
  • Loading branch information
sergiohs84 committed Jan 28, 2021
2 parents d83af6a + fe4e6bd commit 6f3447b
Show file tree
Hide file tree
Showing 5 changed files with 50 additions and 66 deletions.
1 change: 1 addition & 0 deletions include/mega/attrmap.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ struct MEGA_API AttrMap

// convert nameid to string
static int nameid2string(nameid, char*);
static string nameid2string(nameid);

// convert string to nameid
static nameid string2nameid(const char *);
Expand Down
9 changes: 4 additions & 5 deletions include/megaapi_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -1681,17 +1681,16 @@ class MegaStringMapPrivate : public MegaStringMap
class MegaStringListPrivate : public MegaStringList
{
public:
MegaStringListPrivate();
MegaStringListPrivate(char **newlist, int size); // takes ownership
virtual ~MegaStringListPrivate();
MEGA_DISABLE_COPY_MOVE(MegaStringListPrivate)
MegaStringListPrivate() = default;
MegaStringListPrivate(string_vector&&); // takes ownership
virtual ~MegaStringListPrivate() = default;
MegaStringList *copy() const override;
const char* get(int i) const override;
int size() const override;
void add(const char* value) override;
const string_vector& getVector();
protected:
MegaStringListPrivate(const MegaStringListPrivate *stringList);
MegaStringListPrivate(const MegaStringListPrivate& stringList) = default;
string_vector mList;
};

Expand Down
9 changes: 9 additions & 0 deletions src/attrmap.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,15 @@ int AttrMap::nameid2string(nameid id, char* buf)
return static_cast<int>(ptr - buf);
}

string AttrMap::nameid2string(nameid id)
{
string s;
s.resize(10);
s.resize(nameid2string(id, const_cast<char*>(s.data())));
return s;
}


nameid AttrMap::string2nameid(const char *a)
{
if (!a)
Expand Down
95 changes: 35 additions & 60 deletions src/megaapi_impl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -681,16 +681,12 @@ MegaStringList *MegaNodePrivate::getCustomAttrNames()
return new MegaStringList();
}

vector<char*> names;
char *buf;
string_vector names;
for (attr_map::iterator it = customAttrs->begin(); it != customAttrs->end(); it++)
{
buf = new char[10];
int attrlen = AttrMap::nameid2string(it->first, buf);
buf[attrlen] = '\0';
names.push_back(buf);
names.push_back(AttrMap::nameid2string(it->first));
}
return new MegaStringListPrivate(names.data(), int(names.size()));
return new MegaStringListPrivate(move(names));
}

const char *MegaNodePrivate::getCustomAttr(const char *attrName)
Expand Down Expand Up @@ -4227,18 +4223,13 @@ const char *MegaStringMapPrivate::get(const char *key) const

MegaStringList *MegaStringMapPrivate::getKeys() const
{
vector<char*> keys;
char *buf;
for (string_map::const_iterator it = strMap.begin(); it != strMap.end(); it++)
string_vector keys;
for (auto& it : strMap)
{
buf = new char[it->first.length()+1];
memcpy(buf, it->first.data(), it->first.length());
buf[it->first.length()] = 0;

keys.push_back(buf);
keys.push_back(it.first);
}

return new MegaStringListPrivate(keys.data(), int(keys.size()));
return new MegaStringListPrivate(move(keys));
}

void MegaStringMapPrivate::set(const char *key, const char *value)
Expand Down Expand Up @@ -4272,31 +4263,14 @@ MegaStringMapPrivate::MegaStringMapPrivate(const MegaStringMapPrivate *megaStrin
delete keys;
}

MegaStringListPrivate::MegaStringListPrivate()
{
}

MegaStringListPrivate::MegaStringListPrivate(const MegaStringListPrivate *stringList)
{
mList = stringList->mList;
}

MegaStringListPrivate::MegaStringListPrivate(char **newlist, int size)
MegaStringListPrivate::MegaStringListPrivate(string_vector&& v)
: mList(move(v))
{
for (int i = 0; i < size; i++)
{
mList.push_back(newlist[i]);
}
}

MegaStringListPrivate::~MegaStringListPrivate()
{

}

MegaStringList *MegaStringListPrivate::copy() const
{
return new MegaStringListPrivate(this);
return new MegaStringListPrivate(*this);
}

const char *MegaStringListPrivate::get(int i) const
Expand Down Expand Up @@ -4366,12 +4340,12 @@ const MegaStringList* MegaStringListMapPrivate::get(const char* key) const

MegaStringList *MegaStringListMapPrivate::getKeys() const
{
vector<char*> list;
string_vector list;
for (const auto& pair : mMap)
{
list.emplace_back(MegaApi::strdup(pair.first.get()));
list.push_back(pair.first.get());
}
return new MegaStringListPrivate{list.data(), static_cast<int>(list.size())};
return new MegaStringListPrivate(move(list));
}

void MegaStringListMapPrivate::set(const char* key, const MegaStringList* value)
Expand Down Expand Up @@ -8291,13 +8265,13 @@ MegaStringList *MegaApiImpl::getBackupFolders(int backuptag)
}
sdkMutex.unlock();

vector<char*> listofpaths;
string_vector listofpaths;

for(map<int64_t, string>::iterator itr = backupTimesPaths.begin(); itr != backupTimesPaths.end(); itr++)
{
listofpaths.push_back(MegaApi::strdup(itr->second.c_str()));
listofpaths.push_back(itr->second);
}
backupFolders = new MegaStringListPrivate(listofpaths.data(), int(listofpaths.size()));
backupFolders = new MegaStringListPrivate(move(listofpaths));

return backupFolders;
}
Expand Down Expand Up @@ -9480,20 +9454,21 @@ MegaStringList *MegaApiImpl::httpServerGetWebDavLinks()

set<handle> handles = httpServer->getAllowedWebDavHandles();

vector<char *> listoflinks;
string_vector listoflinks;

for (std::set<handle>::iterator it = handles.begin(); it != handles.end(); ++it)
{
handle h = *it;
MegaNode *n = getNodeByHandle(h);
if (n)
{
listoflinks.push_back(httpServer->getWebDavLink(n));
unique_ptr<char[]> link(httpServer->getWebDavLink(n));
listoflinks.push_back(link.get());
}
}
sdkMutex.unlock();

links = new MegaStringListPrivate(listoflinks.data(), int(listoflinks.size()));
links = new MegaStringListPrivate(move(listoflinks));

return links;
}
Expand Down Expand Up @@ -9858,21 +9833,21 @@ MegaStringList *MegaApiImpl::ftpServerGetLinks()

set<handle> handles = ftpServer->getAllowedHandles();

vector<char *> listoflinks;
string_vector listoflinks;

for (std::set<handle>::iterator it = handles.begin(); it != handles.end(); ++it)
{
handle h = *it;
MegaNode *n = getNodeByHandle(h);
if (n)
{
listoflinks.push_back(ftpServer->getLink(n));

unique_ptr<char[]> link(ftpServer->getLink(n));
listoflinks.push_back(link.get());
}
}
sdkMutex.unlock();

links = new MegaStringListPrivate(listoflinks.data(), int(listoflinks.size()));
links = new MegaStringListPrivate(move(listoflinks));

return links;
}
Expand Down Expand Up @@ -16016,11 +15991,11 @@ void MegaApiImpl::getregisteredcontacts_result(error e, vector<tuple<string, str
auto stringTable = std::unique_ptr<MegaStringTable>{MegaStringTable::createInstance()};
for (const auto& row : *data)
{
vector<char*> list;
list.emplace_back(MegaApi::strdup(std::get<0>(row).c_str()));
list.emplace_back(MegaApi::strdup(std::get<1>(row).c_str()));
list.emplace_back(MegaApi::strdup(std::get<2>(row).c_str()));
auto stringList = new MegaStringListPrivate{list.data(), static_cast<int>(list.size())};
string_vector list;
list.emplace_back(std::get<0>(row));
list.emplace_back(std::get<1>(row));
list.emplace_back(std::get<2>(row));
auto stringList = new MegaStringListPrivate(move(list));
stringTable->append(stringList);
}
request->setMegaStringTable(stringTable.get());
Expand All @@ -16043,12 +16018,12 @@ void MegaApiImpl::getcountrycallingcodes_result(error e, map<string, vector<stri
auto stringListMap = std::unique_ptr<MegaStringListMap>{MegaStringListMap::createInstance()};
for (const auto& pair : *data)
{
vector<char*> list;
string_vector list;
for (const auto& value : pair.second)
{
list.emplace_back(MegaApi::strdup(value.c_str()));
list.emplace_back(value);
}
auto stringList = new MegaStringListPrivate{list.data(), static_cast<int>(list.size())};
auto stringList = new MegaStringListPrivate(move(list));
stringListMap->set(pair.first.c_str(), stringList);
}
request->setMegaStringListMap(stringListMap.get());
Expand Down Expand Up @@ -33323,14 +33298,14 @@ MegaStringList *MegaAchievementsDetailsPrivate::getAwardEmails(unsigned int inde
{
if (details.awards.at(index).achievement_class == MEGA_ACHIEVEMENT_INVITE)
{
vector<char*> data;
string_vector data;
vector<string>::iterator it = details.awards.at(index).emails_invited.begin();
while (it != details.awards.at(index).emails_invited.end())
{
data.push_back(MegaApi::strdup(it->c_str()));
data.push_back(*it);
it++;
}
return new MegaStringListPrivate(data.data(), int(data.size()));
return new MegaStringListPrivate(move(data));
}
}

Expand Down
2 changes: 1 addition & 1 deletion tests/integration/Sync_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2763,7 +2763,7 @@ GTEST_TEST(Sync, BasicSync_MassNotifyFromLocalFolderTree)
auto startTime = std::chrono::steady_clock::now();
while (std::chrono::steady_clock::now() - startTime < std::chrono::seconds(5 * 60))
{
int remaining = 0;
size_t remaining = 0;
auto result0 = clientA1.thread_do<bool>([&](StandardClient &sc, PromiseBoolSP p)
{
sc.client.syncs.forEachRunningSync(
Expand Down

0 comments on commit 6f3447b

Please sign in to comment.