Skip to content

Commit 6039466

Browse files
committed
nvme: sanitize call to strerror()
Passing a negative int to strerror() may lead to undefined behavior and also result in a mem leak. Fix this by ensuring an appropriate value is passed instead. Signed-off-by: Martin George <[email protected]>
1 parent 2aae5ce commit 6039466

2 files changed

Lines changed: 30 additions & 30 deletions

File tree

libnvme/src/nvme/tree.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,7 @@ int nvme_scan_topology(struct nvme_global_ctx *ctx, nvme_scan_filter_t f, void *
289289
ctrls.num = nvme_scan_ctrls(&ctrls.ents);
290290
if (ctrls.num < 0) {
291291
nvme_msg(ctx, LOG_DEBUG, "failed to scan ctrls: %s\n",
292-
strerror(ctrls.num));
292+
strerror(-ctrls.num));
293293
return ctrls.num;
294294
}
295295

@@ -307,7 +307,7 @@ int nvme_scan_topology(struct nvme_global_ctx *ctx, nvme_scan_filter_t f, void *
307307
subsys.num = nvme_scan_subsystems(&subsys.ents);
308308
if (subsys.num < 0) {
309309
nvme_msg(ctx, LOG_DEBUG, "failed to scan subsystems: %s\n",
310-
strerror(subsys.num));
310+
strerror(-subsys.num));
311311
return subsys.num;
312312
}
313313

@@ -840,7 +840,7 @@ static int nvme_subsystem_scan_namespaces(struct nvme_global_ctx *ctx, nvme_subs
840840
if (namespaces.num < 0) {
841841
nvme_msg(ctx, LOG_DEBUG,
842842
"failed to scan namespaces for subsys %s: %s\n",
843-
s->subsysnqn, strerror(namespaces.num));
843+
s->subsysnqn, strerror(-namespaces.num));
844844
return namespaces.num;
845845
}
846846

@@ -850,7 +850,7 @@ static int nvme_subsystem_scan_namespaces(struct nvme_global_ctx *ctx, nvme_subs
850850
if (ret < 0)
851851
nvme_msg(ctx, LOG_DEBUG,
852852
"failed to scan namespace %s: %s\n",
853-
namespaces.ents[i]->d_name, strerror(ret));
853+
namespaces.ents[i]->d_name, strerror(-ret));
854854
}
855855

856856
return 0;

