diff options
| author | Phil Sutter <phil.sutter@viprinet.com> | 2011-05-05 09:29:02 -0400 |
|---|---|---|
| committer | Herbert Xu <herbert@gondor.apana.org.au> | 2011-05-11 01:06:18 -0400 |
| commit | 6677a776cf3dc4950a790946f88d26dafc4baf7b (patch) | |
| tree | 7554959e21ad98344c8e150f71c3aade49fca233 /drivers/crypto | |
| parent | 7a1c6bcf269203485d716d8e3bec6671dabb5067 (diff) | |
crypto: mv_cesa - refactor copy_src_to_buf()
The main goal was to have it not do anything when a zero len parameter
was being passed (which could lead to a null pointer dereference, as in
this case p->src_sg is null, either). Using the min() macro, the lower
part of the loop gets simpler, too.
Signed-off-by: Phil Sutter <phil.sutter@viprinet.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'drivers/crypto')
| -rw-r--r-- | drivers/crypto/mv_cesa.c | 25 |
1 files changed, 10 insertions, 15 deletions
diff --git a/drivers/crypto/mv_cesa.c b/drivers/crypto/mv_cesa.c index fb3f1e35623d..de09303675d8 100644 --- a/drivers/crypto/mv_cesa.c +++ b/drivers/crypto/mv_cesa.c | |||
| @@ -187,9 +187,9 @@ static void copy_src_to_buf(struct req_progress *p, char *dbuf, int len) | |||
| 187 | { | 187 | { |
| 188 | int ret; | 188 | int ret; |
| 189 | void *sbuf; | 189 | void *sbuf; |
| 190 | int copied = 0; | 190 | int copy_len; |
| 191 | 191 | ||
| 192 | while (1) { | 192 | while (len) { |
| 193 | if (!p->sg_src_left) { | 193 | if (!p->sg_src_left) { |
| 194 | ret = sg_miter_next(&p->src_sg_it); | 194 | ret = sg_miter_next(&p->src_sg_it); |
| 195 | BUG_ON(!ret); | 195 | BUG_ON(!ret); |
| @@ -199,19 +199,14 @@ static void copy_src_to_buf(struct req_progress *p, char *dbuf, int len) | |||
| 199 | 199 | ||
| 200 | sbuf = p->src_sg_it.addr + p->src_start; | 200 | sbuf = p->src_sg_it.addr + p->src_start; |
| 201 | 201 | ||
| 202 | if (p->sg_src_left <= len - copied) { | 202 | copy_len = min(p->sg_src_left, len); |
| 203 | memcpy(dbuf + copied, sbuf, p->sg_src_left); | 203 | memcpy(dbuf, sbuf, copy_len); |
| 204 | copied += p->sg_src_left; | 204 | |
| 205 | p->sg_src_left = 0; | 205 | p->src_start += copy_len; |
| 206 | if (copied >= len) | 206 | p->sg_src_left -= copy_len; |
| 207 | break; | 207 | |
| 208 | } else { | 208 | len -= copy_len; |
| 209 | int copy_len = len - copied; | 209 | dbuf += copy_len; |
| 210 | memcpy(dbuf + copied, sbuf, copy_len); | ||
| 211 | p->src_start += copy_len; | ||
| 212 | p->sg_src_left -= copy_len; | ||
| 213 | break; | ||
| 214 | } | ||
| 215 | } | 210 | } |
| 216 | } | 211 | } |
| 217 | 212 | ||
