Skip to content

Commit 62916a1

Browse files
Add possibility to compile applications with address sanitizer. (sonic-net#2186)
**What I did** To add a possibility to compile SONiC applications with address sanitizer (ASAN). > ASAN is a memory error detector for C/C++. It finds: > - Use after free (dangling pointer dereference) > - Heap buffer overflow > - Stack buffer overflow > - Global buffer overflow > - Use after return > - Use after the scope > - Initialization order bugs > - Memory leaks Add SIGTERM handling as a trigger to run a memory leak checker. **Why I did it** To add a possibility to detect memory errors in applications. **How I verified it** Compile SWSS with **--enable-asan** option. Install applications to DUT. Run tests that trigger different kinds of memory usage inside of applications. Stop applications with **SIGTERM** signal to trigger ASAN report generation. Reports will be placed in **/var/log/asan/** directory.
1 parent f06114c commit 62916a1

File tree

18 files changed

+272
-87
lines changed

18 files changed

+272
-87
lines changed

cfgmgr/Makefile.am

+55-39
Original file line numberDiff line numberDiff line change
@@ -24,69 +24,69 @@ DBGFLAGS = -g
2424
endif
2525

2626
vlanmgrd_SOURCES = vlanmgrd.cpp vlanmgr.cpp $(top_srcdir)/orchagent/orch.cpp $(top_srcdir)/orchagent/request_parser.cpp $(top_srcdir)/orchagent/response_publisher.cpp shellcmd.h
27-
vlanmgrd_CFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI)
28-
vlanmgrd_CPPFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI)
29-
vlanmgrd_LDADD = $(COMMON_LIBS) $(SAIMETA_LIBS)
27+
vlanmgrd_CFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI) $(CFLAGS_ASAN)
28+
vlanmgrd_CPPFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI) $(CFLAGS_ASAN)
29+
vlanmgrd_LDADD = $(LDFLAGS_ASAN) $(COMMON_LIBS) $(SAIMETA_LIBS)
3030

3131
teammgrd_SOURCES = teammgrd.cpp teammgr.cpp $(top_srcdir)/orchagent/orch.cpp $(top_srcdir)/orchagent/request_parser.cpp $(top_srcdir)/orchagent/response_publisher.cpp shellcmd.h
32-
teammgrd_CFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI)
33-
teammgrd_CPPFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI)
34-
teammgrd_LDADD = $(COMMON_LIBS) $(SAIMETA_LIBS)
32+
teammgrd_CFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI) $(CFLAGS_ASAN)
33+
teammgrd_CPPFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI) $(CFLAGS_ASAN)
34+
teammgrd_LDADD = $(LDFLAGS_ASAN) $(COMMON_LIBS) $(SAIMETA_LIBS)
3535

3636
portmgrd_SOURCES = portmgrd.cpp portmgr.cpp $(top_srcdir)/orchagent/orch.cpp $(top_srcdir)/orchagent/request_parser.cpp $(top_srcdir)/orchagent/response_publisher.cpp shellcmd.h
37-
portmgrd_CFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI)
38-
portmgrd_CPPFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI)
39-
portmgrd_LDADD = $(COMMON_LIBS) $(SAIMETA_LIBS)
37+
portmgrd_CFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI) $(CFLAGS_ASAN)
38+
portmgrd_CPPFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI) $(CFLAGS_ASAN)
39+
portmgrd_LDADD = $(LDFLAGS_ASAN) $(COMMON_LIBS) $(SAIMETA_LIBS)
4040

4141
intfmgrd_SOURCES = intfmgrd.cpp intfmgr.cpp $(top_srcdir)/orchagent/orch.cpp $(top_srcdir)/orchagent/request_parser.cpp $(top_srcdir)/lib/subintf.cpp $(top_srcdir)/orchagent/response_publisher.cpp shellcmd.h
42-
intfmgrd_CFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI)
43-
intfmgrd_CPPFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI)
44-
intfmgrd_LDADD = $(COMMON_LIBS) $(SAIMETA_LIBS)
42+
intfmgrd_CFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI) $(CFLAGS_ASAN)
43+
intfmgrd_CPPFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI) $(CFLAGS_ASAN)
44+
intfmgrd_LDADD = $(LDFLAGS_ASAN) $(COMMON_LIBS) $(SAIMETA_LIBS)
4545

4646
buffermgrd_SOURCES = buffermgrd.cpp buffermgr.cpp buffermgrdyn.cpp $(top_srcdir)/orchagent/orch.cpp $(top_srcdir)/orchagent/request_parser.cpp $(top_srcdir)/orchagent/response_publisher.cpp shellcmd.h
47-
buffermgrd_CFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI)
48-
buffermgrd_CPPFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI)
49-
buffermgrd_LDADD = $(COMMON_LIBS) $(SAIMETA_LIBS)
47+
buffermgrd_CFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI) $(CFLAGS_ASAN)
48+
buffermgrd_CPPFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI) $(CFLAGS_ASAN)
49+
buffermgrd_LDADD = $(LDFLAGS_ASAN) $(COMMON_LIBS) $(SAIMETA_LIBS)
5050

5151
vrfmgrd_SOURCES = vrfmgrd.cpp vrfmgr.cpp $(top_srcdir)/orchagent/orch.cpp $(top_srcdir)/orchagent/request_parser.cpp $(top_srcdir)/orchagent/response_publisher.cpp shellcmd.h
52-
vrfmgrd_CFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI)
53-
vrfmgrd_CPPFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI)
54-
vrfmgrd_LDADD = $(COMMON_LIBS) $(SAIMETA_LIBS)
52+
vrfmgrd_CFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI) $(CFLAGS_ASAN)
53+
vrfmgrd_CPPFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI) $(CFLAGS_ASAN)
54+
vrfmgrd_LDADD = $(LDFLAGS_ASAN) $(COMMON_LIBS) $(SAIMETA_LIBS)
5555

5656
nbrmgrd_SOURCES = nbrmgrd.cpp nbrmgr.cpp $(top_srcdir)/orchagent/orch.cpp $(top_srcdir)/orchagent/request_parser.cpp $(top_srcdir)/orchagent/response_publisher.cpp shellcmd.h
57-
nbrmgrd_CFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI) $(LIBNL_CFLAGS)
58-
nbrmgrd_CPPFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI) $(LIBNL_CPPFLAGS)
59-
nbrmgrd_LDADD = $(COMMON_LIBS) $(SAIMETA_LIBS) $(LIBNL_LIBS)
57+
nbrmgrd_CFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI) $(LIBNL_CFLAGS) $(CFLAGS_ASAN)
58+
nbrmgrd_CPPFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI) $(LIBNL_CPPFLAGS) $(CFLAGS_ASAN)
59+
nbrmgrd_LDADD = $(LDFLAGS_ASAN) $(COMMON_LIBS) $(SAIMETA_LIBS) $(LIBNL_LIBS)
6060

6161
vxlanmgrd_SOURCES = vxlanmgrd.cpp vxlanmgr.cpp $(top_srcdir)/orchagent/orch.cpp $(top_srcdir)/orchagent/request_parser.cpp $(top_srcdir)/orchagent/response_publisher.cpp shellcmd.h
62-
vxlanmgrd_CFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI)
63-
vxlanmgrd_CPPFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI)
64-
vxlanmgrd_LDADD = $(COMMON_LIBS) $(SAIMETA_LIBS)
62+
vxlanmgrd_CFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI) $(CFLAGS_ASAN)
63+
vxlanmgrd_CPPFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI) $(CFLAGS_ASAN)
64+
vxlanmgrd_LDADD = $(LDFLAGS_ASAN) $(COMMON_LIBS) $(SAIMETA_LIBS)
6565

6666
sflowmgrd_SOURCES = sflowmgrd.cpp sflowmgr.cpp $(top_srcdir)/orchagent/orch.cpp $(top_srcdir)/orchagent/request_parser.cpp $(top_srcdir)/orchagent/response_publisher.cpp shellcmd.h
67-
sflowmgrd_CFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI)
68-
sflowmgrd_CPPFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI)
69-
sflowmgrd_LDADD = $(COMMON_LIBS) $(SAIMETA_LIBS)
67+
sflowmgrd_CFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI) $(CFLAGS_ASAN)
68+
sflowmgrd_CPPFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI) $(CFLAGS_ASAN)
69+
sflowmgrd_LDADD = $(LDFLAGS_ASAN) $(COMMON_LIBS) $(SAIMETA_LIBS)
7070

7171
natmgrd_SOURCES = natmgrd.cpp natmgr.cpp $(top_srcdir)/orchagent/orch.cpp $(top_srcdir)/orchagent/request_parser.cpp $(top_srcdir)/orchagent/response_publisher.cpp shellcmd.h
72-
natmgrd_CFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI)
73-
natmgrd_CPPFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI)
74-
natmgrd_LDADD = $(COMMON_LIBS) $(SAIMETA_LIBS)
72+
natmgrd_CFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI) $(CFLAGS_ASAN)
73+
natmgrd_CPPFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI) $(CFLAGS_ASAN)
74+
natmgrd_LDADD = $(LDFLAGS_ASAN) $(COMMON_LIBS) $(SAIMETA_LIBS)
7575

7676
coppmgrd_SOURCES = coppmgrd.cpp coppmgr.cpp $(top_srcdir)/orchagent/orch.cpp $(top_srcdir)/orchagent/request_parser.cpp $(top_srcdir)/orchagent/response_publisher.cpp shellcmd.h
77-
coppmgrd_CFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI)
78-
coppmgrd_CPPFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI)
79-
coppmgrd_LDADD = $(COMMON_LIBS) $(SAIMETA_LIBS)
77+
coppmgrd_CFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI) $(CFLAGS_ASAN)
78+
coppmgrd_CPPFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI) $(CFLAGS_ASAN)
79+
coppmgrd_LDADD = $(LDFLAGS_ASAN) $(COMMON_LIBS) $(SAIMETA_LIBS)
8080

8181
tunnelmgrd_SOURCES = tunnelmgrd.cpp tunnelmgr.cpp $(top_srcdir)/orchagent/orch.cpp $(top_srcdir)/orchagent/request_parser.cpp $(top_srcdir)/orchagent/response_publisher.cpp shellcmd.h
82-
tunnelmgrd_CFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI)
83-
tunnelmgrd_CPPFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI)
84-
tunnelmgrd_LDADD = $(COMMON_LIBS) $(SAIMETA_LIBS)
82+
tunnelmgrd_CFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI) $(CFLAGS_ASAN)
83+
tunnelmgrd_CPPFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI) $(CFLAGS_ASAN)
84+
tunnelmgrd_LDADD = $(LDFLAGS_ASAN) $(COMMON_LIBS) $(SAIMETA_LIBS)
8585

8686
macsecmgrd_SOURCES = macsecmgrd.cpp macsecmgr.cpp $(top_srcdir)/orchagent/orch.cpp $(top_srcdir)/orchagent/request_parser.cpp $(top_srcdir)/orchagent/response_publisher.cpp shellcmd.h
87-
macsecmgrd_CFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI)
88-
macsecmgrd_CPPFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI)
89-
macsecmgrd_LDADD = $(COMMON_LIBS) $(SAIMETA_LIBS)
87+
macsecmgrd_CFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI) $(CFLAGS_ASAN)
88+
macsecmgrd_CPPFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI) $(CFLAGS_ASAN)
89+
macsecmgrd_LDADD = $(LDFLAGS_ASAN) $(COMMON_LIBS) $(SAIMETA_LIBS)
9090

9191
if GCOV_ENABLED
9292
vlanmgrd_LDADD += -lgcovpreload
@@ -104,3 +104,19 @@ tunnelmgrd_LDADD += -lgcovpreload
104104
macsecmgrd_LDADD += -lgcovpreload
105105
endif
106106

107+
if ASAN_ENABLED
108+
vlanmgrd_SOURCES += $(top_srcdir)/lib/asan.cpp
109+
teammgrd_SOURCES += $(top_srcdir)/lib/asan.cpp
110+
portmgrd_SOURCES += $(top_srcdir)/lib/asan.cpp
111+
intfmgrd_SOURCES += $(top_srcdir)/lib/asan.cpp
112+
buffermgrd_SOURCES += $(top_srcdir)/lib/asan.cpp
113+
vrfmgrd_SOURCES += $(top_srcdir)/lib/asan.cpp
114+
nbrmgrd_SOURCES += $(top_srcdir)/lib/asan.cpp
115+
vxlanmgrd_SOURCES += $(top_srcdir)/lib/asan.cpp
116+
sflowmgrd_SOURCES += $(top_srcdir)/lib/asan.cpp
117+
natmgrd_SOURCES += $(top_srcdir)/lib/asan.cpp
118+
coppmgrd_SOURCES += $(top_srcdir)/lib/asan.cpp
119+
tunnelmgrd_SOURCES += $(top_srcdir)/lib/asan.cpp
120+
macsecmgrd_SOURCES += $(top_srcdir)/lib/asan.cpp
121+
endif
122+

cfgmgr/natmgrd.cpp

+10-2
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@ static volatile sig_atomic_t gExit = 0;
6666

6767
std::shared_ptr<swss::NotificationProducer> cleanupNotifier;
6868

69+
static struct sigaction old_sigaction;
70+
6971
void sigterm_handler(int signo)
7072
{
7173
SWSS_LOG_ENTER();
@@ -107,6 +109,10 @@ void cleanup()
107109
natmgr->cleanupMangleIpTables();
108110
natmgr->cleanupPoolIpTable();
109111
}
112+
113+
if (old_sigaction.sa_handler != SIG_IGN && old_sigaction.sa_handler != SIG_DFL) {
114+
old_sigaction.sa_handler(signo);
115+
}
110116
}
111117

112118
int main(int argc, char **argv)
@@ -138,10 +144,12 @@ int main(int argc, char **argv)
138144

139145
cleanupNotifier = std::make_shared<swss::NotificationProducer>(&appDb, "NAT_DB_CLEANUP_NOTIFICATION");
140146

141-
if (signal(SIGTERM, sigterm_handler) == SIG_ERR)
147+
struct sigaction sigact = {};
148+
sigact.sa_handler = sigterm_handler;
149+
if (sigaction(SIGTERM, &sigact, &old_sigaction))
142150
{
143151
SWSS_LOG_ERROR("failed to setup SIGTERM action handler");
144-
exit(1);
152+
exit(EXIT_FAILURE);
145153
}
146154

147155
natmgr = new NatMgr(&cfgDb, &appDb, &stateDb, cfg_tables);

cfgmgr/teammgrd.cpp

+14-1
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,16 @@ ofstream gResponsePublisherRecordOfs;
2323
string gResponsePublisherRecordFile;
2424

2525
bool received_sigterm = false;
26+
static struct sigaction old_sigaction;
2627

2728
void sig_handler(int signo)
2829
{
30+
SWSS_LOG_ENTER();
31+
32+
if (old_sigaction.sa_handler != SIG_IGN && old_sigaction.sa_handler != SIG_DFL) {
33+
old_sigaction.sa_handler(signo);
34+
}
35+
2936
received_sigterm = true;
3037
return;
3138
}
@@ -38,7 +45,13 @@ int main(int argc, char **argv)
3845
SWSS_LOG_NOTICE("--- Starting teammrgd ---");
3946

4047
/* Register the signal handler for SIGTERM */
41-
signal(SIGTERM, sig_handler);
48+
struct sigaction sigact = {};
49+
sigact.sa_handler = sig_handler;
50+
if (sigaction(SIGTERM, &sigact, &old_sigaction))
51+
{
52+
SWSS_LOG_ERROR("failed to setup SIGTERM action handler");
53+
exit(EXIT_FAILURE);
54+
}
4255

4356
try
4457
{

configure.ac

+20
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,26 @@ fi
121121
AM_CONDITIONAL(GCOV_ENABLED, test x$enable_gcov = xyes)
122122
AC_MSG_RESULT($enable_gcov)
123123

124+
AC_ARG_ENABLE(asan,
125+
[ --enable-asan Compile with address sanitizer],
126+
[case "${enableval}" in
127+
yes) asan_enabled=true ;;
128+
no) asan_enabled=false ;;
129+
*) AC_MSG_ERROR(bad value ${enableval} for --enable-asan) ;;
130+
esac],[asan_enabled=false])
131+
132+
if test "x$asan_enabled" = "xtrue"; then
133+
CFLAGS_ASAN+=" -fsanitize=address"
134+
CFLAGS_ASAN+=" -DASAN_ENABLED"
135+
CFLAGS_ASAN+=" -ggdb -fno-omit-frame-pointer -U_FORTIFY_SOURCE"
136+
AC_SUBST(CFLAGS_ASAN)
137+
138+
LDFLAGS_ASAN+=" -lasan"
139+
AC_SUBST(LDFLAGS_ASAN)
140+
fi
141+
142+
AM_CONDITIONAL(ASAN_ENABLED, test x$asan_enabled = xtrue)
143+
124144
AC_SUBST(CFLAGS_COMMON)
125145

