Skip to content

Commit 23cb2e5

Browse files
authored
[ASAN] Fix Indirect Mem Leaks in Orchagent (sonic-net#2869)
**What I did** Fix the Mem Leak by moving the raw pointers in type_maps to use smart pointers **Why I did it** ``` Indirect leak of 83776 byte(s) in 476 object(s) allocated from: #0 0x7f0a2a414647 in operator new(unsigned long) ../../../../src/libsanitizer/asan/asan_new_delete.cpp:99 #1 0x5555590cc923 in __gnu_cxx::new_allocator, std::allocator > const, referenced_object> > >::allocate(unsigned long, void const*) /usr/include/c++/10/ext/new_allocator.h:115 #2 0x5555590cc923 in std::allocator_traits, std::allocator > const, referenced_object> > > >::allocate(std::allocator, std::allocator > const, referenced_object> > >&, unsigned long) /usr/include/c++/10/bits/alloc_traits.h:460 #3 0x5555590cc923 in std::_Rb_tree, std::allocator >, std::pair, std::allocator > const, referenced_object>, std::_Select1st, std::allocator > const, referenced_object> >, std::less, std::allocator > >, std::allocator, std::allocator > const, referenced_object> > >::_M_get_node() /usr/include/c++/10/bits/stl_tree.h:584 #4 0x5555590cc923 in std::_Rb_tree_node, std::allocator > const, referenced_object> >* std::_Rb_tree, std::allocator >, std::pair, std::allocator > const, referenced_object>, std::_Select1st, std::allocator > const, referenced_object> >, std::less, std::allocator > >, std::allocator, std::allocator > const, referenced_object> > >::_M_create_node, std::allocator > const&>, std::tuple<> >(std::piecewise_construct_t const&, std::tuple, std::allocator > const&>&&, std::tuple<>&&) /usr/include/c++/10/bits/stl_tree.h:634 sonic-net#5 0x5555590cc923 in std::_Rb_tree_iterator, std::allocator > const, referenced_object> > std::_Rb_tree, std::allocator >, std::pair, std::allocator > const, referenced_object>, std::_Select1st, std::allocator > const, referenced_object> >, std::less, std::allocator > >, std::allocator, std::allocator > const, referenced_object> > >::_M_emplace_hint_unique, std::allocator > const&>, std::tuple<> >(std::_Rb_tree_const_iterator, std::allocator > const, referenced_object> >, std::piecewise_construct_t const&, std::tuple, std::allocator > const&>&&, std::tuple<>&&) /usr/include/c++/10/bits/stl_tree.h:2461 sonic-net#6 0x5555590e8757 in std::map, std::allocator >, referenced_object, std::less, std::allocator > >, std::allocator, std::allocator > const, referenced_object> > >::operator[](std::__cxx11::basic_string, std::allocator > const&) /usr/include/c++/10/bits/stl_map.h:501 sonic-net#7 0x5555590d48b0 in Orch::setObjectReference(std::map, std::allocator >, std::map, std::allocator >, referenced_object, std::less, std::allocator > >, std::allocator, std::allocator > const, referenced_object> > >*, std::less, std::allocator > >, std::allocator, std::allocator > const, std::map, std::allocator >, referenced_object, std::less, std::allocator > >, std::allocator, std::allocator > const, referenced_object> > >*> > >&, std::__cxx11::basic_string, std::allocator > const&, std::__cxx11::basic_string, std::allocator > const&, std::__cxx11::basic_string, std::allocator > const&, std::__cxx11::basic_string, std::allocator > const&) orchagent/orch.cpp:450 sonic-net#8 0x5555594ff66b in QosOrch::handleQueueTable(Consumer&, std::tuple, std::allocator >, std::__cxx11::basic_string, std::allocator >, std::vector, std::allocator >, std::__cxx11::basic_string, std::allocator > >, std::allocator, std::allocator >, std::__cxx11::basic_string, std::allocator > > > > >&) orchagent/qosorch.cpp:1763 sonic-net#9 0x5555594edbd6 in QosOrch::doTask(Consumer&) orchagent/qosorch.cpp:2179 sonic-net#10 0x5555590c8743 in Consumer::drain() orchagent/orch.cpp:241 sonic-net#11 0x5555590c8743 in Consumer::drain() orchagent/orch.cpp:238 sonic-net#12 0x5555590c8743 in Consumer::execute() orchagent/orch.cpp:235 sonic-net#13 0x555559090dad in OrchDaemon::start() orchagent/orchdaemon.cpp:755 sonic-net#14 0x555558e9be25 in main orchagent/main.cpp:766 sonic-net#15 0x7f0a299b6d09 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x23d09) ```
1 parent d54c767 commit 23cb2e5

File tree

3 files changed

+23
-23
lines changed

3 files changed

+23
-23
lines changed

orchagent/bufferorch.cpp

+6-6
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,12 @@ static const vector<sai_buffer_pool_stat_t> bufferPoolWatermarkStatIds =
3333
};
3434

