Commit 15d4dd35 authored by Uri Simchoni's avatar Uri Simchoni Committed by Herbert Xu

crypto: mv_cesa - Fix situations where the src sglist spans more data than the request asks for

Fix for situations where the source scatterlist spans more data than the
request nbytes
Signed-off-by: default avatarUri Simchoni <uri@jdland.co.il>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent f565e67e
...@@ -143,27 +143,45 @@ static int mv_setkey_aes(struct crypto_ablkcipher *cipher, const u8 *key, ...@@ -143,27 +143,45 @@ static int mv_setkey_aes(struct crypto_ablkcipher *cipher, const u8 *key,
return 0; return 0;
} }
static void setup_data_in(struct ablkcipher_request *req) static void copy_src_to_buf(struct req_progress *p, char *dbuf, int len)
{ {
int ret; int ret;
void *buf; void *sbuf;
int copied = 0;
if (!cpg->p.sg_src_left) {
ret = sg_miter_next(&cpg->p.src_sg_it);
BUG_ON(!ret);
cpg->p.sg_src_left = cpg->p.src_sg_it.length;
cpg->p.src_start = 0;
}
cpg->p.crypt_len = min(cpg->p.sg_src_left, cpg->max_req_size); while (1) {
if (!p->sg_src_left) {
buf = cpg->p.src_sg_it.addr; ret = sg_miter_next(&p->src_sg_it);
buf += cpg->p.src_start; BUG_ON(!ret);
p->sg_src_left = p->src_sg_it.length;
p->src_start = 0;
}
memcpy(cpg->sram + SRAM_DATA_IN_START, buf, cpg->p.crypt_len); sbuf = p->src_sg_it.addr + p->src_start;
if (p->sg_src_left <= len - copied) {
memcpy(dbuf + copied, sbuf, p->sg_src_left);
copied += p->sg_src_left;
p->sg_src_left = 0;
if (copied >= len)
break;
} else {
int copy_len = len - copied;
memcpy(dbuf + copied, sbuf, copy_len);
p->src_start += copy_len;
p->sg_src_left -= copy_len;
break;
}
}
}
cpg->p.sg_src_left -= cpg->p.crypt_len; static void setup_data_in(struct ablkcipher_request *req)
cpg->p.src_start += cpg->p.crypt_len; {
struct req_progress *p = &cpg->p;
p->crypt_len =
min((int)req->nbytes - p->total_req_bytes, cpg->max_req_size);
copy_src_to_buf(p, cpg->sram + SRAM_DATA_IN_START,
p->crypt_len);
} }
static void mv_process_current_q(int first_block) static void mv_process_current_q(int first_block)
...@@ -289,12 +307,16 @@ static void dequeue_complete_req(void) ...@@ -289,12 +307,16 @@ static void dequeue_complete_req(void)
static int count_sgs(struct scatterlist *sl, unsigned int total_bytes) static int count_sgs(struct scatterlist *sl, unsigned int total_bytes)
{ {
int i = 0; int i = 0;
size_t cur_len;
do {
total_bytes -= sl[i].length; while (1) {
i++; cur_len = sl[i].length;
++i;
} while (total_bytes > 0); if (total_bytes > cur_len)
total_bytes -= cur_len;
else
break;
}
return i; return i;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment