@@ -167,7 +167,8 @@ typedef struct ConversionStatus {
167
167
int flags ;
168
168
} ConversionStatus ;
169
169
170
- static CborError value_to_json (FILE * out , CborValue * it , int flags , CborType type , ConversionStatus * status );
170
+ static CborError value_to_json (FILE * out , CborValue * it , int flags , CborType type ,
171
+ int nestingLevel , ConversionStatus * status );
171
172
172
173
static CborError dump_bytestring_base16 (char * * result , CborValue * it )
173
174
{
@@ -328,11 +329,13 @@ static CborError add_value_metadata(FILE *out, CborType type, const ConversionSt
328
329
return CborNoError ;
329
330
}
330
331
331
- static CborError find_tagged_type (CborValue * it , CborTag * tag , CborType * type )
332
+ static CborError find_tagged_type (CborValue * it , CborTag * tag , CborType * type , int nestingLevel )
332
333
{
333
334
CborError err = CborNoError ;
334
335
* type = cbor_value_get_type (it );
335
336
while (* type == CborTagType ) {
337
+ if (nestingLevel -- == 0 )
338
+ return CborErrorNestingTooDeep ;
336
339
cbor_value_get_tag (it , tag ); /* can't fail */
337
340
err = cbor_value_advance_fixed (it );
338
341
if (err )
@@ -343,7 +346,7 @@ static CborError find_tagged_type(CborValue *it, CborTag *tag, CborType *type)
343
346
return err ;
344
347
}
345
348
346
- static CborError tagged_value_to_json (FILE * out , CborValue * it , int flags , ConversionStatus * status )
349
+ static CborError tagged_value_to_json (FILE * out , CborValue * it , int flags , int nestingLevel , ConversionStatus * status )
347
350
{
348
351
CborTag tag ;
349
352
CborError err ;
@@ -358,7 +361,7 @@ static CborError tagged_value_to_json(FILE *out, CborValue *it, int flags, Conve
358
361
return CborErrorIO ;
359
362
360
363
CborType type = cbor_value_get_type (it );
361
- err = value_to_json (out , it , flags , type , status );
364
+ err = value_to_json (out , it , flags , type , nestingLevel , status );
362
365
if (err )
363
366
return err ;
364
367
if (flags & CborConvertAddMetadata && status -> flags ) {
@@ -374,7 +377,7 @@ static CborError tagged_value_to_json(FILE *out, CborValue *it, int flags, Conve
374
377
}
375
378
376
379
CborType type ;
377
- err = find_tagged_type (it , & status -> lastTag , & type );
380
+ err = find_tagged_type (it , & status -> lastTag , & type , nestingLevel );
378
381
if (err )
379
382
return err ;
380
383
tag = status -> lastTag ;
@@ -402,7 +405,7 @@ static CborError tagged_value_to_json(FILE *out, CborValue *it, int flags, Conve
402
405
}
403
406
404
407
/* no special handling */
405
- err = value_to_json (out , it , flags , type , status );
408
+ err = value_to_json (out , it , flags , type , nestingLevel , status );
406
409
status -> flags |= TypeWasTagged | type ;
407
410
return err ;
408
411
}
@@ -429,22 +432,22 @@ static CborError stringify_map_key(char **key, CborValue *it, int flags, CborTyp
429
432
#endif
430
433
}
431
434
432
- static CborError array_to_json (FILE * out , CborValue * it , int flags , ConversionStatus * status )
435
+ static CborError array_to_json (FILE * out , CborValue * it , int flags , int nestingLevel , ConversionStatus * status )
433
436
{
434
437
const char * comma = "" ;
435
438
while (!cbor_value_at_end (it )) {
436
439
if (fprintf (out , "%s" , comma ) < 0 )
437
440
return CborErrorIO ;
438
441
comma = "," ;
439
442
440
- CborError err = value_to_json (out , it , flags , cbor_value_get_type (it ), status );
443
+ CborError err = value_to_json (out , it , flags , cbor_value_get_type (it ), nestingLevel , status );
441
444
if (err )
442
445
return err ;
443
446
}
444
447
return CborNoError ;
445
448
}
446
449
447
- static CborError map_to_json (FILE * out , CborValue * it , int flags , ConversionStatus * status )
450
+ static CborError map_to_json (FILE * out , CborValue * it , int flags , int nestingLevel , ConversionStatus * status )
448
451
{
449
452
const char * comma = "" ;
450
453
CborError err ;
@@ -474,7 +477,7 @@ static CborError map_to_json(FILE *out, CborValue *it, int flags, ConversionStat
474
477
475
478
/* then, print the value */
476
479
CborType valueType = cbor_value_get_type (it );
477
- err = value_to_json (out , it , flags , valueType , status );
480
+ err = value_to_json (out , it , flags , valueType , nestingLevel , status );
478
481
479
482
/* finally, print any metadata we may have */
480
483
if (flags & CborConvertAddMetadata ) {
@@ -497,11 +500,15 @@ static CborError map_to_json(FILE *out, CborValue *it, int flags, ConversionStat
497
500
return CborNoError ;
498
501
}
499
502
500
- static CborError value_to_json (FILE * out , CborValue * it , int flags , CborType type , ConversionStatus * status )
503
+ static CborError value_to_json (FILE * out , CborValue * it , int flags , CborType type ,
504
+ int nestingLevel , ConversionStatus * status )
501
505
{
502
506
CborError err ;
503
507
status -> flags = 0 ;
504
508
509
+ if (nestingLevel == 0 )
510
+ return CborErrorNestingTooDeep ;
511
+
505
512
switch (type ) {
506
513
case CborArrayType :
507
514
case CborMapType : {
@@ -516,8 +523,8 @@ static CborError value_to_json(FILE *out, CborValue *it, int flags, CborType typ
516
523
return CborErrorIO ;
517
524
518
525
err = (type == CborArrayType ) ?
519
- array_to_json (out , & recursed , flags , status ) :
520
- map_to_json (out , & recursed , flags , status );
526
+ array_to_json (out , & recursed , flags , nestingLevel - 1 , status ) :
527
+ map_to_json (out , & recursed , flags , nestingLevel - 1 , status );
521
528
if (err ) {
522
529
copy_current_position (it , & recursed );
523
530
return err ; /* parse error */
@@ -574,7 +581,7 @@ static CborError value_to_json(FILE *out, CborValue *it, int flags, CborType typ
574
581
}
575
582
576
583
case CborTagType :
577
- return tagged_value_to_json (out , it , flags , status );
584
+ return tagged_value_to_json (out , it , flags , nestingLevel - 1 , status );
578
585
579
586
case CborSimpleType : {
580
587
uint8_t simple_type ;
@@ -704,7 +711,8 @@ static CborError value_to_json(FILE *out, CborValue *it, int flags, CborType typ
704
711
CborError cbor_value_to_json_advance (FILE * out , CborValue * value , int flags )
705
712
{
706
713
ConversionStatus status ;
707
- return value_to_json (out , value , flags , cbor_value_get_type (value ), & status );
714
+ return value_to_json (out , value , flags , cbor_value_get_type (value ), CBOR_PARSER_MAX_RECURSIONS ,
715
+ & status );
708
716
}
709
717
710
718
/** @} */
0 commit comments