Merge #840: Return NULL early in context_preallocated_create if flags invalid
ebfa2058e9
Return NULL early in context_preallocated_create if flags invalid (Tim Ruffing) Pull request description: ACKs for top commit: sipa: ACKebfa2058e9
jonasnick: ACKebfa2058e9
Tree-SHA512: 61310539046e015e5c9e6b5702ac7b542fda854a23915ef5dd549361c8ec6e70aa6d509e02b30fd859b24dfaf2250721bb55270767323d6e94854067b7d7e9a6
This commit is contained in:
commit
903b16aa6c
|
@ -86,6 +86,8 @@ const secp256k1_context *secp256k1_context_no_precomp = &secp256k1_context_no_pr
|
||||||
|
|
||||||
size_t secp256k1_context_preallocated_size(unsigned int flags) {
|
size_t secp256k1_context_preallocated_size(unsigned int flags) {
|
||||||
size_t ret = ROUND_TO_ALIGN(sizeof(secp256k1_context));
|
size_t ret = ROUND_TO_ALIGN(sizeof(secp256k1_context));
|
||||||
|
/* A return value of 0 is reserved as an indicator for errors when we call this function internally. */
|
||||||
|
VERIFY_CHECK(ret != 0);
|
||||||
|
|
||||||
if (EXPECT((flags & SECP256K1_FLAGS_TYPE_MASK) != SECP256K1_FLAGS_TYPE_CONTEXT, 0)) {
|
if (EXPECT((flags & SECP256K1_FLAGS_TYPE_MASK) != SECP256K1_FLAGS_TYPE_CONTEXT, 0)) {
|
||||||
secp256k1_callback_call(&default_illegal_callback,
|
secp256k1_callback_call(&default_illegal_callback,
|
||||||
|
@ -122,21 +124,21 @@ secp256k1_context* secp256k1_context_preallocated_create(void* prealloc, unsigne
|
||||||
if (!secp256k1_selftest()) {
|
if (!secp256k1_selftest()) {
|
||||||
secp256k1_callback_call(&default_error_callback, "self test failed");
|
secp256k1_callback_call(&default_error_callback, "self test failed");
|
||||||
}
|
}
|
||||||
VERIFY_CHECK(prealloc != NULL);
|
|
||||||
prealloc_size = secp256k1_context_preallocated_size(flags);
|
prealloc_size = secp256k1_context_preallocated_size(flags);
|
||||||
|
if (prealloc_size == 0) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
VERIFY_CHECK(prealloc != NULL);
|
||||||
ret = (secp256k1_context*)manual_alloc(&prealloc, sizeof(secp256k1_context), base, prealloc_size);
|
ret = (secp256k1_context*)manual_alloc(&prealloc, sizeof(secp256k1_context), base, prealloc_size);
|
||||||
ret->illegal_callback = default_illegal_callback;
|
ret->illegal_callback = default_illegal_callback;
|
||||||
ret->error_callback = default_error_callback;
|
ret->error_callback = default_error_callback;
|
||||||
|
|
||||||
if (EXPECT((flags & SECP256K1_FLAGS_TYPE_MASK) != SECP256K1_FLAGS_TYPE_CONTEXT, 0)) {
|
|
||||||
secp256k1_callback_call(&ret->illegal_callback,
|
|
||||||
"Invalid flags");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
secp256k1_ecmult_context_init(&ret->ecmult_ctx);
|
secp256k1_ecmult_context_init(&ret->ecmult_ctx);
|
||||||
secp256k1_ecmult_gen_context_init(&ret->ecmult_gen_ctx);
|
secp256k1_ecmult_gen_context_init(&ret->ecmult_gen_ctx);
|
||||||
|
|
||||||
|
/* Flags have been checked by secp256k1_context_preallocated_size. */
|
||||||
|
VERIFY_CHECK((flags & SECP256K1_FLAGS_TYPE_MASK) == SECP256K1_FLAGS_TYPE_CONTEXT);
|
||||||
if (flags & SECP256K1_FLAGS_BIT_CONTEXT_SIGN) {
|
if (flags & SECP256K1_FLAGS_BIT_CONTEXT_SIGN) {
|
||||||
secp256k1_ecmult_gen_context_build(&ret->ecmult_gen_ctx, &prealloc);
|
secp256k1_ecmult_gen_context_build(&ret->ecmult_gen_ctx, &prealloc);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue