Skip to content

Commit f6a0800

Browse files
committed
Limit bactrace length from Exception#full_message
1 parent 730b009 commit f6a0800

File tree

1 file changed

+13
-12
lines changed

1 file changed

+13
-12
lines changed

eval_error.c

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ print_errinfo(const VALUE eclass, const VALUE errat, const VALUE emesg, const VA
228228
}
229229

230230
static void
231-
print_backtrace(const VALUE eclass, const VALUE errat, const VALUE str, int reverse)
231+
print_backtrace(const VALUE eclass, const VALUE errat, const VALUE str, int reverse, long backtrace_limit)
232232
{
233233
if (!NIL_P(errat)) {
234234
long i;
@@ -253,8 +253,8 @@ print_backtrace(const VALUE eclass, const VALUE errat, const VALUE str, int reve
253253
}
254254

255255
// skip for explicit limit
256-
if (rb_backtrace_length_limit >= 0 && len > rb_backtrace_length_limit + 2) {
257-
skip_start = rb_backtrace_length_limit + 1;
256+
if (backtrace_limit >= 0 && len > backtrace_limit + 2) {
257+
skip_start = backtrace_limit + 1;
258258
skip_len = len - skip_start;
259259
}
260260

@@ -289,7 +289,7 @@ shown_cause_p(VALUE cause, VALUE *shown_causes)
289289
}
290290

291291
static void
292-
show_cause(VALUE errinfo, VALUE str, VALUE highlight, VALUE reverse, VALUE *shown_causes)
292+
show_cause(VALUE errinfo, VALUE str, VALUE highlight, VALUE reverse, long backtrace_limit, VALUE *shown_causes)
293293
{
294294
VALUE cause = rb_attr_get(errinfo, id_cause);
295295
if (!NIL_P(cause) && rb_obj_is_kind_of(cause, rb_eException) &&
@@ -298,14 +298,14 @@ show_cause(VALUE errinfo, VALUE str, VALUE highlight, VALUE reverse, VALUE *show
298298
VALUE errat = rb_get_backtrace(cause);
299299
VALUE emesg = rb_get_message(cause);
300300
if (reverse) {
301-
show_cause(cause, str, highlight, reverse, shown_causes);
302-
print_backtrace(eclass, errat, str, TRUE);
301+
show_cause(cause, str, highlight, reverse, backtrace_limit, shown_causes);
302+
print_backtrace(eclass, errat, str, TRUE, backtrace_limit);
303303
print_errinfo(eclass, errat, emesg, str, highlight!=0);
304304
}
305305
else {
306306
print_errinfo(eclass, errat, emesg, str, highlight!=0);
307-
print_backtrace(eclass, errat, str, FALSE);
308-
show_cause(cause, str, highlight, reverse, shown_causes);
307+
print_backtrace(eclass, errat, str, FALSE, backtrace_limit);
308+
show_cause(cause, str, highlight, reverse, backtrace_limit, shown_causes);
309309
}
310310
}
311311
}
@@ -315,6 +315,7 @@ rb_error_write(VALUE errinfo, VALUE emesg, VALUE errat, VALUE str, VALUE highlig
315315
{
316316
volatile VALUE eclass;
317317
VALUE shown_causes = 0;
318+
long backtrace_limit = rb_backtrace_length_limit;
318319

319320
if (NIL_P(errinfo))
320321
return;
@@ -345,14 +346,14 @@ rb_error_write(VALUE errinfo, VALUE emesg, VALUE errat, VALUE str, VALUE highlig
345346
len = p - (msg = buff);
346347
}
347348
write_warn2(str, msg, len);
348-
show_cause(errinfo, str, highlight, reverse, &shown_causes);
349-
print_backtrace(eclass, errat, str, TRUE);
349+
show_cause(errinfo, str, highlight, reverse, backtrace_limit, &shown_causes);
350+
print_backtrace(eclass, errat, str, TRUE, backtrace_limit);
350351
print_errinfo(eclass, errat, emesg, str, highlight!=0);
351352
}
352353
else {
353354
print_errinfo(eclass, errat, emesg, str, highlight!=0);
354-
print_backtrace(eclass, errat, str, FALSE);
355-
show_cause(errinfo, str, highlight, reverse, &shown_causes);
355+
print_backtrace(eclass, errat, str, FALSE, backtrace_limit);
356+
show_cause(errinfo, str, highlight, reverse, backtrace_limit, &shown_causes);
356357
}
357358
}
358359

0 commit comments

Comments
 (0)