@@ -229,19 +229,45 @@ SEQUENCE(3 elem)
229229#define CHECK_ASN1_HAS_NO_DATA (l ) CHECK_ASN1_HAS_NO(l, data)
230230
231231#ifdef LTC_DER_TESTS_PRINT_FLEXI
232+
233+ static void * s_xmalloc (int l )
234+ {
235+ void * r = XMALLOC (l );
236+
237+ #if defined(LTC_TEST_DBG ) && LTC_TEST_DBG > 3
238+ fprintf (stderr , "ALLOC %9d to %p\n" , l , r );
239+ #endif
240+ if (!r ) {
241+ fprintf (stderr , "Could not allocate %d bytes of memory\n" , l );
242+ exit (EXIT_FAILURE );
243+ }
244+ return r ;
245+ }
246+
247+ static void s_free (void * p )
248+ {
249+ #if defined(LTC_TEST_DBG ) && LTC_TEST_DBG > 3
250+ fprintf (stderr , "FREE %p\n" , p );
251+ #endif
252+ XFREE (p );
253+ }
254+
232255static void s_der_tests_print_flexi (ltc_asn1_list * l , unsigned int level )
233256{
234- char buf [ 1024 ] ;
257+ char * buf = NULL ;
235258 const char * name = NULL ;
236259 const char * text = NULL ;
237260 ltc_asn1_list * ostring = NULL ;
238261 unsigned int n ;
262+ int slen ;
239263
240264 switch (l -> type )
241265 {
242266 case LTC_ASN1_EOL :
243267 name = "EOL" ;
244- snprintf (buf , sizeof (buf ),__ASN1_FMTSTRING_FMT "\n" , ASN1_FMTSTRING_VAL (l ));
268+ slen = snprintf (NULL , 0 , ASN1_FMTSTRING_FMT "\n" , ASN1_FMTSTRING_VAL (l ));
269+ buf = s_xmalloc (slen );
270+ slen = snprintf (buf , slen , ASN1_FMTSTRING_FMT "\n" , ASN1_FMTSTRING_VAL (l ));
245271 text = buf ;
246272 break ;
247273 case LTC_ASN1_BOOLEAN :
@@ -255,6 +281,7 @@ static void s_der_tests_print_flexi(ltc_asn1_list* l, unsigned int level)
255281 break ;
256282 case LTC_ASN1_INTEGER :
257283 name = "INTEGER" ;
284+ buf = s_xmalloc (((mp_get_digit_count (l -> data ) + 1 ) * ltc_mp .bits_per_digit ) / 3 );
258285 mp_toradix (l -> data , buf , 10 );
259286 text = buf ;
260287 break ;
@@ -273,11 +300,10 @@ static void s_der_tests_print_flexi(ltc_asn1_list* l, unsigned int level)
273300 */
274301 if (der_decode_sequence_flexi (l -> data , & ostring_l , & ostring ) == CRYPT_OK ) {
275302 text = "" ;
276- }
277- else {
303+ } else {
278304 int r ;
279- char * s = buf ;
280- int sz = sizeof ( buf );
305+ int sz = l -> size * 2 + 1 ;
306+ char * s = buf = s_xmalloc ( sz );
281307 for (n = 0 ; n < l -> size ; ++ n ) {
282308 r = snprintf (s , sz , "%02X" , ((unsigned char * )l -> data )[n ]);
283309 if (r < 0 || r >= sz ) {
@@ -298,7 +324,12 @@ static void s_der_tests_print_flexi(ltc_asn1_list* l, unsigned int level)
298324 case LTC_ASN1_OBJECT_IDENTIFIER :
299325 name = "OBJECT IDENTIFIER" ;
300326 {
301- unsigned long len = sizeof (buf );
327+ unsigned long len = 0 ;
328+ if (pk_oid_num_to_str (l -> data , l -> size , buf , & len ) != CRYPT_BUFFER_OVERFLOW ) {
329+ fprintf (stderr , "%s WTF\n" , name );
330+ exit (EXIT_FAILURE );
331+ }
332+ buf = s_xmalloc (len );
302333 if (pk_oid_num_to_str (l -> data , l -> size , buf , & len ) != CRYPT_OK ) {
303334 fprintf (stderr , "%s boom\n" , name );
304335 exit (EXIT_FAILURE );
@@ -321,7 +352,9 @@ static void s_der_tests_print_flexi(ltc_asn1_list* l, unsigned int level)
321352 name = "UTCTIME" ;
322353 {
323354 ltc_utctime * ut = l -> data ;
324- snprintf (buf , sizeof (buf ), "%02d-%02d-%02d %02d:%02d:%02d %c%02d:%02d" ,
355+ slen = 32 ;
356+ buf = s_xmalloc (slen );
357+ snprintf (buf , slen , "%02d-%02d-%02d %02d:%02d:%02d %c%02d:%02d" ,
325358 ut -> YY , ut -> MM , ut -> DD , ut -> hh , ut -> mm , ut -> ss ,
326359 ut -> off_dir ? '-' : '+' , ut -> off_hh , ut -> off_mm );
327360 text = buf ;
@@ -331,11 +364,13 @@ static void s_der_tests_print_flexi(ltc_asn1_list* l, unsigned int level)
331364 name = "GENERALIZED TIME" ;
332365 {
333366 ltc_generalizedtime * gt = l -> data ;
367+ slen = 32 ;
368+ buf = s_xmalloc (slen );
334369 if (gt -> fs )
335- snprintf (buf , sizeof ( buf ) , "%04d-%02d-%02d %02d:%02d:%02d.%02dZ" ,
370+ snprintf (buf , slen , "%04d-%02d-%02d %02d:%02d:%02d.%02dZ" ,
336371 gt -> YYYY , gt -> MM , gt -> DD , gt -> hh , gt -> mm , gt -> ss , gt -> fs );
337372 else
338- snprintf (buf , sizeof ( buf ) , "%04d-%02d-%02d %02d:%02d:%02dZ" ,
373+ snprintf (buf , slen , "%04d-%02d-%02d %02d:%02d:%02dZ" ,
339374 gt -> YYYY , gt -> MM , gt -> DD , gt -> hh , gt -> mm , gt -> ss );
340375 text = buf ;
341376 }
@@ -366,8 +401,8 @@ static void s_der_tests_print_flexi(ltc_asn1_list* l, unsigned int level)
366401 name = "NON STANDARD" ;
367402 {
368403 int r ;
369- char * s = buf ;
370- int sz = sizeof ( buf );
404+ int sz = 128 ;
405+ char * s = buf = s_xmalloc ( sz );
371406
372407 r = snprintf (s , sz , "[%s %s %llu]" , der_asn1_class_to_string_map [l -> klass ], der_asn1_pc_to_string_map [l -> pc ], l -> tag );
373408 if (r < 0 || r >= sz ) {
@@ -394,6 +429,11 @@ static void s_der_tests_print_flexi(ltc_asn1_list* l, unsigned int level)
394429 else
395430 fprintf (stderr , "WTF type=%i\n" , l -> type );
396431
432+ if (buf ) {
433+ s_free (buf );
434+ buf = NULL ;
435+ }
436+
397437 if (ostring ) {
398438 s_der_tests_print_flexi (ostring , level + 1 );
399439 der_free_sequence_flexi (ostring );
0 commit comments