|
103 | 103 | #define ELFTC_SUCCESS 1
|
104 | 104 |
|
105 | 105 | #define VECTOR_DEF_CAPACITY 1
|
| 106 | +#define MAX_DEPTH 20 |
106 | 107 |
|
107 | 108 | typedef unsigned short index_t;
|
108 | 109 |
|
@@ -188,6 +189,7 @@ struct demangle_data {
|
188 | 189 | enum type_qualifier ref_qualifier_type; /* ref qualifier type */
|
189 | 190 | enum push_qualifier push_qualifier; /* which qualifiers to push */
|
190 | 191 | int func_type;
|
| 192 | + int depth; |
191 | 193 | const char *cur; /* current mangled name ptr */
|
192 | 194 | const char *last_sname; /* last source name */
|
193 | 195 | intptr_t jmpbuf[5];
|
@@ -2261,7 +2263,7 @@ demangle_read_expression_binary(struct demangle_data *ddata, const char *name,
|
2261 | 2263 | }
|
2262 | 2264 |
|
2263 | 2265 | static privileged int
|
2264 |
| -demangle_read_expression(struct demangle_data *ddata) |
| 2266 | +demangle_read_expression_impl(struct demangle_data *ddata) |
2265 | 2267 | {
|
2266 | 2268 | if (*ddata->cur == '\0')
|
2267 | 2269 | return 0;
|
@@ -2542,6 +2544,17 @@ demangle_read_expression(struct demangle_data *ddata)
|
2542 | 2544 | return 0;
|
2543 | 2545 | }
|
2544 | 2546 |
|
| 2547 | +static privileged int |
| 2548 | +demangle_read_expression(struct demangle_data *ddata) |
| 2549 | +{ |
| 2550 | + if (ddata->depth == MAX_DEPTH) |
| 2551 | + __builtin_longjmp(ddata->jmpbuf, 1); |
| 2552 | + ++ddata->depth; |
| 2553 | + int res = demangle_read_expression_impl(ddata); |
| 2554 | + --ddata->depth; |
| 2555 | + return res; |
| 2556 | +} |
| 2557 | + |
2545 | 2558 | static privileged int
|
2546 | 2559 | demangle_read_expression_flat(struct demangle_data *ddata, char **str)
|
2547 | 2560 | {
|
@@ -2891,9 +2904,8 @@ demangle_read_number_as_string(struct demangle_data *ddata, char **str)
|
2891 | 2904 | return 1;
|
2892 | 2905 | }
|
2893 | 2906 |
|
2894 |
| -/* read encoding, encoding are function name, data name, special-name */ |
2895 | 2907 | static privileged int
|
2896 |
| -demangle_read_encoding(struct demangle_data *ddata) |
| 2908 | +demangle_read_encoding_impl(struct demangle_data *ddata) |
2897 | 2909 | {
|
2898 | 2910 | char *name, *type, *num_str;
|
2899 | 2911 | long offset;
|
@@ -3100,6 +3112,18 @@ demangle_read_encoding(struct demangle_data *ddata)
|
3100 | 3112 | return demangle_read_name(ddata);
|
3101 | 3113 | }
|
3102 | 3114 |
|
| 3115 | +/* read encoding, encoding are function name, data name, special-name */ |
| 3116 | +static privileged int |
| 3117 | +demangle_read_encoding(struct demangle_data *ddata) |
| 3118 | +{ |
| 3119 | + if (ddata->depth == MAX_DEPTH) |
| 3120 | + __builtin_longjmp(ddata->jmpbuf, 1); |
| 3121 | + ++ddata->depth; |
| 3122 | + int res = demangle_read_encoding_impl(ddata); |
| 3123 | + --ddata->depth; |
| 3124 | + return res; |
| 3125 | +} |
| 3126 | + |
3103 | 3127 | static privileged int
|
3104 | 3128 | demangle_read_local_name(struct demangle_data *ddata)
|
3105 | 3129 | {
|
@@ -3270,7 +3294,7 @@ demangle_read_nested_name(struct demangle_data *ddata)
|
3270 | 3294 | }
|
3271 | 3295 |
|
3272 | 3296 | static privileged int
|
3273 |
| -demangle_read_name(struct demangle_data *ddata) |
| 3297 | +demangle_read_name_impl(struct demangle_data *ddata) |
3274 | 3298 | {
|
3275 | 3299 | struct stack_str v;
|
3276 | 3300 | struct vector_str *output;
|
@@ -3331,6 +3355,17 @@ demangle_read_name(struct demangle_data *ddata)
|
3331 | 3355 | return rtn;
|
3332 | 3356 | }
|
3333 | 3357 |
|
| 3358 | +static privileged int |
| 3359 | +demangle_read_name(struct demangle_data *ddata) |
| 3360 | +{ |
| 3361 | + if (ddata->depth == MAX_DEPTH) |
| 3362 | + __builtin_longjmp(ddata->jmpbuf, 1); |
| 3363 | + ++ddata->depth; |
| 3364 | + int res = demangle_read_name_impl(ddata); |
| 3365 | + --ddata->depth; |
| 3366 | + return res; |
| 3367 | +} |
| 3368 | + |
3334 | 3369 | static privileged int
|
3335 | 3370 | demangle_read_name_flat(struct demangle_data *ddata, char **str)
|
3336 | 3371 | {
|
@@ -3697,7 +3732,7 @@ demangle_vector_type_qualifier_push(struct demangle_data *ddata,
|
3697 | 3732 | }
|
3698 | 3733 |
|
3699 | 3734 | static privileged int
|
3700 |
| -demangle_read_type(struct demangle_data *ddata, struct type_delimit *td) |
| 3735 | +demangle_read_type_impl(struct demangle_data *ddata, struct type_delimit *td) |
3701 | 3736 | {
|
3702 | 3737 | struct vector_type_qualifier v;
|
3703 | 3738 | struct vector_str *output, sv;
|
@@ -4219,6 +4254,17 @@ demangle_read_type(struct demangle_data *ddata, struct type_delimit *td)
|
4219 | 4254 | return 0;
|
4220 | 4255 | }
|
4221 | 4256 |
|
| 4257 | +static privileged int |
| 4258 | +demangle_read_type(struct demangle_data *ddata, struct type_delimit *td) |
| 4259 | +{ |
| 4260 | + if (ddata->depth == MAX_DEPTH) |
| 4261 | + __builtin_longjmp(ddata->jmpbuf, 1); |
| 4262 | + ++ddata->depth; |
| 4263 | + int res = demangle_read_type_impl(ddata, td); |
| 4264 | + --ddata->depth; |
| 4265 | + return res; |
| 4266 | +} |
| 4267 | + |
4222 | 4268 | static privileged int
|
4223 | 4269 | demangle_copy_output(struct demangle_data *ddata, char *buf,
|
4224 | 4270 | const struct vector_str *v, size_t buflen)
|
|
0 commit comments