126146
AC_CONFIG_FILES([

debian/rules

+9-2
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,18 @@ include /usr/share/dpkg/default.mk
2727
# dh_auto_configure -- \
2828
# -DCMAKE_LIBRARY_PATH=$(DEB_HOST_MULTIARCH)
2929

30+
configure_opts =
31+
ifeq ($(ENABLE_ASAN), y)
32+
configure_opts += --enable-asan
33+
endif
34+
3035
ifeq ($(ENABLE_GCOV), y)
31-
override_dh_auto_configure:
32-
dh_auto_configure -- --enable-gcov CFLAGS="-g -O0" CXXFLAGS="-g -O0"
36+
configure_opts += --enable-gcov CFLAGS="-g -O0" CXXFLAGS="-g -O0"
3337
endif
3438

39+
override_dh_auto_configure:
40+
dh_auto_configure -- $(configure_opts)
41+
3542
override_dh_auto_install:
3643
dh_auto_install --destdir=debian/swss
3744
ifeq ($(ENABLE_GCOV), y)

fdbsyncd/Makefile.am

+8-3
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,15 @@ endif
1010

1111
fdbsyncd_SOURCES = fdbsyncd.cpp fdbsync.cpp $(top_srcdir)/warmrestart/warmRestartAssist.cpp
1212

13-
fdbsyncd_CFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(COV_CFLAGS)
14-
fdbsyncd_CPPFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(COV_CFLAGS)
15-
fdbsyncd_LDADD = -lnl-3 -lnl-route-3 -lswsscommon $(COV_LDFLAGS)
13+
fdbsyncd_CFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(COV_CFLAGS) $(CFLAGS_ASAN)
14+
fdbsyncd_CPPFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(COV_CFLAGS) $(CFLAGS_ASAN)
15+
fdbsyncd_LDADD = $(LDFLAGS_ASAN) -lnl-3 -lnl-route-3 -lswsscommon $(COV_LDFLAGS)
1616

1717
if GCOV_ENABLED
1818
fdbsyncd_LDADD += -lgcovpreload
1919
endif
20+
21+
if ASAN_ENABLED
22+
fdbsyncd_SOURCES += $(top_srcdir)/lib/asan.cpp
23+
endif
24+

fpmsyncd/Makefile.am

+8-3
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,15 @@ endif
1010

1111
fpmsyncd_SOURCES = fpmsyncd.cpp fpmlink.cpp routesync.cpp $(top_srcdir)/warmrestart/warmRestartHelper.cpp
1212

13-
fpmsyncd_CFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON)
14-
fpmsyncd_CPPFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON)
15-
fpmsyncd_LDADD = -lnl-3 -lnl-route-3 -lswsscommon
13+
fpmsyncd_CFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_ASAN)
14+
fpmsyncd_CPPFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_ASAN)
15+
fpmsyncd_LDADD = $(LDFLAGS_ASAN) -lnl-3 -lnl-route-3 -lswsscommon
1616