3535
type_map BufferOrch::m_buffer_type_maps = {
36-
{APP_BUFFER_POOL_TABLE_NAME, new object_reference_map()},
37-
{APP_BUFFER_PROFILE_TABLE_NAME, new object_reference_map()},
38-
{APP_BUFFER_QUEUE_TABLE_NAME, new object_reference_map()},
39-
{APP_BUFFER_PG_TABLE_NAME, new object_reference_map()},
40-
{APP_BUFFER_PORT_INGRESS_PROFILE_LIST_NAME, new object_reference_map()},
41-
{APP_BUFFER_PORT_EGRESS_PROFILE_LIST_NAME, new object_reference_map()}
36+
{APP_BUFFER_POOL_TABLE_NAME, make_shared<object_reference_map>()},
37+
{APP_BUFFER_PROFILE_TABLE_NAME, make_shared<object_reference_map>()},
38+
{APP_BUFFER_QUEUE_TABLE_NAME, make_shared<object_reference_map>()},
39+
{APP_BUFFER_PG_TABLE_NAME, make_shared<object_reference_map>()},
40+
{APP_BUFFER_PORT_INGRESS_PROFILE_LIST_NAME, make_shared<object_reference_map>()},
41+
{APP_BUFFER_PORT_EGRESS_PROFILE_LIST_NAME, make_shared<object_reference_map>()}
4242
};
4343

4444
map<string, string> buffer_to_ref_table_map = {

orchagent/orch.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ typedef struct
7272
} referenced_object;
7373

7474
typedef std::map<std::string, referenced_object> object_reference_map;
75-
typedef std::map<std::string, object_reference_map*> type_map;
75+
typedef std::map<std::string, std::shared_ptr<object_reference_map>> type_map;
7676

7777
typedef std::map<std::string, sai_object_id_t> object_map;
7878
typedef std::pair<std::string, sai_object_id_t> object_map_pair;

orchagent/qosorch.cpp

+16-16
Original file line numberDiff line numberDiff line change
@@ -77,22 +77,22 @@ map<string, sai_meter_type_t> scheduler_meter_map = {
7777
};
7878

7979
type_map QosOrch::m_qos_maps = {
80-
{CFG_DSCP_TO_TC_MAP_TABLE_NAME, new object_reference_map()},
81-
{CFG_MPLS_TC_TO_TC_MAP_TABLE_NAME, new object_reference_map()},
82-
{CFG_DOT1P_TO_TC_MAP_TABLE_NAME, new object_reference_map()},
83-
{CFG_TC_TO_QUEUE_MAP_TABLE_NAME, new object_reference_map()},
84-
{CFG_SCHEDULER_TABLE_NAME, new object_reference_map()},
85-
{CFG_WRED_PROFILE_TABLE_NAME, new object_reference_map()},
86-
{CFG_PORT_QOS_MAP_TABLE_NAME, new object_reference_map()},
87-
{CFG_QUEUE_TABLE_NAME, new object_reference_map()},
88-
{CFG_TC_TO_PRIORITY_GROUP_MAP_TABLE_NAME, new object_reference_map()},
89-
{CFG_PFC_PRIORITY_TO_PRIORITY_GROUP_MAP_TABLE_NAME, new object_reference_map()},
90-
{CFG_PFC_PRIORITY_TO_QUEUE_MAP_TABLE_NAME, new object_reference_map()},
91-
{CFG_DSCP_TO_FC_MAP_TABLE_NAME, new object_reference_map()},
92-
{CFG_EXP_TO_FC_MAP_TABLE_NAME, new object_reference_map()},
93-
{CFG_TC_TO_DOT1P_MAP_TABLE_NAME, new object_reference_map()},
94-
{CFG_TC_TO_DSCP_MAP_TABLE_NAME, new object_reference_map()},
95-
{APP_TUNNEL_DECAP_TABLE_NAME, new object_reference_map()}
80+
{CFG_DSCP_TO_TC_MAP_TABLE_NAME, make_shared<object_reference_map>()},
81+
{CFG_MPLS_TC_TO_TC_MAP_TABLE_NAME, make_shared<object_reference_map>()},
82+
{CFG_DOT1P_TO_TC_MAP_TABLE_NAME, make_shared<object_reference_map>()},
83+
{CFG_TC_TO_QUEUE_MAP_TABLE_NAME, make_shared<object_reference_map>()},
84+
{CFG_SCHEDULER_TABLE_NAME, make_shared<object_reference_map>()},
85+
{CFG_WRED_PROFILE_TABLE_NAME, make_shared<object_reference_map>()},
86+
{CFG_PORT_QOS_MAP_TABLE_NAME, make_shared<object_reference_map>()},
87+
{CFG_QUEUE_TABLE_NAME, make_shared<object_reference_map>()},
88+
{CFG_TC_TO_PRIORITY_GROUP_MAP_TABLE_NAME, make_shared<object_reference_map>()},
89+
{CFG_PFC_PRIORITY_TO_PRIORITY_GROUP_MAP_TABLE_NAME, make_shared<object_reference_map>()},
90+
{CFG_PFC_PRIORITY_TO_QUEUE_MAP_TABLE_NAME, make_shared<object_reference_map>()},
91+
{CFG_DSCP_TO_FC_MAP_TABLE_NAME, make_shared<object_reference_map>()},
92+
{CFG_EXP_TO_FC_MAP_TABLE_NAME, make_shared<object_reference_map>()},
93+
{CFG_TC_TO_DOT1P_MAP_TABLE_NAME, make_shared<object_reference_map>()},
94+
{CFG_TC_TO_DSCP_MAP_TABLE_NAME, make_shared<object_reference_map>()},
95+
{APP_TUNNEL_DECAP_TABLE_NAME, make_shared<object_reference_map>()}
9696
};
9797

9898
map<string, string> qos_to_ref_table_map = {

0 commit comments

Comments
 (0)