diff options
author | Alan Wu <XrXr@users.noreply.github.com> | 2020-09-03 15:51:14 -0400 |
---|---|---|
committer | Alan Wu <XrXr@users.noreply.github.com> | 2020-09-03 17:41:58 -0400 |
commit | d4585e7470163c794025c2d56930c0e5a5fbae3c (patch) | |
tree | fd477b8353061503898fe83b4ec4776e42b69236 /gc.c | |
parent | e0a749c0452f8681451a4510d4f60617a5902b50 (diff) |
Avoid potential for rb_raise() while crashing
rb_obj_raw_info is called while printing out crash messages and
sometimes called during garbage collection. Calling rb_raise() in these
situations is undesirable because it can start executing ensure blocks.
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/3512
Diffstat (limited to 'gc.c')
-rw-r--r-- | gc.c | 11 |
1 files changed, 10 insertions, 1 deletions
@@ -11702,6 +11702,15 @@ rb_raw_iseq_info(char *buff, const int buff_size, const rb_iseq_t *iseq) bool rb_ractor_p(VALUE rv); +static int +str_len_no_raise(VALUE str) +{ + long len = RSTRING_LEN(str); + if (len < 0) return 0; + if (len > INT_MAX) return INT_MAX; + return (int)len; +} + const char * rb_raw_obj_info(char *buff, const int buff_size, VALUE obj) { @@ -11789,7 +11798,7 @@ rb_raw_obj_info(char *buff, const int buff_size, VALUE obj) } break; case T_STRING: { - APPENDF((BUFF_ARGS, "%.*s", RSTRING_LENINT(obj), RSTRING_PTR(obj))); + APPENDF((BUFF_ARGS, "%.*s", str_len_no_raise(obj), RSTRING_PTR(obj))); break; } case T_MOVED: { |