qemu-io: Handle create_iovec errors
Callers of create_iovec() didn't check for failure and continued with uninitialised data in error cases. This patch adds checks to each call. Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
932eacc158
commit
f2360620fb
28
qemu-io.c
28
qemu-io.c
@ -596,6 +596,9 @@ static int readv_f(int argc, char **argv)
|
|||||||
|
|
||||||
nr_iov = argc - optind;
|
nr_iov = argc - optind;
|
||||||
buf = create_iovec(&qiov, &argv[optind], nr_iov, 0xab);
|
buf = create_iovec(&qiov, &argv[optind], nr_iov, 0xab);
|
||||||
|
if (buf == NULL) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
gettimeofday(&t1, NULL);
|
gettimeofday(&t1, NULL);
|
||||||
cnt = do_aio_readv(&qiov, offset, &total);
|
cnt = do_aio_readv(&qiov, offset, &total);
|
||||||
@ -850,6 +853,9 @@ static int writev_f(int argc, char **argv)
|
|||||||
|
|
||||||
nr_iov = argc - optind;
|
nr_iov = argc - optind;
|
||||||
buf = create_iovec(&qiov, &argv[optind], nr_iov, pattern);
|
buf = create_iovec(&qiov, &argv[optind], nr_iov, pattern);
|
||||||
|
if (buf == NULL) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
gettimeofday(&t1, NULL);
|
gettimeofday(&t1, NULL);
|
||||||
cnt = do_aio_writev(&qiov, offset, &total);
|
cnt = do_aio_writev(&qiov, offset, &total);
|
||||||
@ -950,8 +956,8 @@ static int multiwrite_f(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
reqs = g_malloc(nr_reqs * sizeof(*reqs));
|
reqs = g_malloc0(nr_reqs * sizeof(*reqs));
|
||||||
buf = g_malloc(nr_reqs * sizeof(*buf));
|
buf = g_malloc0(nr_reqs * sizeof(*buf));
|
||||||
qiovs = g_malloc(nr_reqs * sizeof(*qiovs));
|
qiovs = g_malloc(nr_reqs * sizeof(*qiovs));
|
||||||
|
|
||||||
for (i = 0; i < nr_reqs; i++) {
|
for (i = 0; i < nr_reqs; i++) {
|
||||||
@ -985,8 +991,12 @@ static int multiwrite_f(int argc, char **argv)
|
|||||||
nr_iov = j - optind;
|
nr_iov = j - optind;
|
||||||
|
|
||||||
/* Build request */
|
/* Build request */
|
||||||
|
buf[i] = create_iovec(&qiovs[i], &argv[optind], nr_iov, pattern);
|
||||||
|
if (buf[i] == NULL) {
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
reqs[i].qiov = &qiovs[i];
|
reqs[i].qiov = &qiovs[i];
|
||||||
buf[i] = create_iovec(reqs[i].qiov, &argv[optind], nr_iov, pattern);
|
|
||||||
reqs[i].sector = offset >> 9;
|
reqs[i].sector = offset >> 9;
|
||||||
reqs[i].nb_sectors = reqs[i].qiov->size >> 9;
|
reqs[i].nb_sectors = reqs[i].qiov->size >> 9;
|
||||||
|
|
||||||
@ -1014,7 +1024,9 @@ static int multiwrite_f(int argc, char **argv)
|
|||||||
out:
|
out:
|
||||||
for (i = 0; i < nr_reqs; i++) {
|
for (i = 0; i < nr_reqs; i++) {
|
||||||
qemu_io_free(buf[i]);
|
qemu_io_free(buf[i]);
|
||||||
qemu_iovec_destroy(&qiovs[i]);
|
if (reqs[i].qiov != NULL) {
|
||||||
|
qemu_iovec_destroy(&qiovs[i]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
g_free(buf);
|
g_free(buf);
|
||||||
g_free(reqs);
|
g_free(reqs);
|
||||||
@ -1185,6 +1197,10 @@ static int aio_read_f(int argc, char **argv)
|
|||||||
|
|
||||||
nr_iov = argc - optind;
|
nr_iov = argc - optind;
|
||||||
ctx->buf = create_iovec(&ctx->qiov, &argv[optind], nr_iov, 0xab);
|
ctx->buf = create_iovec(&ctx->qiov, &argv[optind], nr_iov, 0xab);
|
||||||
|
if (ctx->buf == NULL) {
|
||||||
|
free(ctx);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
gettimeofday(&ctx->t1, NULL);
|
gettimeofday(&ctx->t1, NULL);
|
||||||
acb = bdrv_aio_readv(bs, ctx->offset >> 9, &ctx->qiov,
|
acb = bdrv_aio_readv(bs, ctx->offset >> 9, &ctx->qiov,
|
||||||
@ -1280,6 +1296,10 @@ static int aio_write_f(int argc, char **argv)
|
|||||||
|
|
||||||
nr_iov = argc - optind;
|
nr_iov = argc - optind;
|
||||||
ctx->buf = create_iovec(&ctx->qiov, &argv[optind], nr_iov, pattern);
|
ctx->buf = create_iovec(&ctx->qiov, &argv[optind], nr_iov, pattern);
|
||||||
|
if (ctx->buf == NULL) {
|
||||||
|
free(ctx);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
gettimeofday(&ctx->t1, NULL);
|
gettimeofday(&ctx->t1, NULL);
|
||||||
acb = bdrv_aio_writev(bs, ctx->offset >> 9, &ctx->qiov,
|
acb = bdrv_aio_writev(bs, ctx->offset >> 9, &ctx->qiov,
|
||||||
|
Loading…
Reference in New Issue
Block a user