Commit bbf344e54ed9a76e344d08feedc70ab2c5a8a64c

Authored by Hannes Reinecke
Committed by Nicholas Bellinger
1 parent 1b7f390eb3

target_core_rd: break out unterminated loop during copy

The loop in rd_execute_rw() will never terminate if the
sg element has a zero size. Or it'll spill over into
outer space if the sg element is larger than the available
space.
So we need to add some safety catches here.

Cc: Nic Bellinger <nab@risingtidesystems.com>
Signed-off-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>

Showing 1 changed file with 12 additions and 0 deletions Side-by-side Diff

drivers/target/target_core_rd.c
... ... @@ -316,7 +316,19 @@
316 316 void *rd_addr;
317 317  
318 318 sg_miter_next(&m);
  319 + if (!(u32)m.length) {
  320 + pr_debug("RD[%u]: invalid sgl %p len %zu\n",
  321 + dev->rd_dev_id, m.addr, m.length);
  322 + sg_miter_stop(&m);
  323 + return TCM_INCORRECT_AMOUNT_OF_DATA;
  324 + }
319 325 len = min((u32)m.length, src_len);
  326 + if (len > rd_size) {
  327 + pr_debug("RD[%u]: size underrun page %d offset %d "
  328 + "size %d\n", dev->rd_dev_id,
  329 + rd_page, rd_offset, rd_size);
  330 + len = rd_size;
  331 + }
320 332 m.consumed = len;
321 333  
322 334 rd_addr = sg_virt(rd_sg) + rd_offset;