Skip to content

Commit 6267faa

Browse files
jk-ozlabsigaw
authored andcommitted
mi-mctp: Fix free() in error path of mi_open_mctp
If the malloc of our struct nvme_mi_transport_mctp fails, we'll attempt to free ->rsp_buf of this (now zero) pointer. Instead, structure the error path to progressively undo the initialisation operations. This means we'll need to save the errno at the site of each possible failure. In doing this, add a comment to the call to nvme_mi_close(), just to clarify behaviour with regards to the cleanups through that path. Reported-by: Barnabás Pőcze <[email protected]> Signed-off-by: Jeremy Kerr <[email protected]>
1 parent 3edef73 commit 6267faa

1 file changed

Lines changed: 18 additions & 9 deletions

File tree

src/nvme/mi-mctp.c

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -472,23 +472,29 @@ nvme_mi_ep_t nvme_mi_open_mctp(nvme_root_t root, unsigned int netid, __u8 eid)
472472
return NULL;
473473

474474
mctp = malloc(sizeof(*mctp));
475-
if (!mctp)
476-
goto err_free_ep;
475+
if (!mctp) {
476+
errno_save = errno;
477+
goto err_close_ep;
478+
}
477479

478480
memset(mctp, 0, sizeof(*mctp));
479481
mctp->sd = -1;
480482

481483
mctp->resp_buf_size = 4096;
482484
mctp->resp_buf = malloc(mctp->resp_buf_size);
483-
if (!mctp->resp_buf)
484-
goto err_free_ep;
485+
if (!mctp->resp_buf) {
486+
errno_save = errno;
487+
goto err_free_mctp;
488+
}
485489

486490
mctp->net = netid;
487491
mctp->eid = eid;
488492

489493
mctp->sd = ops.socket(AF_MCTP, SOCK_DGRAM, 0);
490-
if (mctp->sd < 0)
491-
goto err_free_ep;
494+
if (mctp->sd < 0) {
495+
errno_save = errno;
496+
goto err_free_rspbuf;
497+
}
492498

493499
ep->transport = &nvme_mi_transport_mctp;
494500
ep->transport_data = mctp;
@@ -504,11 +510,14 @@ nvme_mi_ep_t nvme_mi_open_mctp(nvme_root_t root, unsigned int netid, __u8 eid)
504510

505511
return ep;
506512

507-
err_free_ep:
508-
errno_save = errno;
509-
nvme_mi_close(ep);
513+
err_free_rspbuf:
510514
free(mctp->resp_buf);
515+
err_free_mctp:
511516
free(mctp);
517+
err_close_ep:
518+
/* the ep->transport is not set yet, so this will not call back
519+
* into nvme_mi_mctp_close() */
520+
nvme_mi_close(ep);
512521
errno = errno_save;
513522
return NULL;
514523
}

0 commit comments

Comments
 (0)