Skip to content

Commit 114f691

Browse files
committed
tree: fix mem leaks in multiple nvme ctrl routines
Valgrind revealed memory leaks in multiple nvme ctrl routines including nvme_configure_ctrl(), nvme_ctrl_alloc() & nvme_scan_ctrl(). This was because previously allocated memory was not freed before assigning new attr values to the respective nvme_ctrl struct members in these routines. Fix the same. Signed-off-by: Martin George <[email protected]>
1 parent 88bffbf commit 114f691

2 files changed

Lines changed: 214 additions & 15 deletions

File tree

src/nvme/tree.c

Lines changed: 133 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1220,6 +1220,126 @@ void nvme_ctrl_set_tls_key(nvme_ctrl_t c, const char *key)
12201220
c->tls_key = strdup(key);
12211221
}
12221222

1223+
void nvme_ctrl_set_addr(nvme_ctrl_t c, const char *addr)
1224+
{
1225+
if (c->address) {
1226+
free(c->address);
1227+
c->address = NULL;
1228+
}
1229+
if (addr)
1230+
c->address = strdup(addr);
1231+
}
1232+
1233+
void nvme_ctrl_set_name(nvme_ctrl_t c, const char *name)
1234+
{
1235+
if (c->name) {
1236+
free(c->name);
1237+
c->name = NULL;
1238+
}
1239+
if (name)
1240+
c->name = strdup(name);
1241+
}
1242+
1243+
void nvme_ctrl_set_sysfs_dir(nvme_ctrl_t c, const char *sysfs_dir)
1244+
{
1245+
if (c->sysfs_dir) {
1246+
free(c->sysfs_dir);
1247+
c->sysfs_dir = NULL;
1248+
}
1249+
if (sysfs_dir)
1250+
c->sysfs_dir = strdup(sysfs_dir);
1251+
}
1252+
1253+
void nvme_ctrl_set_firmware(nvme_ctrl_t c)
1254+
{
1255+
if (c->firmware) {
1256+
free(c->firmware);
1257+
c->firmware = NULL;
1258+
}
1259+
c->firmware = nvme_get_ctrl_attr(c, "firmware_rev");
1260+
}
1261+
1262+
void nvme_ctrl_set_model(nvme_ctrl_t c)
1263+
{
1264+
if (c->model) {
1265+
free(c->model);
1266+
c->model = NULL;
1267+
}
1268+
c->model = nvme_get_ctrl_attr(c, "model");
1269+
}
1270+
1271+
void nvme_ctrl_set_state(nvme_ctrl_t c)
1272+
{
1273+
if (c->state) {
1274+
free(c->state);
1275+
c->state = NULL;
1276+
}
1277+
c->state = nvme_get_ctrl_attr(c, "state");
1278+
}
1279+
1280+
void nvme_ctrl_set_numa_node(nvme_ctrl_t c)
1281+
{
1282+
if (c->numa_node) {
1283+
free(c->numa_node);
1284+
c->numa_node = NULL;
1285+
}
1286+
c->numa_node = nvme_get_ctrl_attr(c, "numa_node");
1287+
}
1288+
1289+
void nvme_ctrl_set_queue_count(nvme_ctrl_t c)
1290+
{
1291+
if (c->queue_count) {
1292+
free(c->queue_count);
1293+
c->queue_count = NULL;
1294+
}
1295+
c->queue_count = nvme_get_ctrl_attr(c, "queue_count");
1296+
}
1297+
1298+
void nvme_ctrl_set_serial(nvme_ctrl_t c)
1299+
{
1300+
if (c->serial) {
1301+
free(c->serial);
1302+
c->serial = NULL;
1303+
}
1304+
c->serial = nvme_get_ctrl_attr(c, "serial");
1305+
}
1306+
1307+
void nvme_ctrl_set_sqsize(nvme_ctrl_t c)
1308+
{
1309+
if (c->sqsize) {
1310+
free(c->sqsize);
1311+
c->sqsize = NULL;
1312+
}
1313+
c->sqsize = nvme_get_ctrl_attr(c, "sqsize");
1314+
}
1315+
1316+
void nvme_ctrl_set_cntrltype(nvme_ctrl_t c)
1317+
{
1318+
if (c->cntrltype) {
1319+
free(c->cntrltype);
1320+
c->cntrltype = NULL;
1321+
}
1322+
c->cntrltype = nvme_get_ctrl_attr(c, "cntrltype");
1323+
}
1324+
1325+
void nvme_ctrl_set_cntlid(nvme_ctrl_t c)
1326+
{
1327+
if (c->cntlid) {
1328+
free(c->cntlid);
1329+
c->cntlid = NULL;
1330+
}
1331+
c->cntlid = nvme_get_ctrl_attr(c, "cntlid");
1332+
}
1333+
1334+
void nvme_ctrl_set_dctype(nvme_ctrl_t c)
1335+
{
1336+
if (c->dctype) {
1337+
free(c->dctype);
1338+
c->dctype = NULL;
1339+
}
1340+
c->dctype = nvme_get_ctrl_attr(c, "dctype");
1341+
}
1342+
12231343
void nvme_ctrl_set_discovered(nvme_ctrl_t c, bool discovered)
12241344
{
12251345
c->discovered = discovered;
@@ -2033,18 +2153,18 @@ static int nvme_configure_ctrl(nvme_root_t r, nvme_ctrl_t c, const char *path,
20332153
closedir(d);
20342154

20352155
c->fd = -1;
2036-
c->name = strdup(name);
2037-
c->sysfs_dir = (char *)path;
2038-
c->firmware = nvme_get_ctrl_attr(c, "firmware_rev");
2039-
c->model = nvme_get_ctrl_attr(c, "model");
2040-
c->state = nvme_get_ctrl_attr(c, "state");
2041-
c->numa_node = nvme_get_ctrl_attr(c, "numa_node");
2042-
c->queue_count = nvme_get_ctrl_attr(c, "queue_count");
2043-
c->serial = nvme_get_ctrl_attr(c, "serial");
2044-
c->sqsize = nvme_get_ctrl_attr(c, "sqsize");
2045-
c->cntrltype = nvme_get_ctrl_attr(c, "cntrltype");
2046-
c->cntlid = nvme_get_ctrl_attr(c, "cntlid");
2047-
c->dctype = nvme_get_ctrl_attr(c, "dctype");
2156+
nvme_ctrl_set_name(c, name);
2157+
nvme_ctrl_set_sysfs_dir(c, path);
2158+
nvme_ctrl_set_firmware(c);
2159+
nvme_ctrl_set_model(c);
2160+
nvme_ctrl_set_state(c);
2161+
nvme_ctrl_set_numa_node(c);
2162+
nvme_ctrl_set_queue_count(c);
2163+
nvme_ctrl_set_serial(c);
2164+
nvme_ctrl_set_sqsize(c);
2165+
nvme_ctrl_set_cntrltype(c);
2166+
nvme_ctrl_set_cntlid(c);
2167+
nvme_ctrl_set_dctype(c);
20482168
c->phy_slot = nvme_ctrl_lookup_phy_slot(r, c->address);
20492169
nvme_read_sysfs_dhchap(r, c);
20502170
nvme_read_sysfs_tls(r, c);
@@ -2194,8 +2314,7 @@ static nvme_ctrl_t nvme_ctrl_alloc(nvme_root_t r, nvme_subsystem_t s,
21942314
errno = ENODEV;
21952315
return NULL;
21962316
}
2197-
c->address = addr;
2198-
addr = NULL;
2317+
nvme_ctrl_set_addr(c, addr);
21992318
if (s->subsystype && !strcmp(s->subsystype, "discovery"))
22002319
c->discovery_ctrl = true;
22012320
ret = nvme_configure_ctrl(r, c, path, name);
@@ -2263,7 +2382,6 @@ nvme_ctrl_t nvme_scan_ctrl(nvme_root_t r, const char *name)
22632382
if (!c)
22642383
return NULL;
22652384

2266-
path = NULL;
22672385
nvme_ctrl_scan_paths(r, c);
22682386
nvme_ctrl_scan_namespaces(r, c);
22692387
return c;

src/nvme/tree.h

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1168,6 +1168,87 @@ const char *nvme_ctrl_get_tls_key(nvme_ctrl_t c);
11681168
*/
11691169
void nvme_ctrl_set_tls_key(nvme_ctrl_t c, const char *key);
11701170

1171+
/**
1172+
* nvme_ctrl_set_addr() - Set controller address
1173+
* @c: Controller whose address to set
1174+
* @addr: Address
1175+
*/
1176+
void nvme_ctrl_set_addr(nvme_ctrl_t c, const char *addr);
1177+
1178+
/**
1179+
* nvme_ctrl_set_name() - Set controller name
1180+
* @c: Controller whose name to set
1181+
* @name: Name
1182+
*/
1183+
void nvme_ctrl_set_name(nvme_ctrl_t c, const char *name);
1184+
1185+
/**
1186+
* nvme_ctrl_set_sysfs_dir() - Set controller sysfs_dir
1187+
* @c: Controller whose sysfs_dir to set
1188+
* @sysfs_dir: Sysfs_dir
1189+
*/
1190+
void nvme_ctrl_set_sysfs_dir(nvme_ctrl_t c, const char *sysfs_dir);
1191+
1192+
/**
1193+
* nvme_ctrl_set_firmware() - Set controller firmware_rev
1194+
* @c: Controller whose firmware revision to set
1195+
*/
1196+
void nvme_ctrl_set_firmware(nvme_ctrl_t c);
1197+
1198+
/**
1199+
* nvme_ctrl_set_model() - Set controller model
1200+
* @c: Controller whose model to set
1201+
*/
1202+
void nvme_ctrl_set_model(nvme_ctrl_t c);
1203+
1204+
/**
1205+
* nvme_ctrl_set_state() - Set controller state
1206+
* @c: Controller whose state to set
1207+
*/
1208+
void nvme_ctrl_set_state(nvme_ctrl_t c);
1209+
1210+
/**
1211+
* nvme_ctrl_set_numa_node() - Set controller numa_node
1212+
* @c: Controller whose numa_node to set
1213+
*/
1214+
void nvme_ctrl_set_numa_node(nvme_ctrl_t c);
1215+
1216+
/**
1217+
* nvme_ctrl_set_queue_count() - Set controller queue_count
1218+
* @c: Controller whose queue_count to set
1219+
*/
1220+
void nvme_ctrl_set_queue_count(nvme_ctrl_t c);
1221+
1222+
/**
1223+
* nvme_ctrl_set_serial() - Set controller serial
1224+
* @c: Controller whose serial to set
1225+
*/
1226+
void nvme_ctrl_set_serial(nvme_ctrl_t c);
1227+
1228+
/**
1229+
* nvme_ctrl_set_sqsize() - Set controller sqsize
1230+
* @c: Controller whose sqsize to set
1231+
*/
1232+
void nvme_ctrl_set_sqsize(nvme_ctrl_t c);
1233+
1234+
/**
1235+
* nvme_ctrl_set_cntrltype() - Set controller cntrltype
1236+
* @c: Controller whose cntrltype to set
1237+
*/
1238+
void nvme_ctrl_set_cntrltype(nvme_ctrl_t c);
1239+
1240+
/**
1241+
* nvme_ctrl_set_cntlid() - Set controller cntlid
1242+
* @c: Controller whose cntlid to set
1243+
*/
1244+
void nvme_ctrl_set_cntlid(nvme_ctrl_t c);
1245+
1246+
/**
1247+
* nvme_ctrl_set_dctype() - Set controller dctype
1248+
* @c: Controller whose dctype to set
1249+
*/
1250+
void nvme_ctrl_set_dctype(nvme_ctrl_t c);
1251+
11711252
/**
11721253
* nvme_ctrl_get_config() - Fabrics configuration of a controller
11731254
* @c: Controller instance

0 commit comments

Comments
 (0)