@@ -44,11 +44,35 @@ static int all_bytes_equal(const void* s, unsigned char value, size_t n) {
44
44
return 1 ;
45
45
}
46
46
47
+ /* TODO Use CHECK_ILLEGAL(_VOID) everywhere and get rid of the uncounting callback */
48
+ /* For checking functions that use ARG_CHECK */
49
+ #define CHECK_ILLEGAL (ctx , expr ) do { \
50
+ /* long descriptive variable name to avoid accidental shadowing and have clear error message */ \
51
+ int32_t count_of_calls_to_illegal_callback = 0; \
52
+ secp256k1_context_set_illegal_callback(ctx, \
53
+ counting_illegal_callback_fn, &count_of_calls_to_illegal_callback); \
54
+ { CHECK((expr) == 0); } \
55
+ secp256k1_context_set_illegal_callback(ctx, NULL, NULL); \
56
+ CHECK(count_of_calls_to_illegal_callback == 1); \
57
+ } while(0);
58
+
59
+ /* For checking functions that use ARG_CHECK_VOID */
60
+ #define CHECK_ILLEGAL_VOID (ctx , expr ) do { \
61
+ /* long descriptive variable name to avoid accidental shadowing and have clear error message */ \
62
+ int32_t count_of_calls_to_illegal_callback = 0; \
63
+ secp256k1_context_set_illegal_callback(ctx, \
64
+ counting_illegal_callback_fn, &count_of_calls_to_illegal_callback); \
65
+ { (expr); } \
66
+ secp256k1_context_set_illegal_callback(ctx, NULL, NULL); \
67
+ CHECK(count_of_calls_to_illegal_callback == 1); \
68
+ } while(0);
69
+
47
70
static void counting_illegal_callback_fn (const char * str , void * data ) {
48
71
/* Dummy callback function that just counts. */
49
72
int32_t * p ;
50
73
(void )str ;
51
74
p = data ;
75
+ CHECK (* p != INT32_MAX );
52
76
(* p )++ ;
53
77
}
54
78
@@ -57,6 +81,7 @@ static void uncounting_illegal_callback_fn(const char* str, void* data) {
57
81
int32_t * p ;
58
82
(void )str ;
59
83
p = data ;
84
+ CHECK (* p != INT32_MIN );
60
85
(* p )-- ;
61
86
}
62
87
@@ -246,39 +271,28 @@ static void run_static_context_tests(int use_prealloc) {
246
271
CHECK (secp256k1_context_no_precomp == secp256k1_context_static );
247
272
248
273
{
249
- int ecount = 0 ;
250
274
unsigned char seed [32 ] = {0x17 };
251
- secp256k1_context_set_illegal_callback (STATIC_CTX , counting_illegal_callback_fn , & ecount );
252
275
253
276
/* Randomizing secp256k1_context_static is not supported. */
254
- CHECK (secp256k1_context_randomize (STATIC_CTX , seed ) == 0 );
255
- CHECK (ecount == 1 );
256
- CHECK (secp256k1_context_randomize (STATIC_CTX , NULL ) == 0 );
257
- CHECK (ecount == 2 );
258
- ecount = 0 ;
277
+ CHECK_ILLEGAL (STATIC_CTX , secp256k1_context_randomize (STATIC_CTX , seed ));
278
+ CHECK_ILLEGAL (STATIC_CTX , secp256k1_context_randomize (STATIC_CTX , NULL ));
259
279
260
280
/* Destroying or cloning secp256k1_context_static is not supported. */
261
281
if (use_prealloc ) {
262
- CHECK (secp256k1_context_preallocated_clone_size (STATIC_CTX ) == 0 );
263
- CHECK (ecount == 1 );
282
+ CHECK_ILLEGAL (STATIC_CTX , secp256k1_context_preallocated_clone_size (STATIC_CTX ));
264
283
{
265
284
secp256k1_context * my_static_ctx = malloc (sizeof (* STATIC_CTX ));
266
285
CHECK (my_static_ctx != NULL );
267
286
memset (my_static_ctx , 0x2a , sizeof (* my_static_ctx ));
268
- CHECK ( secp256k1_context_preallocated_clone (STATIC_CTX , my_static_ctx ) == NULL );
287
+ CHECK_ILLEGAL ( STATIC_CTX , secp256k1_context_preallocated_clone (STATIC_CTX , my_static_ctx ));
269
288
CHECK (all_bytes_equal (my_static_ctx , 0x2a , sizeof (* my_static_ctx )));
270
- CHECK (ecount == 2 );
271
289
free (my_static_ctx );
272
290
}
273
- secp256k1_context_preallocated_destroy (STATIC_CTX );
274
- CHECK (ecount == 3 );
291
+ CHECK_ILLEGAL_VOID (STATIC_CTX , secp256k1_context_preallocated_destroy (STATIC_CTX ));
275
292
} else {
276
- CHECK (secp256k1_context_clone (STATIC_CTX ) == NULL );
277
- CHECK (ecount == 1 );
278
- secp256k1_context_destroy (STATIC_CTX );
279
- CHECK (ecount == 2 );
293
+ CHECK_ILLEGAL (STATIC_CTX , secp256k1_context_clone (STATIC_CTX ));
294
+ CHECK_ILLEGAL_VOID (STATIC_CTX , secp256k1_context_destroy (STATIC_CTX ));
280
295
}
281
- secp256k1_context_set_illegal_callback (STATIC_CTX , NULL , NULL );
282
296
}
283
297
284
298
{
0 commit comments