[PATCH v2] scsi: scsi_debug: fix one-partition tape setup bounds
From: Samuel Moelius
Date: Wed Jun 03 2026 - 20:00:35 EST
The tape setup path writes partition metadata one element past the
allocated tape_blocks array when a one-partition configuration is
selected.
That corrupts adjacent state during device initialization before any
command is issued.
Reject a declared multi-partition layout that has no space for partition
1, and initialize partition 1's marker only when partition 1 exists.
Assisted-by: Codex:gpt-5.5-cyber-preview
Signed-off-by: Samuel Moelius <sam.moelius@xxxxxxxxxxxxxxx>
---
Changes in v2
- Fixed handling of part_1_size == 0 case
drivers/scsi/scsi_debug.c | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)
diff --git a/drivers/scsi/scsi_debug.c b/drivers/scsi/scsi_debug.c
index 1515495fd9ea..edcc2f5f6977 100644
--- a/drivers/scsi/scsi_debug.c
+++ b/drivers/scsi/scsi_debug.c
@@ -3661,12 +3661,18 @@ static int partition_tape(struct sdebug_dev_info *devip, int nbr_partitions,
if (part_0_size + part_1_size > TAPE_UNITS)
return -1;
+ if (nbr_partitions > 1 && part_1_size <= 0)
+ return -1;
devip->tape_eop[0] = part_0_size;
devip->tape_blocks[0]->fl_size = TAPE_BLOCK_EOD_FLAG;
devip->tape_eop[1] = part_1_size;
- devip->tape_blocks[1] = devip->tape_blocks[0] +
- devip->tape_eop[0];
- devip->tape_blocks[1]->fl_size = TAPE_BLOCK_EOD_FLAG;
+ if (nbr_partitions > 1) {
+ devip->tape_blocks[1] = devip->tape_blocks[0] +
+ devip->tape_eop[0];
+ devip->tape_blocks[1]->fl_size = TAPE_BLOCK_EOD_FLAG;
+ } else {
+ devip->tape_blocks[1] = NULL;
+ }
for (i = 0 ; i < TAPE_MAX_PARTITIONS; i++)
devip->tape_location[i] = 0;
--
2.43.0