diff options
Diffstat (limited to 'lib/mpi/mpicoder.c')
| -rw-r--r-- | lib/mpi/mpicoder.c | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/lib/mpi/mpicoder.c b/lib/mpi/mpicoder.c index 3db76b8c1115..ec533a6c77b5 100644 --- a/lib/mpi/mpicoder.c +++ b/lib/mpi/mpicoder.c | |||
| @@ -135,7 +135,9 @@ EXPORT_SYMBOL_GPL(mpi_read_from_buffer); | |||
| 135 | * @buf: bufer to which the output will be written to. Needs to be at | 135 | * @buf: bufer to which the output will be written to. Needs to be at |
| 136 | * leaset mpi_get_size(a) long. | 136 | * leaset mpi_get_size(a) long. |
| 137 | * @buf_len: size of the buf. | 137 | * @buf_len: size of the buf. |
| 138 | * @nbytes: receives the actual length of the data written. | 138 | * @nbytes: receives the actual length of the data written on success and |
| 139 | * the data to-be-written on -EOVERFLOW in case buf_len was too | ||
| 140 | * small. | ||
| 139 | * @sign: if not NULL, it will be set to the sign of a. | 141 | * @sign: if not NULL, it will be set to the sign of a. |
| 140 | * | 142 | * |
| 141 | * Return: 0 on success or error code in case of error | 143 | * Return: 0 on success or error code in case of error |
| @@ -148,7 +150,7 @@ int mpi_read_buffer(MPI a, uint8_t *buf, unsigned buf_len, unsigned *nbytes, | |||
| 148 | unsigned int n = mpi_get_size(a); | 150 | unsigned int n = mpi_get_size(a); |
| 149 | int i, lzeros = 0; | 151 | int i, lzeros = 0; |
| 150 | 152 | ||
| 151 | if (buf_len < n || !buf || !nbytes) | 153 | if (!buf || !nbytes) |
| 152 | return -EINVAL; | 154 | return -EINVAL; |
| 153 | 155 | ||
| 154 | if (sign) | 156 | if (sign) |
| @@ -163,6 +165,11 @@ int mpi_read_buffer(MPI a, uint8_t *buf, unsigned buf_len, unsigned *nbytes, | |||
| 163 | break; | 165 | break; |
| 164 | } | 166 | } |
| 165 | 167 | ||
| 168 | if (buf_len < n - lzeros) { | ||
| 169 | *nbytes = n - lzeros; | ||
| 170 | return -EOVERFLOW; | ||
| 171 | } | ||
| 172 | |||
| 166 | p = buf; | 173 | p = buf; |
| 167 | *nbytes = n - lzeros; | 174 | *nbytes = n - lzeros; |
| 168 | 175 | ||
| @@ -332,7 +339,8 @@ EXPORT_SYMBOL_GPL(mpi_set_buffer); | |||
| 332 | * @nbytes: in/out param - it has the be set to the maximum number of | 339 | * @nbytes: in/out param - it has the be set to the maximum number of |
| 333 | * bytes that can be written to sgl. This has to be at least | 340 | * bytes that can be written to sgl. This has to be at least |
| 334 | * the size of the integer a. On return it receives the actual | 341 | * the size of the integer a. On return it receives the actual |
| 335 | * length of the data written. | 342 | * length of the data written on success or the data that would |
| 343 | * be written if buffer was too small. | ||
| 336 | * @sign: if not NULL, it will be set to the sign of a. | 344 | * @sign: if not NULL, it will be set to the sign of a. |
| 337 | * | 345 | * |
| 338 | * Return: 0 on success or error code in case of error | 346 | * Return: 0 on success or error code in case of error |
| @@ -345,7 +353,7 @@ int mpi_write_to_sgl(MPI a, struct scatterlist *sgl, unsigned *nbytes, | |||
| 345 | unsigned int n = mpi_get_size(a); | 353 | unsigned int n = mpi_get_size(a); |
| 346 | int i, x, y = 0, lzeros = 0, buf_len; | 354 | int i, x, y = 0, lzeros = 0, buf_len; |
| 347 | 355 | ||
| 348 | if (!nbytes || *nbytes < n) | 356 | if (!nbytes) |
| 349 | return -EINVAL; | 357 | return -EINVAL; |
| 350 | 358 | ||
| 351 | if (sign) | 359 | if (sign) |
| @@ -360,6 +368,11 @@ int mpi_write_to_sgl(MPI a, struct scatterlist *sgl, unsigned *nbytes, | |||
| 360 | break; | 368 | break; |
| 361 | } | 369 | } |
| 362 | 370 | ||
| 371 | if (*nbytes < n - lzeros) { | ||
| 372 | *nbytes = n - lzeros; | ||
| 373 | return -EOVERFLOW; | ||
| 374 | } | ||
| 375 | |||
| 363 | *nbytes = n - lzeros; | 376 | *nbytes = n - lzeros; |
| 364 | buf_len = sgl->length; | 377 | buf_len = sgl->length; |
| 365 | p2 = sg_virt(sgl); | 378 | p2 = sg_virt(sgl); |
