Skip to content

Commit e76bda2

Browse files
emesareplafosse
authored andcommitted
Fix BNVersionInfo leaking
1 parent 94e527a commit e76bda2

File tree

3 files changed

+75
-7
lines changed

3 files changed

+75
-7
lines changed

binaryninjaapi.cpp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,36 @@ string BinaryNinja::GetVersionString()
203203
}
204204

205205

206+
VersionInfo BinaryNinja::GetVersionInfo()
207+
{
208+
BNVersionInfo result = BNGetVersionInfo();
209+
VersionInfo info;
210+
info.major = result.major;
211+
info.minor = result.minor;
212+
info.build = result.build;
213+
info.channel = "";
214+
if (result.channel)
215+
info.channel = result.channel;
216+
BNFreeString(result.channel);
217+
return info;
218+
}
219+
220+
221+
VersionInfo ParseVersionString(const string &version)
222+
{
223+
BNVersionInfo result = BNParseVersionString(version.c_str());
224+
VersionInfo info;
225+
info.major = result.major;
226+
info.minor = result.minor;
227+
info.build = result.build;
228+
info.channel = "";
229+
if (result.channel)
230+
info.channel = result.channel;
231+
BNFreeString(result.channel);
232+
return info;
233+
}
234+
235+
206236
string BinaryNinja::GetLicensedUserEmail()
207237
{
208238
char* str = BNGetLicensedUserEmail();

binaryninjaapi.h

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1156,6 +1156,28 @@ namespace BinaryNinja {
11561156
@addtogroup coreapi
11571157
@{
11581158
*/
1159+
struct VersionInfo
1160+
{
1161+
uint32_t major {};
1162+
uint32_t minor {};
1163+
uint32_t build {};
1164+
std::string channel;
1165+
1166+
VersionInfo() = default;
1167+
1168+
bool operator<(const VersionInfo &other) const
1169+
{
1170+
char* smallerChan = BNAllocString(channel.c_str());
1171+
char* largerChan = BNAllocString(other.channel.c_str());
1172+
BNVersionInfo smaller = { major, minor, build, smallerChan };
1173+
BNVersionInfo larger = { other.major, other.minor, other.build, largerChan };
1174+
bool result = BNVersionLessThan(smaller, larger);
1175+
BNFreeString(smallerChan);
1176+
BNFreeString(largerChan);
1177+
return result;
1178+
}
1179+
};
1180+
11591181
std::string EscapeString(const std::string& s);
11601182
std::string UnescapeString(const std::string& s);
11611183

@@ -1192,6 +1214,8 @@ namespace BinaryNinja {
11921214
std::string& output, std::string& errors, bool stdoutIsText = false, bool stderrIsText = true);
11931215

11941216
std::string GetVersionString();
1217+
VersionInfo GetVersionInfo();
1218+
VersionInfo ParseVersionString(const std::string& version);
11951219
std::string GetLicensedUserEmail();
11961220
std::string GetProduct();
11971221
std::string GetProductType();
@@ -16813,8 +16837,8 @@ namespace BinaryNinja {
1681316837
std::string GetCommit() const;
1681416838
std::string GetRepository() const;
1681516839
std::string GetProjectData();
16816-
BNVersionInfo GetMinimumVersionInfo() const;
16817-
BNVersionInfo GetMaximumVersionInfo() const;
16840+
VersionInfo GetMinimumVersionInfo() const;
16841+
VersionInfo GetMaximumVersionInfo() const;
1681816842
uint64_t GetLastUpdate();
1681916843
bool IsViewOnly() const;
1682016844
bool IsBeingDeleted() const;

pluginmanager.cpp

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -80,14 +80,28 @@ string RepoPlugin::GetLongdescription() const
8080
RETURN_STRING(BNPluginGetLongdescription(m_object));
8181
}
8282

83-
BNVersionInfo RepoPlugin::GetMinimumVersionInfo() const
84-
{
85-
return BNPluginGetMinimumVersionInfo(m_object);
83+
VersionInfo RepoPlugin::GetMinimumVersionInfo() const
84+
{
85+
auto coreInfo = BNPluginGetMinimumVersionInfo(m_object);
86+
VersionInfo result;
87+
result.major = coreInfo.major;
88+
result.minor = coreInfo.minor;
89+
result.build = coreInfo.build;
90+
result.channel = coreInfo.channel;
91+
BNFreeString(coreInfo.channel);
92+
return result;
8693
}
8794

88-
BNVersionInfo RepoPlugin::GetMaximumVersionInfo() const
95+
VersionInfo RepoPlugin::GetMaximumVersionInfo() const
8996
{
90-
return BNPluginGetMaximumVersionInfo(m_object);
97+
auto coreInfo = BNPluginGetMaximumVersionInfo(m_object);
98+
VersionInfo result;
99+
result.major = coreInfo.major;
100+
result.minor = coreInfo.minor;
101+
result.build = coreInfo.build;
102+
result.channel = coreInfo.channel;
103+
BNFreeString(coreInfo.channel);
104+
return result;
91105
}
92106

93107
string RepoPlugin::GetName() const

0 commit comments

Comments
 (0)