@@ -258,28 +258,31 @@ void run_scratch_tests(void) {
258258
259259 /* Test public API */
260260 secp256k1_context_set_illegal_callback (none , counting_illegal_callback_fn , & ecount );
261- scratch = secp256k1_scratch_space_create (none , 100 , 10 );
262- CHECK (scratch == NULL );
263- CHECK (ecount == 1 );
264-
265- scratch = secp256k1_scratch_space_create (none , 100 , 100 );
266- CHECK (scratch != NULL );
267- CHECK (ecount == 1 );
268- secp256k1_scratch_space_destroy (scratch );
269261
270- scratch = secp256k1_scratch_space_create (none , 100 , 1000 );
262+ scratch = secp256k1_scratch_space_create (none , 1000 );
271263 CHECK (scratch != NULL );
272- CHECK (ecount == 1 );
264+ CHECK (ecount == 0 );
273265
274266 /* Test internal API */
275267 CHECK (secp256k1_scratch_max_allocation (scratch , 0 ) == 1000 );
276268 CHECK (secp256k1_scratch_max_allocation (scratch , 1 ) < 1000 );
277- CHECK (secp256k1_scratch_resize (scratch , 50 , 1 ) == 1 ); /* no-op */
278- CHECK (secp256k1_scratch_resize (scratch , 200 , 1 ) == 1 );
279- CHECK (secp256k1_scratch_resize (scratch , 950 , 1 ) == 1 );
280- CHECK (secp256k1_scratch_resize (scratch , 1000 , 1 ) == 0 );
281- CHECK (secp256k1_scratch_resize (scratch , 2000 , 1 ) == 0 );
269+
270+ /* Allocating 500 bytes with no frame fails */
271+ CHECK (secp256k1_scratch_alloc (scratch , 500 ) == NULL );
272+ CHECK (secp256k1_scratch_max_allocation (scratch , 0 ) == 1000 );
273+
274+ /* ...but pushing a new stack frame does affect the max allocation */
275+ CHECK (secp256k1_scratch_allocate_frame (scratch , 500 , 1 == 1 ));
276+ CHECK (secp256k1_scratch_max_allocation (scratch , 1 ) < 500 ); /* 500 - ALIGNMENT */
277+ CHECK (secp256k1_scratch_alloc (scratch , 500 ) != NULL );
278+ CHECK (secp256k1_scratch_alloc (scratch , 500 ) == NULL );
279+
280+ CHECK (secp256k1_scratch_allocate_frame (scratch , 500 , 1 ) == 0 );
281+
282+ /* ...and this effect is undone by popping the frame */
283+ secp256k1_scratch_deallocate_frame (scratch );
282284 CHECK (secp256k1_scratch_max_allocation (scratch , 0 ) == 1000 );
285+ CHECK (secp256k1_scratch_alloc (scratch , 500 ) == NULL );
283286
284287 /* cleanup */
285288 secp256k1_scratch_space_destroy (scratch );
@@ -2558,7 +2561,6 @@ void test_ecmult_multi(secp256k1_scratch *scratch, secp256k1_ecmult_multi_func e
25582561 data .sc = sc ;
25592562 data .pt = pt ;
25602563 secp256k1_scalar_set_int (& szero , 0 );
2561- secp256k1_scratch_reset (scratch );
25622564
25632565 /* No points to multiply */
25642566 CHECK (ecmult_multi (& ctx -> ecmult_ctx , scratch , & r , NULL , ecmult_multi_callback , & data , 0 ));
@@ -2590,7 +2592,7 @@ void test_ecmult_multi(secp256k1_scratch *scratch, secp256k1_ecmult_multi_func e
25902592 CHECK (secp256k1_gej_is_infinity (& r ));
25912593
25922594 /* Try to multiply 1 point, but scratch space is empty */
2593- scratch_empty = secp256k1_scratch_create (& ctx -> error_callback , 0 , 0 );
2595+ scratch_empty = secp256k1_scratch_create (& ctx -> error_callback , 0 );
25942596 CHECK (!ecmult_multi (& ctx -> ecmult_ctx , scratch_empty , & r , & szero , ecmult_multi_callback , & data , 1 ));
25952597 secp256k1_scratch_destroy (scratch_empty );
25962598
@@ -2816,15 +2818,16 @@ void test_ecmult_multi_pippenger_max_points(void) {
28162818 int bucket_window = 0 ;
28172819
28182820 for (; scratch_size < max_size ; scratch_size += 256 ) {
2819- scratch = secp256k1_scratch_create (& ctx -> error_callback , 0 , scratch_size );
2821+ scratch = secp256k1_scratch_create (& ctx -> error_callback , scratch_size );
28202822 CHECK (scratch != NULL );
28212823 n_points_supported = secp256k1_pippenger_max_points (scratch );
28222824 if (n_points_supported == 0 ) {
28232825 secp256k1_scratch_destroy (scratch );
28242826 continue ;
28252827 }
28262828 bucket_window = secp256k1_pippenger_bucket_window (n_points_supported );
2827- CHECK (secp256k1_scratch_resize (scratch , secp256k1_pippenger_scratch_size (n_points_supported , bucket_window ), PIPPENGER_SCRATCH_OBJECTS ));
2829+ CHECK (secp256k1_scratch_allocate_frame (scratch , secp256k1_pippenger_scratch_size (n_points_supported , bucket_window ), PIPPENGER_SCRATCH_OBJECTS ));
2830+ secp256k1_scratch_deallocate_frame (scratch );
28282831 secp256k1_scratch_destroy (scratch );
28292832 }
28302833 CHECK (bucket_window == PIPPENGER_MAX_BUCKET_WINDOW );
@@ -2866,13 +2869,13 @@ void test_ecmult_multi_batching(void) {
28662869 data .pt = pt ;
28672870
28682871 /* Test with empty scratch space */
2869- scratch = secp256k1_scratch_create (& ctx -> error_callback , 0 , 0 );
2872+ scratch = secp256k1_scratch_create (& ctx -> error_callback , 0 );
28702873 CHECK (!secp256k1_ecmult_multi_var (& ctx -> ecmult_ctx , scratch , & r , & scG , ecmult_multi_callback , & data , 1 ));
28712874 secp256k1_scratch_destroy (scratch );
28722875
28732876 /* Test with space for 1 point in pippenger. That's not enough because
28742877 * ecmult_multi selects strauss which requires more memory. */
2875- scratch = secp256k1_scratch_create (& ctx -> error_callback , 0 , secp256k1_pippenger_scratch_size (1 , 1 ) + PIPPENGER_SCRATCH_OBJECTS * ALIGNMENT );
2878+ scratch = secp256k1_scratch_create (& ctx -> error_callback , secp256k1_pippenger_scratch_size (1 , 1 ) + PIPPENGER_SCRATCH_OBJECTS * ALIGNMENT );
28762879 CHECK (!secp256k1_ecmult_multi_var (& ctx -> ecmult_ctx , scratch , & r , & scG , ecmult_multi_callback , & data , 1 ));
28772880 secp256k1_scratch_destroy (scratch );
28782881
@@ -2881,10 +2884,10 @@ void test_ecmult_multi_batching(void) {
28812884 if (i > ECMULT_PIPPENGER_THRESHOLD ) {
28822885 int bucket_window = secp256k1_pippenger_bucket_window (i );
28832886 size_t scratch_size = secp256k1_pippenger_scratch_size (i , bucket_window );
2884- scratch = secp256k1_scratch_create (& ctx -> error_callback , 0 , scratch_size + PIPPENGER_SCRATCH_OBJECTS * ALIGNMENT );
2887+ scratch = secp256k1_scratch_create (& ctx -> error_callback , scratch_size + PIPPENGER_SCRATCH_OBJECTS * ALIGNMENT );
28852888 } else {
28862889 size_t scratch_size = secp256k1_strauss_scratch_size (i );
2887- scratch = secp256k1_scratch_create (& ctx -> error_callback , 0 , scratch_size + STRAUSS_SCRATCH_OBJECTS * ALIGNMENT );
2890+ scratch = secp256k1_scratch_create (& ctx -> error_callback , scratch_size + STRAUSS_SCRATCH_OBJECTS * ALIGNMENT );
28882891 }
28892892 CHECK (secp256k1_ecmult_multi_var (& ctx -> ecmult_ctx , scratch , & r , & scG , ecmult_multi_callback , & data , n_points ));
28902893 secp256k1_gej_add_var (& r , & r , & r2 , NULL );
@@ -2900,14 +2903,14 @@ void run_ecmult_multi_tests(void) {
29002903
29012904 test_secp256k1_pippenger_bucket_window_inv ();
29022905 test_ecmult_multi_pippenger_max_points ();
2903- scratch = secp256k1_scratch_create (& ctx -> error_callback , 0 , 819200 );
2906+ scratch = secp256k1_scratch_create (& ctx -> error_callback , 819200 );
29042907 test_ecmult_multi (scratch , secp256k1_ecmult_multi_var );
29052908 test_ecmult_multi (scratch , secp256k1_ecmult_pippenger_batch_single );
29062909 test_ecmult_multi (scratch , secp256k1_ecmult_strauss_batch_single );
29072910 secp256k1_scratch_destroy (scratch );
29082911
29092912 /* Run test_ecmult_multi with space for exactly one point */
2910- scratch = secp256k1_scratch_create (& ctx -> error_callback , 0 , secp256k1_strauss_scratch_size (1 ) + STRAUSS_SCRATCH_OBJECTS * ALIGNMENT );
2913+ scratch = secp256k1_scratch_create (& ctx -> error_callback , secp256k1_strauss_scratch_size (1 ) + STRAUSS_SCRATCH_OBJECTS * ALIGNMENT );
29112914 test_ecmult_multi (scratch , secp256k1_ecmult_multi_var );
29122915 secp256k1_scratch_destroy (scratch );
29132916
0 commit comments