Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8f27d487 authored by Asias He's avatar Asias He Committed by Nicholas Bellinger
Browse files

target/pscsi: Reject cross page boundary case in pscsi_map_sg



We can only have one page of data in each sg element, so we can not
cross a page boundary. Fail this case.

The 'while (len > 0 && data_len > 0) {}' loop is not necessary. The loop
can only be executed once.

Signed-off-by: default avatarAsias He <asias@redhat.com>
Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
parent f002a243
Loading
Loading
Loading
Loading
+8 −3
Original line number Original line Diff line number Diff line
@@ -883,7 +883,14 @@ pscsi_map_sg(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents,
		pr_debug("PSCSI: i: %d page: %p len: %d off: %d\n", i,
		pr_debug("PSCSI: i: %d page: %p len: %d off: %d\n", i,
			page, len, off);
			page, len, off);


		while (len > 0 && data_len > 0) {
		/*
		 * We only have one page of data in each sg element,
		 * we can not cross a page boundary.
		 */
		if (off + len > PAGE_SIZE)
			goto fail;

		if (len > 0 && data_len > 0) {
			bytes = min_t(unsigned int, len, PAGE_SIZE - off);
			bytes = min_t(unsigned int, len, PAGE_SIZE - off);
			bytes = min(bytes, data_len);
			bytes = min(bytes, data_len);


@@ -940,9 +947,7 @@ pscsi_map_sg(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents,
				bio = NULL;
				bio = NULL;
			}
			}


			len -= bytes;
			data_len -= bytes;
			data_len -= bytes;
			off = 0;
		}
		}
	}
	}