Skip to content

Commit f39c359

Browse files
author
Daniel Kopecek
committed
Fixed a memory leak in an error path in the rule parser
Resolves: #69 Addresses: ``` Direct leak of 72 byte(s) in 1 object(s) allocated from: #0 0x7f8076950bb0 in operator new(unsigned long) (/usr/lib/x86_64-linux-gnu/libasan.so.3+0xc2bb0) #1 0x7f8075969fe5 in usbguard::parseRuleSpecification(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const*, unsigned int) src/Library/RuleParser.cpp:72 #2 0x7f807599382f in usbguard::RulePrivate::fromString(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) src/Library/RulePrivate.cpp:599 #3 0x7f8075958d38 in usbguard::Rule::fromString(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) src/Library/Rule.cpp:254 #4 0x512764 in ____C_A_T_C_H____T_E_S_T____6 Regression/test_Rule_ghi37.cpp:15 #5 0x461b26 in Catch::FreeFunctionTestCase::invoke() const (/home/james/deb-pkg/TEMP-PACKAGES/usbguard/upstream/src/Tests/.libs/lt-test-regression+0x461b26) #6 0x416165 in Catch::TestCase::invoke() const ../../src/ThirdParty/Catch/include/internal/catch_test_case_info.hpp:176 #7 0x45cffb in Catch::RunContext::invokeActiveTestCase() (/home/james/deb-pkg/TEMP-PACKAGES/usbguard/upstream/src/Tests/.libs/lt-test-regression+0x45cffb) #8 0x45bcfe in Catch::RunContext::runCurrentTest(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&) (/home/james/deb-pkg/TEMP-PACKAGES/usbguard/upstream/src/Tests/.libs/lt-test-regression+0x45bcfe) #9 0x454516 in Catch::RunContext::runTest(Catch::TestCase const&) (/home/james/deb-pkg/TEMP-PACKAGES/usbguard/upstream/src/Tests/.libs/lt-test-regression+0x454516) #10 0x40d04f in Catch::runTests(Catch::Ptr<Catch::Config> const&) ../../src/ThirdParty/Catch/include/internal/../catch_session.hpp:78 #11 0x45f67f in Catch::Session::run() (/home/james/deb-pkg/TEMP-PACKAGES/usbguard/upstream/src/Tests/.libs/lt-test-regression+0x45f67f) #12 0x45ef2f in Catch::Session::run(int, char const* const*) (/home/james/deb-pkg/TEMP-PACKAGES/usbguard/upstream/src/Tests/.libs/lt-test-regression+0x45ef2f) #13 0x42ad3a in main ../../src/ThirdParty/Catch/include/internal/catch_default_main.hpp:15 #14 0x7f80736df77f in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2077f) ```
1 parent 0c4d9a6 commit f39c359

File tree

1 file changed

+9
-3
lines changed

1 file changed

+9
-3
lines changed

src/Library/RuleParser.cpp

+9-3
Original file line numberDiff line numberDiff line change
@@ -61,21 +61,27 @@ namespace usbguard
6161
try {
6262
RuleParserState state(rule_spec);
6363
quex::Lexer lexer(&stream);
64-
quex::Token *token_ptr = nullptr;
64+
QUEX_TYPE_TOKEN* token_ptr = nullptr;
6565

6666
#ifndef NDEBUG
6767
RuleParserTrace(stderr, (char*)"RuleParser:");
6868
#endif
6969
for (;;) {
7070
lexer.receive(&token_ptr);
7171
if (token_ptr->type_id() != RULE_TOKEN_TERMINATION) {
72-
RuleParser(parser_data.get(), token_ptr->type_id(), new QUEX_TYPE_TOKEN(*token_ptr), &state);
72+
QUEX_TYPE_TOKEN* token_copy = new QUEX_TYPE_TOKEN(*token_ptr);
73+
try {
74+
RuleParser(parser_data.get(), token_ptr->type_id(), token_copy, &state);
75+
}
76+
catch(...) {
77+
delete token_copy;
78+
throw;
79+
}
7380
} else {
7481
RuleParser(parser_data.get(), 0, nullptr, &state);
7582
break;
7683
}
7784
}
78-
7985
return std::move(state.rule);
8086
}
8187
catch(RuleParserError& ex) {

0 commit comments

Comments
 (0)