@@ -192,6 +192,20 @@ static void reset_all(test_ctx_t *ctx)
192192 ctx -> fail_on_counter = -1 ;
193193}
194194
195+ static int all_zero (const uint8_t * buf , size_t len )
196+ {
197+ size_t i ;
198+ for (i = 0 ; i < len ; i ++ )
199+ {
200+ if (buf [i ] != 0 )
201+ {
202+ return 0 ;
203+ }
204+ }
205+
206+ return 1 ;
207+ }
208+
195209void * custom_alloc (test_ctx_t * ctx , size_t sz , const char * file , int line ,
196210 const char * var , const char * type )
197211{
@@ -329,13 +343,64 @@ void custom_free(test_ctx_t *ctx, void *p, size_t sz, const char *file,
329343 } \
330344 } while (0 )
331345
346+ #define TEST_ALLOC_FAILURE_CLEARS_OUTPUTS (test_name , setup_outputs , call , \
347+ outputs_are_clear ) \
348+ do \
349+ { \
350+ int num_allocs, i, rc; \
351+ reset_all(ctx); \
352+ rc = call; \
353+ if (rc != 0) \
354+ { \
355+ fprintf(stderr, "ERROR: %s failed with %d in cleanup counting pass\n", \
356+ test_name, rc); \
357+ return 1; \
358+ } \
359+ num_allocs = ctx->alloc_counter; \
360+ for (i = 0; i < num_allocs; i++) \
361+ { \
362+ reset_all(ctx); \
363+ setup_outputs; \
364+ ctx->fail_on_counter = i; \
365+ rc = call; \
366+ if (rc != MLK_ERR_OUT_OF_MEMORY) \
367+ { \
368+ fprintf(stderr, \
369+ "ERROR: %s returned %d instead of %d when allocation %d/%d " \
370+ "was instrumented to fail\n", \
371+ test_name, rc, MLK_ERR_OUT_OF_MEMORY, i + 1, num_allocs); \
372+ return 1; \
373+ } \
374+ if (!(outputs_are_clear)) \
375+ { \
376+ fprintf(stderr, \
377+ "ERROR: %s left stale caller output after allocation %d/%d " \
378+ "failed\n", \
379+ test_name, i + 1, num_allocs); \
380+ return 1; \
381+ } \
382+ } \
383+ printf( \
384+ "Allocation output cleanup test for %s PASSED.\n" \
385+ " Checked %d allocation failure point(s)\n", \
386+ test_name, num_allocs); \
387+ } while (0)
388+
332389static int test_keygen_alloc_failure (test_ctx_t * ctx )
333390{
334391 uint8_t pk [CRYPTO_PUBLICKEYBYTES ];
335392 uint8_t sk [CRYPTO_SECRETKEYBYTES ];
336393
337394 TEST_ALLOC_FAILURE ("crypto_kem_keypair" , crypto_kem_keypair (pk , sk , ctx ),
338395 MLK_TOTAL_ALLOC_KEYPAIR , & ctx -> global_high_mark_keypair );
396+ TEST_ALLOC_FAILURE_CLEARS_OUTPUTS (
397+ "crypto_kem_keypair" ,
398+ {
399+ memset (pk , 0xA5 , sizeof (pk ));
400+ memset (sk , 0x5A , sizeof (sk ));
401+ },
402+ crypto_kem_keypair (pk , sk , ctx ),
403+ all_zero (pk , sizeof (pk )) && all_zero (sk , sizeof (sk )));
339404 return 0 ;
340405}
341406
@@ -356,6 +421,14 @@ static int test_enc_alloc_failure(test_ctx_t *ctx)
356421
357422 TEST_ALLOC_FAILURE ("crypto_kem_enc" , crypto_kem_enc (ct , key , pk , ctx ),
358423 MLK_TOTAL_ALLOC_ENCAPS , & ctx -> global_high_mark_encaps );
424+ TEST_ALLOC_FAILURE_CLEARS_OUTPUTS (
425+ "crypto_kem_enc" ,
426+ {
427+ memset (ct , 0xA5 , sizeof (ct ));
428+ memset (key , 0x5A , sizeof (key ));
429+ },
430+ crypto_kem_enc (ct , key , pk , ctx ),
431+ all_zero (ct , sizeof (ct )) && all_zero (key , sizeof (key )));
359432 return 0 ;
360433}
361434
@@ -383,6 +456,9 @@ static int test_dec_alloc_failure(test_ctx_t *ctx)
383456
384457 TEST_ALLOC_FAILURE ("crypto_kem_dec" , crypto_kem_dec (key_dec , ct , sk , ctx ),
385458 MLK_TOTAL_ALLOC_DECAPS , & ctx -> global_high_mark_decaps );
459+ TEST_ALLOC_FAILURE_CLEARS_OUTPUTS (
460+ "crypto_kem_dec" , memset (key_dec , 0xA5 , sizeof (key_dec )),
461+ crypto_kem_dec (key_dec , ct , sk , ctx ), all_zero (key_dec , sizeof (key_dec )));
386462 return 0 ;
387463}
388464
0 commit comments