summaryrefslogtreecommitdiff
path: root/gc.c
diff options
context:
space:
mode:
authorAlan Wu <XrXr@users.noreply.github.com>2020-09-03 15:51:14 -0400
committerAlan Wu <XrXr@users.noreply.github.com>2020-09-03 17:41:58 -0400
commitd4585e7470163c794025c2d56930c0e5a5fbae3c (patch)
treefd477b8353061503898fe83b4ec4776e42b69236 /gc.c
parente0a749c0452f8681451a4510d4f60617a5902b50 (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.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/gc.c b/gc.c
index 535f526391..99c79fe10c 100644
--- a/gc.c
+++ b/gc.c
@@ -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: {