projects
/
openssl.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Add explanatory comment about fitting into a size_t.
[openssl.git]
/
crypto
/
evp
/
pbe_scrypt.c
diff --git
a/crypto/evp/pbe_scrypt.c
b/crypto/evp/pbe_scrypt.c
index a52cd751f6fd846acee71e8a725ffa837c3fba93..b30e6d571998f41e9208d51a53247f54e964e89e 100644
(file)
--- a/
crypto/evp/pbe_scrypt.c
+++ b/
crypto/evp/pbe_scrypt.c
@@
-164,7
+164,6
@@
int EVP_PBE_scrypt(const char *pass, size_t passlen,
unsigned char *B;
uint32_t *X, *V, *T;
uint64_t i, Blen, Vlen;
unsigned char *B;
uint32_t *X, *V, *T;
uint64_t i, Blen, Vlen;
- size_t allocsize;
/* Sanity check parameters */
/* initial check, r,p must be non zero, N >= 2 and a power of 2 */
/* Sanity check parameters */
/* initial check, r,p must be non zero, N >= 2 and a power of 2 */
@@
-194,8
+193,7
@@
int EVP_PBE_scrypt(const char *pass, size_t passlen,
Blen = p * 128 * r;
/*
Blen = p * 128 * r;
/*
- * Check 32 * r * (N + 2) * sizeof(uint32_t) fits in
- * uint64_t and also size_t (their sizes are unrelated).
+ * Check 32 * r * (N + 2) * sizeof(uint32_t) fits in uint64_t
* This is combined size V, X and T (section 4)
*/
i = UINT64_MAX / (32 * sizeof(uint32_t));
* This is combined size V, X and T (section 4)
*/
i = UINT64_MAX / (32 * sizeof(uint32_t));
@@
-206,16
+204,15
@@
int EVP_PBE_scrypt(const char *pass, size_t passlen,
/* check total allocated size fits in uint64_t */
if (Blen > UINT64_MAX - Vlen)
return 0;
/* check total allocated size fits in uint64_t */
if (Blen > UINT64_MAX - Vlen)
return 0;
- /* check total allocated size fits in size_t */
- if (Blen > SIZE_MAX - Vlen)
- return 0;
-
- allocsize = (size_t)(Blen + Vlen);
if (maxmem == 0)
maxmem = SCRYPT_MAX_MEM;
if (maxmem == 0)
maxmem = SCRYPT_MAX_MEM;
- if (allocsize > maxmem) {
+ /* Check that the maximum memory doesn't exceed a size_t limits */
+ if (maxmem > SIZE_MAX)
+ maxmem = SIZE_MAX;
+
+ if (Blen + Vlen > maxmem) {
EVPerr(EVP_F_EVP_PBE_SCRYPT, EVP_R_MEMORY_LIMIT_EXCEEDED);
return 0;
}
EVPerr(EVP_F_EVP_PBE_SCRYPT, EVP_R_MEMORY_LIMIT_EXCEEDED);
return 0;
}
@@
-224,7
+221,7
@@
int EVP_PBE_scrypt(const char *pass, size_t passlen,
if (key == NULL)
return 1;
if (key == NULL)
return 1;
- B = OPENSSL_malloc(
allocsize
);
+ B = OPENSSL_malloc(
Blen + Vlen
);
if (B == NULL)
return 0;
X = (uint32_t *)(B + Blen);
if (B == NULL)
return 0;
X = (uint32_t *)(B + Blen);
@@
-242,7
+239,7
@@
int EVP_PBE_scrypt(const char *pass, size_t passlen,
goto err;
rv = 1;
err:
goto err;
rv = 1;
err:
- OPENSSL_clear_free(B,
allocsize
);
+ OPENSSL_clear_free(B,
Blen + Vlen
);
return rv;
}
#endif
return rv;
}
#endif