From: Jens Axboe Date: Tue, 7 Nov 2006 13:02:48 +0000 (+0100) Subject: [PATCH] Missing memset and free-on-error in io engines X-Git-Tag: fio-1.9~3 X-Git-Url: https://git.kernel.dk/?p=fio.git;a=commitdiff_plain;h=cb781c758e5df7ff4c6f655c1e4f9df3043a4be9;hp=3c9b60c1fb144950ca51220ffa18f485672c3ba6 [PATCH] Missing memset and free-on-error in io engines Signed-off-by: Jens Axboe --- diff --git a/engines/fio-engine-libaio.c b/engines/fio-engine-libaio.c index c0f280b5..12ddc98b 100644 --- a/engines/fio-engine-libaio.c +++ b/engines/fio-engine-libaio.c @@ -120,6 +120,7 @@ static int fio_libaio_init(struct thread_data *td) memset(ld, 0, sizeof(*ld)); if (io_queue_init(td->iodepth, &ld->aio_ctx)) { td_verror(td, errno); + free(ld); return 1; } diff --git a/engines/fio-engine-posixaio.c b/engines/fio-engine-posixaio.c index 401cd866..894a410a 100644 --- a/engines/fio-engine-posixaio.c +++ b/engines/fio-engine-posixaio.c @@ -171,7 +171,9 @@ static int fio_posixaio_init(struct thread_data *td) { struct posixaio_data *pd = malloc(sizeof(*pd)); + memset(pd, 0, sizeof(*pd)); pd->aio_events = malloc(td->iodepth * sizeof(struct io_u *)); + memset(pd->aio_events, 0, td->iodepth * sizeof(struct io_u *)); td->io_ops->data = pd; return 0; diff --git a/engines/fio-engine-sg.c b/engines/fio-engine-sg.c index fafc3269..2762e0ba 100644 --- a/engines/fio-engine-sg.c +++ b/engines/fio-engine-sg.c @@ -266,29 +266,32 @@ static int fio_sgio_init(struct thread_data *td) int ret; sd = malloc(sizeof(*sd)); + memset(sd, 0, sizeof(*sd)); sd->cmds = malloc(td->iodepth * sizeof(struct sgio_cmd)); + memset(sd->cmds, 0, td->iodepth * sizeof(struct sgio_cmd)); sd->events = malloc(td->iodepth * sizeof(struct io_u *)); + memset(sd->events, 0, td->iodepth * sizeof(struct io_u *)); td->io_ops->data = sd; if (td->filetype == FIO_TYPE_BD) { if (ioctl(f->fd, BLKSSZGET, &bs) < 0) { td_verror(td, errno); - return 1; + goto err; } } else if (td->filetype == FIO_TYPE_CHAR) { int version; if (ioctl(f->fd, SG_GET_VERSION_NUM, &version) < 0) { td_verror(td, errno); - return 1; + goto err; } ret = fio_sgio_get_bs(td, &bs); if (ret) - return ret; + goto err; } else { log_err("ioengine sgio only works on block devices\n"); - return 1; + goto err; } sd->bs = bs; @@ -303,6 +306,11 @@ static int fio_sgio_init(struct thread_data *td) */ td->override_sync = 1; return 0; +err: + free(sd->events); + free(sd->cmds); + free(sd); + return 1; } struct ioengine_ops ioengine = {