diff options
author | Dmitry Fomichev <dmitry.fomichev@wdc.com> | 2021-01-27 13:19:15 +0900 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2021-01-29 08:14:00 -0700 |
commit | 6c3f1cc187103675f65eecd2eba1535df5cd59ec (patch) | |
tree | e5948e7e39f4f9b883b8a25e4ecaf808531d0290 | |
parent | 8a866de7a310691ec9a93417225c9ff8d375bf16 (diff) | |
download | fio-6c3f1cc187103675f65eecd2eba1535df5cd59ec.tar.gz fio-6c3f1cc187103675f65eecd2eba1535df5cd59ec.tar.bz2 |
zbd: avoid zone buffer overrun
If the total number of zones on a drive is calculated to a value that
is less than the number of zones it can actually report, zone info
buffer can be overrun. This may happen not only due to drive firmware
problems, but also because of underlying software incorrectly
reporting zoned device capacity.
Fix this by more carefully setting zone report size.
Signed-off-by: Dmitry Fomichev <dmitry.fomichev@wdc.com>
Reviewed-by: Shin'ichiro Kawasaki <shinichiro.kawasaki@wdc.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
-rw-r--r-- | zbd.c | 5 |
1 files changed, 3 insertions, 2 deletions
@@ -526,8 +526,9 @@ static int parse_zone_info(struct thread_data *td, struct fio_file *f) offset = z->start + z->len; if (j >= nr_zones) break; - nrz = zbd_report_zones(td, f, offset, - zones, ZBD_REPORT_MAX_ZONES); + nrz = zbd_report_zones(td, f, offset, zones, + min((uint32_t)(nr_zones - j), + ZBD_REPORT_MAX_ZONES)); if (nrz < 0) { ret = nrz; log_info("fio: report zones (offset %llu) failed for %s (%d).\n", |