nvme.c

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1711,7 +1711,7 @@ static int get_endurance_event_agg_log(int argc, char **argv,
17111711

17121712
err = nvme_identify_ctrl(hdl, ctrl);
17131713
if (err < 0) {
1714-
nvme_show_error("identify controller: %s", nvme_strerror(err));
1714+
nvme_show_error("identify controller: %s", nvme_strerror(-err));
17151715
return err;
17161716
} else if (err) {
17171717
nvme_show_error("could not identify controller");
@@ -2907,7 +2907,7 @@ static bool is_ns_mgmt_support(struct nvme_transport_handle *hdl)
29072907
static void ns_mgmt_show_status(struct nvme_transport_handle *hdl, int err, char *cmd, __u32 nsid)
29082908
{
29092909
if (err < 0) {
2910-
nvme_show_error("%s: %s", cmd, nvme_strerror(err));
2910+
nvme_show_error("%s: %s", cmd, nvme_strerror(-err));
29112911
return;
29122912
}
29132913

@@ -2965,7 +2965,7 @@ static int delete_ns(int argc, char **argv, struct command *acmd, struct plugin
29652965
if (!cfg.namespace_id) {
29662966
err = nvme_get_nsid(hdl, &cfg.namespace_id);
29672967
if (err < 0) {
2968-
nvme_show_error("get-namespace-id: %s", nvme_strerror(err));
2968+
nvme_show_error("get-namespace-id: %s", nvme_strerror(-err));
29692969
return err;
29702970
}
29712971
}
@@ -3536,7 +3536,7 @@ static int list(int argc, char **argv, struct command *acmd, struct plugin *plug
35363536
}
35373537
err = nvme_scan_topology(ctx, NULL, NULL);
35383538
if (err < 0) {
3539-
nvme_show_error("Failed to scan topology: %s", nvme_strerror(err));
3539+
nvme_show_error("Failed to scan topology: %s", nvme_strerror(-err));
35403540
return err;
35413541
}
35423542

@@ -3851,7 +3851,7 @@ static int ns_descs(int argc, char **argv, struct command *acmd, struct plugin *
38513851
if (!cfg.namespace_id) {
38523852
err = nvme_get_nsid(hdl, &cfg.namespace_id);
38533853
if (err < 0) {
3854-
nvme_show_error("get-namespace-id: %s", nvme_strerror(err));
3854+
nvme_show_error("get-namespace-id: %s", nvme_strerror(-err));
38553855
return err;
38563856
}
38573857
}
@@ -3932,7 +3932,7 @@ static int id_ns(int argc, char **argv, struct command *acmd, struct plugin *plu
39323932
if (!cfg.namespace_id) {
39333933
err = nvme_get_nsid(hdl, &cfg.namespace_id);
39343934
if (err < 0) {
3935-
nvme_show_error("get-namespace-id: %s", nvme_strerror(err));
3935+
nvme_show_error("get-namespace-id: %s", nvme_strerror(-err));
39363936
return err;
39373937
}
39383938
}
@@ -4314,7 +4314,7 @@ static int get_ns_id(int argc, char **argv, struct command *acmd, struct plugin
43144314

43154315
err = nvme_get_nsid(hdl, &nsid);
43164316
if (err < 0) {
4317-
nvme_show_error("get namespace ID: %s", nvme_strerror(err));
4317+
nvme_show_error("get namespace ID: %s", nvme_strerror(-err));
43184318
return -errno;
43194319
}
43204320

@@ -4940,7 +4940,7 @@ static int get_feature(int argc, char **argv, struct command *acmd,
49404940
err = nvme_get_nsid(hdl, &cfg.namespace_id);
49414941
if (err < 0) {
49424942
if (errno != ENOTTY) {
4943-
nvme_show_error("get-namespace-id: %s", nvme_strerror(err));
4943+
nvme_show_error("get-namespace-id: %s", nvme_strerror(-err));
49444944
return err;
49454945
}
49464946
cfg.namespace_id = NVME_NSID_ALL;
@@ -5354,7 +5354,7 @@ static int subsystem_reset(int argc, char **argv, struct command *acmd, struct p
53545354
if (errno == ENOTTY)
53555355
nvme_show_error("Subsystem-reset: NVM Subsystem Reset not supported.");
53565356
else
5357-
nvme_show_error("Subsystem-reset: %s", nvme_strerror(err));
5357+
nvme_show_error("Subsystem-reset: %s", nvme_strerror(-err));
53585358
} else if (argconfig_parse_seen(opts, "verbose"))
53595359
printf("resetting subsystem through %s\n", nvme_transport_handle_get_name(hdl));
53605360

@@ -5377,7 +5377,7 @@ static int reset(int argc, char **argv, struct command *acmd, struct plugin *plu
53775377

53785378
err = nvme_ctrl_reset(hdl);
53795379
if (err < 0)
5380-
nvme_show_error("Reset: %s", nvme_strerror(err));
5380+
nvme_show_error("Reset: %s", nvme_strerror(-err));
53815381
else if (argconfig_parse_seen(opts, "verbose"))
53825382
printf("resetting controller %s\n", nvme_transport_handle_get_name(hdl));
53835383

@@ -5407,7 +5407,7 @@ static int ns_rescan(int argc, char **argv, struct command *acmd, struct plugin
54075407

54085408
err = nvme_ns_rescan(hdl);
54095409
if (err < 0)
5410-
nvme_show_error("Namespace Rescan: %s\n", nvme_strerror(err));
5410+
nvme_show_error("Namespace Rescan: %s\n", nvme_strerror(-err));
54115411
else if (argconfig_parse_seen(opts, "verbose"))
54125412
printf("rescanning namespaces through %s\n", nvme_transport_handle_get_name(hdl));
54135413

@@ -6572,7 +6572,7 @@ static int format_cmd(int argc, char **argv, struct command *acmd, struct plugin
65726572
} else if (!cfg.namespace_id) {
65736573
err = nvme_get_nsid(hdl, &cfg.namespace_id);
65746574
if (err < 0) {
6575-
nvme_show_error("get-namespace-id: %s", nvme_strerror(err));
6575+
nvme_show_error("get-namespace-id: %s", nvme_strerror(-err));
65766576
return -errno;
65776577
}
65786578
}
@@ -6780,7 +6780,7 @@ static int set_feature(int argc, char **argv, struct command *acmd, struct plugi
67806780
err = nvme_get_nsid(hdl, &cfg.nsid);
67816781
if (err < 0) {
67826782
if (errno != ENOTTY) {
6783-
nvme_show_error("get-namespace-id: %s", nvme_strerror(err));
6783+
nvme_show_error("get-namespace-id: %s", nvme_strerror(-err));
67846784
return -errno;
67856785
}
67866786
cfg.nsid = NVME_NSID_ALL;
@@ -7142,7 +7142,7 @@ static int write_uncor(int argc, char **argv, struct command *acmd, struct plugi
71427142
if (!cfg.namespace_id) {
71437143
err = nvme_get_nsid(hdl, &cfg.namespace_id);
71447144
if (err < 0) {
7145-
nvme_show_error("get-namespace-id: %s", nvme_strerror(err));
7145+
nvme_show_error("get-namespace-id: %s", nvme_strerror(-err));
71467146
return err;
71477147
}
71487148
}
@@ -7415,7 +7415,7 @@ static int write_zeroes(int argc, char **argv,
74157415
if (!cfg.nsid) {
74167416
err = nvme_get_nsid(hdl, &cfg.nsid);
74177417
if (err < 0) {
7418-
nvme_show_error("get-namespace-id: %s", nvme_strerror(err));
7418+
nvme_show_error("get-namespace-id: %s", nvme_strerror(-err));
74197419
return err;
74207420
}
74217421
}
@@ -7535,7 +7535,7 @@ static int dsm(int argc, char **argv, struct command *acmd, struct plugin *plugi
75357535
if (!cfg.namespace_id) {
75367536
err = nvme_get_nsid(hdl, &cfg.namespace_id);
75377537
if (err < 0) {
7538-
nvme_show_error("get-namespace-id: %s", nvme_strerror(err));
7538+
nvme_show_error("get-namespace-id: %s", nvme_strerror(-err));
75397539
return err;
75407540
}
75417541
}
@@ -7735,7 +7735,7 @@ static int copy_cmd(int argc, char **argv, struct command *acmd, struct plugin *
77357735
if (!cfg.nsid) {
77367736
err = nvme_get_nsid(hdl, &cfg.nsid);
77377737
if (err < 0) {
7738-
nvme_show_error("get-namespace-id: %s", nvme_strerror(err));
7738+
nvme_show_error("get-namespace-id: %s", nvme_strerror(-err));
77397739
return err;
77407740
}
77417741
}
@@ -7815,7 +7815,7 @@ static int flush_cmd(int argc, char **argv, struct command *acmd, struct plugin
78157815
if (!cfg.namespace_id) {
78167816
err = nvme_get_nsid(hdl, &cfg.namespace_id);
78177817
if (err < 0) {
7818-
nvme_show_error("get-namespace-id: %s", nvme_strerror(err));
7818+
nvme_show_error("get-namespace-id: %s", nvme_strerror(-err));
78197819
return err;
78207820
}
78217821
}
@@ -7887,7 +7887,7 @@ static int resv_acquire(int argc, char **argv, struct command *acmd, struct plug
78877887
if (!cfg.namespace_id) {
78887888
err = nvme_get_nsid(hdl, &cfg.namespace_id);
78897889
if (err < 0) {
7890-
nvme_show_error("get-namespace-id: %s", nvme_strerror(err));
7890+
nvme_show_error("get-namespace-id: %s", nvme_strerror(-err));
78917891
return err;
78927892
}
78937893
}
@@ -7963,7 +7963,7 @@ static int resv_register(int argc, char **argv, struct command *acmd, struct plu
79637963
if (!cfg.namespace_id) {
79647964
err = nvme_get_nsid(hdl, &cfg.namespace_id);
79657965
if (err < 0) {
7966-
nvme_show_error("get-namespace-id: %s", nvme_strerror(err));
7966+
nvme_show_error("get-namespace-id: %s", nvme_strerror(-err));
79677967
return err;
79687968
}
79697969
}
@@ -8046,7 +8046,7 @@ static int resv_release(int argc, char **argv, struct command *acmd, struct plug
80468046
if (!cfg.nsid) {
80478047
err = nvme_get_nsid(hdl, &cfg.nsid);
80488048
if (err < 0) {
8049-
nvme_show_error("get-namespace-id: %s", nvme_strerror(err));
8049+
nvme_show_error("get-namespace-id: %s", nvme_strerror(-err));
80508050
return err;
80518051
}
80528052
}
@@ -8121,7 +8121,7 @@ static int resv_report(int argc, char **argv, struct command *acmd, struct plugi
81218121
if (!cfg.nsid) {
81228122
err = nvme_get_nsid(hdl, &cfg.nsid);
81238123
if (err < 0) {
8124-
nvme_show_error("get-namespace-id: %s", nvme_strerror(err));
8124+
nvme_show_error("get-namespace-id: %s", nvme_strerror(-err));
81258125
return err;
81268126
}
81278127
}
@@ -8308,7 +8308,7 @@ static int submit_io(int opcode, char *command, const char *desc, int argc, char
83088308
if (!cfg.nsid) {
83098309
err = nvme_get_nsid(hdl, &cfg.nsid);
83108310
if (err < 0) {
8311-
nvme_show_error("get-namespace-id: %s", nvme_strerror(err));
8311+
nvme_show_error("get-namespace-id: %s", nvme_strerror(-err));
83128312
return err;
83138313
}
83148314
}
@@ -8605,7 +8605,7 @@ static int verify_cmd(int argc, char **argv, struct command *acmd, struct plugin
86058605
if (!cfg.nsid) {
86068606
err = nvme_get_nsid(hdl, &cfg.nsid);
86078607
if (err < 0) {
8608-
nvme_show_error("get-namespace-id: %s", nvme_strerror(err));
8608+
nvme_show_error("get-namespace-id: %s", nvme_strerror(-err));
86098609
return err;
86108610
}
86118611
}
@@ -10126,7 +10126,7 @@ static int tls_key(int argc, char **argv, struct command *acmd, struct plugin *p
1012610126
err = nvme_scan_tls_keys(ctx, cfg.keyring, __scan_tls_key, fd);
1012710127
if (err < 0) {
1012810128
nvme_show_error("Export of TLS keys failed with '%s'",
10129-
nvme_strerror(err));
10129+
nvme_strerror(-err));
1013010130
return err;
1013110131
}
1013210132

@@ -10233,7 +10233,7 @@ static int show_topology_cmd(int argc, char **argv, struct command *acmd, struct
1023310233

1023410234
err = nvme_scan_topology(ctx, filter, (void *)devname);
1023510235
if (err < 0) {
10236-
nvme_show_error("Failed to scan topology: %s", nvme_strerror(err));
10236+
nvme_show_error("Failed to scan topology: %s", nvme_strerror(-err));
1023710237
return err;
1023810238
}
1023910239

0 commit comments

Comments
 (0)