@@ -349,14 +349,22 @@ typedef bfd_vma unw_word;
349
349
printf ("\t%s:spill_base(pspoff=0x10-0x%lx)\n", \
350
350
fmt, 4*(unsigned long)pspoff)
351
351
352
- #define UNW_DEC_SPILL_MASK (fmt , dp , arg ) \
353
- do \
354
- { \
355
- static const char *spill_type = "-frb"; \
352
+ #define UNW_DEC_SPILL_MASK (fmt , dp , arg , end ) \
353
+ do \
354
+ { \
355
+ static const char *spill_type = "-frb"; \
356
356
unsigned const char *imaskp = dp; \
357
- unsigned char mask = 0; \
358
- bfd_vma insn = 0; \
359
- \
357
+ unsigned char mask = 0; \
358
+ bfd_vma insn = 0; \
359
+ \
360
+ /* PR 18420. */ \
361
+ if ((dp + (unw_rlen / 4 )) > end ) \
362
+ { \
363
+ printf ("\nERROR: unwind length too long (0x%lx > 0x%lx)\n\n" ,\
364
+ (long ) (unw_rlen / 4 ), (long )(end - dp )); \
365
+ /* FIXME: Should we reset unw_rlen ? */ \
366
+ break ; \
367
+ } \
360
368
printf ("\t%s:spill_mask(imask=[" , fmt ); \
361
369
for (insn = 0 ; insn < unw_rlen ; ++ insn ) \
362
370
{ \
@@ -533,36 +541,6 @@ typedef bfd_vma unw_word;
533
541
* UNW_DEC_SPILL_SPREL_P(fmt,qp,t,abreg,pspoff,arg)
534
542
*/
535
543
536
- static unw_word unw_decode_uleb128 (const unsigned char * * );
537
- static const unsigned char * unw_decode_x1
538
- (const unsigned char * , unsigned int , void * );
539
- static const unsigned char * unw_decode_x2
540
- (const unsigned char * , unsigned int , void * );
541
- static const unsigned char * unw_decode_x3
542
- (const unsigned char * , unsigned int , void * );
543
- static const unsigned char * unw_decode_x4
544
- (const unsigned char * , unsigned int , void * );
545
- static const unsigned char * unw_decode_r1
546
- (const unsigned char * , unsigned int , void * );
547
- static const unsigned char * unw_decode_r2
548
- (const unsigned char * , unsigned int , void * );
549
- static const unsigned char * unw_decode_r3
550
- (const unsigned char * , unsigned int , void * );
551
- static const unsigned char * unw_decode_p1
552
- (const unsigned char * , unsigned int , void * );
553
- static const unsigned char * unw_decode_p2_p5
554
- (const unsigned char * , unsigned int , void * );
555
- static const unsigned char * unw_decode_p6
556
- (const unsigned char * , unsigned int , void * );
557
- static const unsigned char * unw_decode_p7_p10
558
- (const unsigned char * , unsigned int , void * );
559
- static const unsigned char * unw_decode_b1
560
- (const unsigned char * , unsigned int , void * );
561
- static const unsigned char * unw_decode_b2
562
- (const unsigned char * , unsigned int , void * );
563
- static const unsigned char * unw_decode_b3_x4
564
- (const unsigned char * , unsigned int , void * );
565
-
566
544
static unw_word
567
545
unw_decode_uleb128 (const unsigned char * * dpp )
568
546
{
@@ -671,7 +649,8 @@ unw_decode_x4 (const unsigned char *dp, unsigned int code ATTRIBUTE_UNUSED,
671
649
}
672
650
673
651
static const unsigned char *
674
- unw_decode_r1 (const unsigned char * dp , unsigned int code , void * arg )
652
+ unw_decode_r1 (const unsigned char * dp , unsigned int code , void * arg ,
653
+ const unsigned char * end ATTRIBUTE_UNUSED )
675
654
{
676
655
int body = (code & 0x20 ) != 0 ;
677
656
unw_word rlen ;
@@ -682,7 +661,8 @@ unw_decode_r1 (const unsigned char *dp, unsigned int code, void *arg)
682
661
}
683
662
684
663
static const unsigned char *
685
- unw_decode_r2 (const unsigned char * dp , unsigned int code , void * arg )
664
+ unw_decode_r2 (const unsigned char * dp , unsigned int code , void * arg ,
665
+ const unsigned char * end ATTRIBUTE_UNUSED )
686
666
{
687
667
unsigned char byte1 , mask , grsave ;
688
668
unw_word rlen ;
@@ -697,7 +677,8 @@ unw_decode_r2 (const unsigned char *dp, unsigned int code, void *arg)
697
677
}
698
678
699
679
static const unsigned char *
700
- unw_decode_r3 (const unsigned char * dp , unsigned int code , void * arg )
680
+ unw_decode_r3 (const unsigned char * dp , unsigned int code , void * arg ,
681
+ const unsigned char * end ATTRIBUTE_UNUSED )
701
682
{
702
683
unw_word rlen ;
703
684
@@ -708,7 +689,8 @@ unw_decode_r3 (const unsigned char *dp, unsigned int code, void *arg)
708
689
709
690
static const unsigned char *
710
691
unw_decode_p1 (const unsigned char * dp , unsigned int code ,
711
- void * arg ATTRIBUTE_UNUSED )
692
+ void * arg ATTRIBUTE_UNUSED ,
693
+ const unsigned char * end ATTRIBUTE_UNUSED )
712
694
{
713
695
unsigned char brmask = (code & 0x1f );
714
696
@@ -718,7 +700,8 @@ unw_decode_p1 (const unsigned char *dp, unsigned int code,
718
700
719
701
static const unsigned char *
720
702
unw_decode_p2_p5 (const unsigned char * dp , unsigned int code ,
721
- void * arg ATTRIBUTE_UNUSED )
703
+ void * arg ATTRIBUTE_UNUSED ,
704
+ const unsigned char * end )
722
705
{
723
706
if ((code & 0x10 ) == 0 )
724
707
{
@@ -777,7 +760,7 @@ unw_decode_p2_p5 (const unsigned char *dp, unsigned int code,
777
760
}
778
761
}
779
762
else if ((code & 0x7 ) == 0 )
780
- UNW_DEC_SPILL_MASK ("P4" , dp , arg );
763
+ UNW_DEC_SPILL_MASK ("P4" , dp , arg , end );
781
764
else if ((code & 0x7 ) == 1 )
782
765
{
783
766
unw_word grmask , frmask , byte1 , byte2 , byte3 ;
@@ -797,7 +780,8 @@ unw_decode_p2_p5 (const unsigned char *dp, unsigned int code,
797
780
798
781
static const unsigned char *
799
782
unw_decode_p6 (const unsigned char * dp , unsigned int code ,
800
- void * arg ATTRIBUTE_UNUSED )
783
+ void * arg ATTRIBUTE_UNUSED ,
784
+ const unsigned char * end ATTRIBUTE_UNUSED )
801
785
{
802
786
int gregs = (code & 0x10 ) != 0 ;
803
787
unsigned char mask = (code & 0x0f );
@@ -810,7 +794,8 @@ unw_decode_p6 (const unsigned char *dp, unsigned int code,
810
794
}
811
795
812
796
static const unsigned char *
813
- unw_decode_p7_p10 (const unsigned char * dp , unsigned int code , void * arg )
797
+ unw_decode_p7_p10 (const unsigned char * dp , unsigned int code , void * arg ,
798
+ const unsigned char * end ATTRIBUTE_UNUSED )
814
799
{
815
800
unsigned char r , byte1 , byte2 ;
816
801
unw_word t , size ;
@@ -984,7 +969,8 @@ unw_decode_p7_p10 (const unsigned char *dp, unsigned int code, void *arg)
984
969
985
970
static const unsigned char *
986
971
unw_decode_b1 (const unsigned char * dp , unsigned int code ,
987
- void * arg ATTRIBUTE_UNUSED )
972
+ void * arg ATTRIBUTE_UNUSED ,
973
+ const unsigned char * end ATTRIBUTE_UNUSED )
988
974
{
989
975
unw_word label = (code & 0x1f );
990
976
@@ -997,7 +983,8 @@ unw_decode_b1 (const unsigned char *dp, unsigned int code,
997
983
998
984
static const unsigned char *
999
985
unw_decode_b2 (const unsigned char * dp , unsigned int code ,
1000
- void * arg ATTRIBUTE_UNUSED )
986
+ void * arg ATTRIBUTE_UNUSED ,
987
+ const unsigned char * end ATTRIBUTE_UNUSED )
1001
988
{
1002
989
unw_word t ;
1003
990
@@ -1007,7 +994,8 @@ unw_decode_b2 (const unsigned char *dp, unsigned int code,
1007
994
}
1008
995
1009
996
static const unsigned char *
1010
- unw_decode_b3_x4 (const unsigned char * dp , unsigned int code , void * arg )
997
+ unw_decode_b3_x4 (const unsigned char * dp , unsigned int code , void * arg ,
998
+ const unsigned char * end ATTRIBUTE_UNUSED )
1011
999
{
1012
1000
unw_word t , ecount , label ;
1013
1001
@@ -1044,7 +1032,7 @@ unw_decode_b3_x4 (const unsigned char *dp, unsigned int code, void *arg)
1044
1032
}
1045
1033
1046
1034
typedef const unsigned char * (* unw_decoder )
1047
- (const unsigned char * , unsigned int , void * );
1035
+ (const unsigned char * , unsigned int , void * , const unsigned char * );
1048
1036
1049
1037
static const unw_decoder unw_decode_table [2 ][8 ] =
1050
1038
{
@@ -1074,12 +1062,12 @@ static const unw_decoder unw_decode_table[2][8] =
1074
1062
/* Decode one descriptor and return address of next descriptor. */
1075
1063
const unsigned char *
1076
1064
unw_decode (const unsigned char * dp , int inside_body ,
1077
- void * ptr_inside_body )
1065
+ void * ptr_inside_body , const unsigned char * end )
1078
1066
{
1079
1067
unw_decoder decoder ;
1080
1068
unsigned char code ;
1081
1069
1082
1070
code = * dp ++ ;
1083
1071
decoder = unw_decode_table [inside_body ][code >> 5 ];
1084
- return (* decoder ) (dp , code , ptr_inside_body );
1072
+ return (* decoder ) (dp , code , ptr_inside_body , end );
1085
1073
}
0 commit comments