@@ -86,6 +86,8 @@ const secp256k1_context *secp256k1_context_no_precomp = &secp256k1_context_no_pr
86
86
87
87
size_t secp256k1_context_preallocated_size (unsigned int flags ) {
88
88
size_t ret = ROUND_TO_ALIGN (sizeof (secp256k1_context ));
89
+ /* A return value of 0 is reserved as an indicator for errors when we call this function internally. */
90
+ VERIFY_CHECK (ret != 0 );
89
91
90
92
if (EXPECT ((flags & SECP256K1_FLAGS_TYPE_MASK ) != SECP256K1_FLAGS_TYPE_CONTEXT , 0 )) {
91
93
secp256k1_callback_call (& default_illegal_callback ,
@@ -122,21 +124,21 @@ secp256k1_context* secp256k1_context_preallocated_create(void* prealloc, unsigne
122
124
if (!secp256k1_selftest ()) {
123
125
secp256k1_callback_call (& default_error_callback , "self test failed" );
124
126
}
125
- VERIFY_CHECK ( prealloc != NULL );
127
+
126
128
prealloc_size = secp256k1_context_preallocated_size (flags );
129
+ if (prealloc_size == 0 ) {
130
+ return NULL ;
131
+ }
132
+ VERIFY_CHECK (prealloc != NULL );
127
133
ret = (secp256k1_context * )manual_alloc (& prealloc , sizeof (secp256k1_context ), base , prealloc_size );
128
134
ret -> illegal_callback = default_illegal_callback ;
129
135
ret -> error_callback = default_error_callback ;
130
136
131
- if (EXPECT ((flags & SECP256K1_FLAGS_TYPE_MASK ) != SECP256K1_FLAGS_TYPE_CONTEXT , 0 )) {
132
- secp256k1_callback_call (& ret -> illegal_callback ,
133
- "Invalid flags" );
134
- return NULL ;
135
- }
136
-
137
137
secp256k1_ecmult_context_init (& ret -> ecmult_ctx );
138
138
secp256k1_ecmult_gen_context_init (& ret -> ecmult_gen_ctx );
139
139
140
+ /* Flags have been checked by secp256k1_context_preallocated_size. */
141
+ VERIFY_CHECK ((flags & SECP256K1_FLAGS_TYPE_MASK ) == SECP256K1_FLAGS_TYPE_CONTEXT );
140
142
if (flags & SECP256K1_FLAGS_BIT_CONTEXT_SIGN ) {
141
143
secp256k1_ecmult_gen_context_build (& ret -> ecmult_gen_ctx , & prealloc );
142
144
}
0 commit comments