1717
if GCOV_ENABLED
1818
fpmsyncd_LDADD += -lgcovpreload
1919
endif
20+
21+
if ASAN_ENABLED
22+
fpmsyncd_SOURCES += $(top_srcdir)/lib/asan.cpp
23+
endif
24+

gearsyncd/Makefile.am

+9-4
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,24 @@
11
INCLUDES = -I $(top_srcdir)/lib -I $(top_srcdir) -I $(top_srcdir)/warmrestart -I $(top_srcdir)/cfgmgr
22

3-
bin_PROGRAMS = gearsyncd
3+
bin_PROGRAMS = gearsyncd
44

55
if DEBUG
66
DBGFLAGS = -ggdb -DDEBUG
77
else
88
DBGFLAGS = -g
99
endif
1010

11-
gearsyncd_SOURCES = $(top_srcdir)/lib/gearboxutils.cpp gearsyncd.cpp gearparserbase.cpp gearboxparser.cpp phyparser.cpp $(top_srcdir)/cfgmgr/shellcmd.h
11+
gearsyncd_SOURCES = $(top_srcdir)/lib/gearboxutils.cpp gearsyncd.cpp gearparserbase.cpp gearboxparser.cpp phyparser.cpp $(top_srcdir)/cfgmgr/shellcmd.h
1212

13-
gearsyncd_CPPFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(COV_CFLAGS) $(ASAN_CFLAGS)
13+
gearsyncd_CPPFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(COV_CFLAGS) $(CFLAGS_ASAN)
1414

15-
gearsyncd_LDADD = -lnl-3 -lnl-route-3 -lswsscommon $(COV_LDFLAGS) $(ASAN_LDFLAGS)
15+
gearsyncd_LDADD = $(LDFLAGS_ASAN) -lnl-3 -lnl-route-3 -lswsscommon $(COV_LDFLAGS)
1616

1717
if GCOV_ENABLED
1818
gearsyncd_LDADD += -lgcovpreload
1919
endif
20+
21+
if ASAN_ENABLED
22+
gearsyncd_SOURCES += $(top_srcdir)/lib/asan.cpp
23+
endif
24+

lib/asan.cpp

+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
#include <unistd.h>
2+
#include <signal.h>
3+
#include <sanitizer/lsan_interface.h>
4+
5+
#include <logger.h>
6+
7+
static void swss_asan_sigterm_handler(int signo)
8+
{
9+
SWSS_LOG_ENTER();
10+
11+
__lsan_do_leak_check();
12+
13+
struct sigaction sigact;
14+
if (sigaction(SIGTERM, NULL, &sigact))
15+
{
16+
SWSS_LOG_ERROR("failed to get current SIGTERM action handler");
17+
_exit(EXIT_FAILURE);
18+
}
19+
20+
// Check the currently set signal handler.
21+
// If it is ASAN's signal handler this means that the application didn't set its own handler.
22+
// To preserve default behavior set the default signal handler and raise the signal to trigger its execution.
23+
// Otherwise, the application installed its own signal handler.
24+
// In this case, just trigger a leak check and do nothing else.
25+
if (sigact.sa_handler == swss_asan_sigterm_handler) {
26+
sigemptyset(&sigact.sa_mask);
27+
sigact.sa_flags = 0;
28+
sigact.sa_handler = SIG_DFL;
29+
if (sigaction(SIGTERM, &sigact, NULL))
30+
{
31+
SWSS_LOG_ERROR("failed to setup SIGTERM action handler");
32+
_exit(EXIT_FAILURE);
33+
}
34+
35+
raise(signo);
36+
}
37+
}
38+
39+
__attribute__((constructor))
40+
static void swss_asan_init()
41+
{
42+
SWSS_LOG_ENTER();
43+
44+
struct sigaction sigact = {};
45+
sigact.sa_handler = swss_asan_sigterm_handler;
46+
if (sigaction(SIGTERM, &sigact, NULL))
47+
{
48+
SWSS_LOG_ERROR("failed to setup SIGTERM action handler");
49+
exit(EXIT_FAILURE);
50+
}
51+
}

mclagsyncd/Makefile.am

+8-3
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,15 @@ endif
1010

1111
mclagsyncd_SOURCES = mclagsyncd.cpp mclaglink.cpp
1212

13-
mclagsyncd_CFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON)
14-
mclagsyncd_CPPFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON)
15-
mclagsyncd_LDADD = -lnl-3 -lnl-route-3 -lswsscommon
13+
mclagsyncd_CFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_ASAN)
14+
mclagsyncd_CPPFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_ASAN)
15+
mclagsyncd_LDADD = $(LDFLAGS_ASAN) -lnl-3 -lnl-route-3 -lswsscommon
1616

1717
if GCOV_ENABLED
1818
mclagsyncd_LDADD += -lgcovpreload
1919
endif
20+
21+
if ASAN_ENABLED
22+
mclagsyncd_SOURCES += $(top_srcdir)/lib/asan.cpp
23+
endif
24+

0 commit comments

Comments
 (0)