bdev/nvme: Fix memory leak of command in apply firmware RPC
The command can be allocated on the stack safely instead. Change-Id: Iab412e91c1a06f80f1d86d7f9a6d88be2a759b09 Signed-off-by: Ben Walker <benjamin.walker@intel.com> Reviewed-on: https://review.gerrithub.io/406859 Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com> Tested-by: SPDK Automated Test System <sys_sgsw@intel.com> Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
This commit is contained in:
parent
a4d6e5cf90
commit
ddde2c74f2
@ -251,7 +251,7 @@ apply_firmware_complete_reset(struct spdk_bdev_io *bdev_io, bool success, void *
|
|||||||
static void
|
static void
|
||||||
apply_firmware_complete(struct spdk_bdev_io *bdev_io, bool success, void *cb_arg)
|
apply_firmware_complete(struct spdk_bdev_io *bdev_io, bool success, void *cb_arg)
|
||||||
{
|
{
|
||||||
struct spdk_nvme_cmd *cmd;
|
struct spdk_nvme_cmd cmd = {};
|
||||||
struct spdk_nvme_fw_commit fw_commit;
|
struct spdk_nvme_fw_commit fw_commit;
|
||||||
int slot = 0;
|
int slot = 0;
|
||||||
int rc;
|
int rc;
|
||||||
@ -270,16 +270,6 @@ apply_firmware_complete(struct spdk_bdev_io *bdev_io, bool success, void *cb_arg
|
|||||||
firm_ctx->offset += firm_ctx->transfer;
|
firm_ctx->offset += firm_ctx->transfer;
|
||||||
firm_ctx->size_remaining -= firm_ctx->transfer;
|
firm_ctx->size_remaining -= firm_ctx->transfer;
|
||||||
|
|
||||||
cmd = malloc(sizeof(struct spdk_nvme_cmd));
|
|
||||||
if (!cmd) {
|
|
||||||
spdk_jsonrpc_send_error_response(firm_ctx->request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR,
|
|
||||||
"malloc failed.");
|
|
||||||
spdk_bdev_free_io(bdev_io);
|
|
||||||
apply_firmware_cleanup(firm_ctx);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
memset(cmd, 0, sizeof(struct spdk_nvme_cmd));
|
|
||||||
|
|
||||||
switch (firm_ctx->size_remaining) {
|
switch (firm_ctx->size_remaining) {
|
||||||
case 0:
|
case 0:
|
||||||
/* firmware download completed. Commit firmware */
|
/* firmware download completed. Commit firmware */
|
||||||
@ -287,9 +277,9 @@ apply_firmware_complete(struct spdk_bdev_io *bdev_io, bool success, void *cb_arg
|
|||||||
fw_commit.fs = slot;
|
fw_commit.fs = slot;
|
||||||
fw_commit.ca = commit_action;
|
fw_commit.ca = commit_action;
|
||||||
|
|
||||||
cmd->opc = SPDK_NVME_OPC_FIRMWARE_COMMIT;
|
cmd.opc = SPDK_NVME_OPC_FIRMWARE_COMMIT;
|
||||||
memcpy(&cmd->cdw10, &fw_commit, sizeof(uint32_t));
|
memcpy(&cmd.cdw10, &fw_commit, sizeof(uint32_t));
|
||||||
rc = spdk_bdev_nvme_admin_passthru(firm_ctx->desc, firm_ctx->ch, cmd, NULL, 0,
|
rc = spdk_bdev_nvme_admin_passthru(firm_ctx->desc, firm_ctx->ch, &cmd, NULL, 0,
|
||||||
apply_firmware_complete_reset, firm_ctx);
|
apply_firmware_complete_reset, firm_ctx);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
spdk_jsonrpc_send_error_response(firm_ctx->request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR,
|
spdk_jsonrpc_send_error_response(firm_ctx->request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR,
|
||||||
@ -301,11 +291,11 @@ apply_firmware_complete(struct spdk_bdev_io *bdev_io, bool success, void *cb_arg
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
firm_ctx->transfer = spdk_min(firm_ctx->size_remaining, 4096);
|
firm_ctx->transfer = spdk_min(firm_ctx->size_remaining, 4096);
|
||||||
cmd->opc = SPDK_NVME_OPC_FIRMWARE_IMAGE_DOWNLOAD;
|
cmd.opc = SPDK_NVME_OPC_FIRMWARE_IMAGE_DOWNLOAD;
|
||||||
|
|
||||||
cmd->cdw10 = (firm_ctx->transfer >> 2) - 1;
|
cmd.cdw10 = (firm_ctx->transfer >> 2) - 1;
|
||||||
cmd->cdw11 = firm_ctx->offset >> 2;
|
cmd.cdw11 = firm_ctx->offset >> 2;
|
||||||
rc = spdk_bdev_nvme_admin_passthru(firm_ctx->desc, firm_ctx->ch, cmd, firm_ctx->p,
|
rc = spdk_bdev_nvme_admin_passthru(firm_ctx->desc, firm_ctx->ch, &cmd, firm_ctx->p,
|
||||||
firm_ctx->transfer, apply_firmware_complete, firm_ctx);
|
firm_ctx->transfer, apply_firmware_complete, firm_ctx);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
spdk_jsonrpc_send_error_response(firm_ctx->request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR,
|
spdk_jsonrpc_send_error_response(firm_ctx->request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR,
|
||||||
|
Loading…
Reference in New Issue
Block a user