@@ -380,13 +380,16 @@ demangle_free(struct demangle_data *h, void *ptr)
380
380
}
381
381
382
382
static privileged returnspointerwithnoaliases returnsnonnull void *
383
- demangle_malloc (struct demangle_data * h , int a , int n )
383
+ demangle_malloc (struct demangle_data * h , long a , long n )
384
384
{
385
- int rem ;
385
+ long rem ;
386
386
uintptr_t ptr ;
387
387
index_t next , next2 ;
388
388
index_t * link , * link2 ;
389
- int b = sizeof (index_t );
389
+ long b = sizeof (index_t );
390
+
391
+ if (n < 0 || n >= 32768 )
392
+ __builtin_longjmp (h -> jmpbuf , 1 );
390
393
391
394
/* Roundup size. */
392
395
n += a - 1 ;
@@ -2098,10 +2101,11 @@ demangle_read_tmpl_param(struct demangle_data *ddata)
2098
2101
/* T_ is first */
2099
2102
++ nth ;
2100
2103
2101
- while (* ddata -> cur != '_' )
2104
+ while (* ddata -> cur && * ddata -> cur != '_' )
2102
2105
++ ddata -> cur ;
2103
2106
2104
- ASSERT (nth > 0 );
2107
+ if (nth <= 0 )
2108
+ return 0 ;
2105
2109
2106
2110
return demangle_get_tmpl_param (ddata , nth );
2107
2111
}
@@ -2752,7 +2756,7 @@ demangle_read_offset_number(struct demangle_data *ddata)
2752
2756
start = ddata -> cur ;
2753
2757
}
2754
2758
2755
- while (* ddata -> cur != '_' )
2759
+ while (* ddata -> cur && * ddata -> cur != '_' )
2756
2760
++ ddata -> cur ;
2757
2761
2758
2762
if (negative && !DEM_PUSH_STR (ddata , "-" ))
@@ -2859,13 +2863,12 @@ demangle_read_number(struct demangle_data *ddata, long *rtn)
2859
2863
return 0 ;
2860
2864
2861
2865
len = demangle_strtol (ddata -> cur , 10 );
2866
+ if (len < 0 )
2867
+ __builtin_longjmp (ddata -> jmpbuf , 1 );
2862
2868
2863
2869
while (ELFTC_ISDIGIT (* ddata -> cur ))
2864
2870
++ ddata -> cur ;
2865
2871
2866
- ASSERT (len >= 0 );
2867
- ASSERT (negative_factor == 1 || negative_factor == -1 );
2868
-
2869
2872
* rtn = len * negative_factor ;
2870
2873
2871
2874
return 1 ;
@@ -3419,6 +3422,7 @@ demangle_read_pointer_to_member(struct demangle_data *ddata,
3419
3422
static privileged int
3420
3423
demangle_read_sname (struct demangle_data * ddata )
3421
3424
{
3425
+ size_t lim ;
3422
3426
long len ;
3423
3427
int err ;
3424
3428
@@ -3438,6 +3442,9 @@ demangle_read_sname(struct demangle_data *ddata)
3438
3442
ddata -> last_sname = VEC_STR (ddata , ddata -> cur_output ,
3439
3443
ddata -> cur_output -> size - 1 );
3440
3444
3445
+ lim = demangle_strlen (ddata -> cur );
3446
+ if (len > lim )
3447
+ len = lim ;
3441
3448
ddata -> cur += len ;
3442
3449
3443
3450
return 1 ;
@@ -3647,10 +3654,11 @@ demangle_read_subst(struct demangle_data *ddata)
3647
3654
/* first was '_', so increase one */
3648
3655
++ nth ;
3649
3656
3650
- while (* ddata -> cur != '_' )
3657
+ while (* ddata -> cur && * ddata -> cur != '_' )
3651
3658
++ ddata -> cur ;
3652
3659
3653
- ASSERT (nth > 0 );
3660
+ if (nth <= 0 )
3661
+ return 0 ;
3654
3662
3655
3663
return demangle_get_subst (ddata , nth );
3656
3664
}
@@ -3881,7 +3889,7 @@ demangle_read_type(struct demangle_data *ddata, struct type_delimit *td)
3881
3889
3882
3890
case 'E' :
3883
3891
/* unexpected end (except some things) */
3884
- if (ddata -> is_guard_variable )
3892
+ if (td && ddata -> is_guard_variable )
3885
3893
td -> paren = false;
3886
3894
if (ddata -> is_guard_variable ||
3887
3895
(ddata -> ref_qualifier && ddata -> is_functype )) {
@@ -4102,6 +4110,8 @@ demangle_read_type(struct demangle_data *ddata, struct type_delimit *td)
4102
4110
if (!demangle_vector_str_push (ddata , & v .ext_name , ddata -> cur ,
4103
4111
len ))
4104
4112
return 0 ;
4113
+ if (len > demangle_strlen (ddata -> cur ))
4114
+ len = demangle_strlen (ddata -> cur );
4105
4115
ddata -> cur += len ;
4106
4116
if (!demangle_vector_type_qualifier_push (ddata , & v , TYPE_EXT ))
4107
4117
return 0 ;
0 commit comments