Skip to content

Commit 9f3f0f5

Browse files
martin-gpyigaw
authored andcommitted
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 96e9ac2 commit 9f3f0f5

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
@@ -1714,7 +1714,7 @@ static int get_endurance_event_agg_log(int argc, char **argv,
17141714

17151715
err = nvme_identify_ctrl(hdl, ctrl);
17161716
if (err < 0) {
1717-
nvme_show_error("identify controller: %s", nvme_strerror(err));
1717+
nvme_show_error("identify controller: %s", nvme_strerror(-err));
17181718
return err;
17191719
} else if (err) {
17201720
nvme_show_error("could not identify controller");
@@ -2910,7 +2910,7 @@ static bool is_ns_mgmt_support(struct nvme_transport_handle *hdl)
29102910
static void ns_mgmt_show_status(struct nvme_transport_handle *hdl, int err, char *cmd, __u32 nsid)
29112911
{
29122912
if (err < 0) {
2913-
nvme_show_error("%s: %s", cmd, nvme_strerror(err));
2913+
nvme_show_error("%s: %s", cmd, nvme_strerror(-err));
29142914
return;
29152915
}
29162916

@@ -2968,7 +2968,7 @@ static int delete_ns(int argc, char **argv, struct command *acmd, struct plugin
29682968
if (!cfg.namespace_id) {
29692969
err = nvme_get_nsid(hdl, &cfg.namespace_id);
29702970
if (err < 0) {
2971-
nvme_show_error("get-namespace-id: %s", nvme_strerror(err));
2971+
nvme_show_error("get-namespace-id: %s", nvme_strerror(-err));
29722972
return err;
29732973
}
29742974
}
@@ -3539,7 +3539,7 @@ static int list(int argc, char **argv, struct command *acmd, struct plugin *plug
35393539
}
35403540
err = nvme_scan_topology(ctx, NULL, NULL);
35413541
if (err < 0) {
3542-
nvme_show_error("Failed to scan topology: %s", nvme_strerror(err));
3542+
nvme_show_error("Failed to scan topology: %s", nvme_strerror(-err));
35433543
return err;
35443544
}
35453545

@@ -3854,7 +3854,7 @@ static int ns_descs(int argc, char **argv, struct command *acmd, struct plugin *
38543854
if (!cfg.namespace_id) {
38553855
err = nvme_get_nsid(hdl, &cfg.namespace_id);
38563856
if (err < 0) {
3857-
nvme_show_error("get-namespace-id: %s", nvme_strerror(err));
3857+
nvme_show_error("get-namespace-id: %s", nvme_strerror(-err));
38583858
return err;
38593859
}
38603860
}
@@ -3935,7 +3935,7 @@ static int id_ns(int argc, char **argv, struct command *acmd, struct plugin *plu
39353935
if (!cfg.namespace_id) {
39363936
err = nvme_get_nsid(hdl, &cfg.namespace_id);
39373937
if (err < 0) {
3938-
nvme_show_error("get-namespace-id: %s", nvme_strerror(err));
3938+
nvme_show_error("get-namespace-id: %s", nvme_strerror(-err));
39393939
return err;
39403940
}
39413941
}
@@ -4317,7 +4317,7 @@ static int get_ns_id(int argc, char **argv, struct command *acmd, struct plugin
43174317

43184318
err = nvme_get_nsid(hdl, &nsid);
43194319
if (err < 0) {
4320-
nvme_show_error("get namespace ID: %s", nvme_strerror(err));
4320+
nvme_show_error("get namespace ID: %s", nvme_strerror(-err));
43214321
return -errno;
43224322
}
43234323

@@ -4943,7 +4943,7 @@ static int get_feature(int argc, char **argv, struct command *acmd,
49434943
err = nvme_get_nsid(hdl, &cfg.namespace_id);
49444944
if (err < 0) {
49454945
if (errno != ENOTTY) {
4946-
nvme_show_error("get-namespace-id: %s", nvme_strerror(err));
4946+
nvme_show_error("get-namespace-id: %s", nvme_strerror(-err));
49474947
return err;
49484948
}
49494949
cfg.namespace_id = NVME_NSID_ALL;
@@ -5362,7 +5362,7 @@ static int subsystem_reset(int argc, char **argv, struct command *acmd, struct p
53625362
if (errno == ENOTTY)
53635363
nvme_show_error("Subsystem-reset: NVM Subsystem Reset not supported.");
53645364
else
5365-
nvme_show_error("Subsystem-reset: %s", nvme_strerror(err));
5365+
nvme_show_error("Subsystem-reset: %s", nvme_strerror(-err));
53665366
} else if (argconfig_parse_seen(opts, "verbose"))
53675367
printf("resetting subsystem through %s\n", nvme_transport_handle_get_name(hdl));
53685368

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

53915391
err = nvme_ctrl_reset(hdl);
53925392
if (err < 0)
5393-
nvme_show_error("Reset: %s", nvme_strerror(err));
5393+
nvme_show_error("Reset: %s", nvme_strerror(-err));
53945394
else if (argconfig_parse_seen(opts, "verbose"))
53955395
printf("resetting controller %s\n", nvme_transport_handle_get_name(hdl));
53965396

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

54265426
err = nvme_ns_rescan(hdl);
54275427
if (err < 0)
5428-
nvme_show_error("Namespace Rescan: %s\n", nvme_strerror(err));
5428+
nvme_show_error("Namespace Rescan: %s\n", nvme_strerror(-err));
54295429
else if (argconfig_parse_seen(opts, "verbose"))
54305430
printf("rescanning namespaces through %s\n", nvme_transport_handle_get_name(hdl));
54315431

@@ -6590,7 +6590,7 @@ static int format_cmd(int argc, char **argv, struct command *acmd, struct plugin
65906590
} else if (!cfg.namespace_id) {
65916591
err = nvme_get_nsid(hdl, &cfg.namespace_id);
65926592
if (err < 0) {
6593-
nvme_show_error("get-namespace-id: %s", nvme_strerror(err));
6593+
nvme_show_error("get-namespace-id: %s", nvme_strerror(-err));
65946594
return -errno;
65956595
}
65966596
}
@@ -6798,7 +6798,7 @@ static int set_feature(int argc, char **argv, struct command *acmd, struct plugi
67986798
err = nvme_get_nsid(hdl, &cfg.nsid);
67996799
if (err < 0) {
68006800
if (errno != ENOTTY) {
6801-
nvme_show_error("get-namespace-id: %s", nvme_strerror(err));
6801+
nvme_show_error("get-namespace-id: %s", nvme_strerror(-err));
68026802
return -errno;
68036803
}
68046804
cfg.nsid = NVME_NSID_ALL;
@@ -7160,7 +7160,7 @@ static int write_uncor(int argc, char **argv, struct command *acmd, struct plugi
71607160
if (!cfg.namespace_id) {
71617161
err = nvme_get_nsid(hdl, &cfg.namespace_id);
71627162
if (err < 0) {
7163-
nvme_show_error("get-namespace-id: %s", nvme_strerror(err));
7163+
nvme_show_error("get-namespace-id: %s", nvme_strerror(-err));
71647164
return err;
71657165
}
71667166
}
@@ -7433,7 +7433,7 @@ static int write_zeroes(int argc, char **argv,
74337433
if (!cfg.nsid) {
74347434
err = nvme_get_nsid(hdl, &cfg.nsid);
74357435
if (err < 0) {
7436-
nvme_show_error("get-namespace-id: %s", nvme_strerror(err));
7436+
nvme_show_error("get-namespace-id: %s", nvme_strerror(-err));
74377437
return err;
74387438
}
74397439
}
@@ -7553,7 +7553,7 @@ static int dsm(int argc, char **argv, struct command *acmd, struct plugin *plugi
75537553
if (!cfg.namespace_id) {
75547554
err = nvme_get_nsid(hdl, &cfg.namespace_id);
75557555
if (err < 0) {
7556-
nvme_show_error("get-namespace-id: %s", nvme_strerror(err));
7556+
nvme_show_error("get-namespace-id: %s", nvme_strerror(-err));
75577557
return err;
75587558
}
75597559
}
@@ -7753,7 +7753,7 @@ static int copy_cmd(int argc, char **argv, struct command *acmd, struct plugin *
77537753
if (!cfg.nsid) {
77547754
err = nvme_get_nsid(hdl, &cfg.nsid);
77557755
if (err < 0) {
7756-
nvme_show_error("get-namespace-id: %s", nvme_strerror(err));
7756+
nvme_show_error("get-namespace-id: %s", nvme_strerror(-err));
77577757
return err;
77587758
}
77597759
}
@@ -7833,7 +7833,7 @@ static int flush_cmd(int argc, char **argv, struct command *acmd, struct plugin
78337833
if (!cfg.namespace_id) {
78347834
err = nvme_get_nsid(hdl, &cfg.namespace_id);
78357835
if (err < 0) {
7836-
nvme_show_error("get-namespace-id: %s", nvme_strerror(err));
7836+
nvme_show_error("get-namespace-id: %s", nvme_strerror(-err));
78377837
return err;
78387838
}
78397839
}
@@ -7905,7 +7905,7 @@ static int resv_acquire(int argc, char **argv, struct command *acmd, struct plug
79057905
if (!cfg.namespace_id) {
79067906
err = nvme_get_nsid(hdl, &cfg.namespace_id);
79077907
if (err < 0) {
7908-
nvme_show_error("get-namespace-id: %s", nvme_strerror(err));
7908+
nvme_show_error("get-namespace-id: %s", nvme_strerror(-err));
79097909
return err;
79107910
}
79117911
}
@@ -7981,7 +7981,7 @@ static int resv_register(int argc, char **argv, struct command *acmd, struct plu
79817981
if (!cfg.namespace_id) {
79827982
err = nvme_get_nsid(hdl, &cfg.namespace_id);
79837983
if (err < 0) {
7984-
nvme_show_error("get-namespace-id: %s", nvme_strerror(err));
7984+
nvme_show_error("get-namespace-id: %s", nvme_strerror(-err));
79857985
return err;
79867986
}
79877987
}
@@ -8064,7 +8064,7 @@ static int resv_release(int argc, char **argv, struct command *acmd, struct plug
80648064
if (!cfg.nsid) {
80658065
err = nvme_get_nsid(hdl, &cfg.nsid);
80668066
if (err < 0) {
8067-
nvme_show_error("get-namespace-id: %s", nvme_strerror(err));
8067+
nvme_show_error("get-namespace-id: %s", nvme_strerror(-err));
80688068
return err;
80698069
}
80708070
}
@@ -8139,7 +8139,7 @@ static int resv_report(int argc, char **argv, struct command *acmd, struct plugi
81398139
if (!cfg.nsid) {
81408140
err = nvme_get_nsid(hdl, &cfg.nsid);
81418141
if (err < 0) {
8142-
nvme_show_error("get-namespace-id: %s", nvme_strerror(err));
8142+
nvme_show_error("get-namespace-id: %s", nvme_strerror(-err));
81438143
return err;
81448144
}
81458145
}
@@ -8326,7 +8326,7 @@ static int submit_io(int opcode, char *command, const char *desc, int argc, char
83268326
if (!cfg.nsid) {
83278327
err = nvme_get_nsid(hdl, &cfg.nsid);
83288328
if (err < 0) {
8329-
nvme_show_error("get-namespace-id: %s", nvme_strerror(err));
8329+
nvme_show_error("get-namespace-id: %s", nvme_strerror(-err));
83308330
return err;
83318331
}
83328332
}
@@ -8623,7 +8623,7 @@ static int verify_cmd(int argc, char **argv, struct command *acmd, struct plugin
86238623
if (!cfg.nsid) {
86248624
err = nvme_get_nsid(hdl, &cfg.nsid);
86258625
if (err < 0) {
8626-
nvme_show_error("get-namespace-id: %s", nvme_strerror(err));
8626+
nvme_show_error("get-namespace-id: %s", nvme_strerror(-err));
86278627
return err;
86288628
}
86298629
}
@@ -10144,7 +10144,7 @@ static int tls_key(int argc, char **argv, struct command *acmd, struct plugin *p
1014410144
err = nvme_scan_tls_keys(ctx, cfg.keyring, __scan_tls_key, fd);
1014510145
if (err < 0) {
1014610146
nvme_show_error("Export of TLS keys failed with '%s'",
10147-
nvme_strerror(err));
10147+
nvme_strerror(-err));
1014810148
return err;
1014910149
}
1015010150

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

1025210252
err = nvme_scan_topology(ctx, filter, (void *)devname);
1025310253
if (err < 0) {
10254-
nvme_show_error("Failed to scan topology: %s", nvme_strerror(err));
10254+
nvme_show_error("Failed to scan topology: %s", nvme_strerror(-err));
1025510255
return err;
1025610256
}
1025710257

0 commit comments

Comments
 (0)