From 7bf8b670c7518a6b31916bc0720f9d5ac57807c9 Mon Sep 17 00:00:00 2001 From: Sam Saffron Date: Mon, 17 Jan 2022 10:48:18 +1100 Subject: [PATCH] replace (int)RSTRING_LEN(...) with RSTRING_LENINT(...) Casting the result of RSTRING_LEN on 64-bit long systems with 32-bit ints can lead to truncation errors when dealing with gigantic strings. RSTRING_LENINT was introduced in Ruby 1.9.2 to avoid this problem, so make use of it. It's used by by several standard extensions (openssl, zlib) and expected to remain part of the supported Ruby C API. --- ext/mini_racer_extension/mini_racer_extension.cc | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/ext/mini_racer_extension/mini_racer_extension.cc b/ext/mini_racer_extension/mini_racer_extension.cc index 1c952d4..318f73f 100644 --- a/ext/mini_racer_extension/mini_racer_extension.cc +++ b/ext/mini_racer_extension/mini_racer_extension.cc @@ -346,7 +346,7 @@ static VALUE rb_platform_set_flag_as_str(VALUE _klass, VALUE flag_as_str) { if (!strcmp(RSTRING_PTR(flag_as_str), "--single_threaded")) { single_threaded = true; } - V8::SetFlagsFromString(RSTRING_PTR(flag_as_str), (int)RSTRING_LEN(flag_as_str)); + V8::SetFlagsFromString(RSTRING_PTR(flag_as_str), RSTRING_LENINT(flag_as_str)); } else { platform_already_initialized = true; } @@ -724,7 +724,7 @@ static Local convert_ruby_to_v8(Isolate* isolate, Local context, case T_FLOAT: return scope.Escape(Number::New(isolate, NUM2DBL(value))); case T_STRING: - return scope.Escape(String::NewFromUtf8(isolate, RSTRING_PTR(value), NewStringType::kNormal, (int)RSTRING_LEN(value)).ToLocalChecked()); + return scope.Escape(String::NewFromUtf8(isolate, RSTRING_PTR(value), NewStringType::kNormal, RSTRING_LENINT(value)).ToLocalChecked()); case T_NIL: return scope.Escape(Null(isolate)); case T_TRUE: @@ -752,7 +752,7 @@ static Local convert_ruby_to_v8(Isolate* isolate, Local context, return scope.Escape(object); case T_SYMBOL: value = rb_funcall(value, rb_intern("to_s"), 0); - return scope.Escape(String::NewFromUtf8(isolate, RSTRING_PTR(value), NewStringType::kNormal, (int)RSTRING_LEN(value)).ToLocalChecked()); + return scope.Escape(String::NewFromUtf8(isolate, RSTRING_PTR(value), NewStringType::kNormal, RSTRING_LENINT(value)).ToLocalChecked()); case T_DATA: klass = rb_funcall(value, rb_intern("class"), 0); if (klass == rb_cTime || klass == rb_cDateTime) @@ -1164,13 +1164,13 @@ static VALUE rb_context_eval_unsafe(VALUE self, VALUE str, VALUE filename) { HandleScope handle_scope(isolate); Local eval = String::NewFromUtf8(isolate, RSTRING_PTR(str), - NewStringType::kNormal, (int)RSTRING_LEN(str)).ToLocalChecked(); + NewStringType::kNormal, RSTRING_LENINT(str)).ToLocalChecked(); Local local_filename; if (filename != Qnil) { local_filename = String::NewFromUtf8(isolate, RSTRING_PTR(filename), - NewStringType::kNormal, (int)RSTRING_LEN(filename)).ToLocalChecked(); + NewStringType::kNormal, RSTRING_LENINT(filename)).ToLocalChecked(); eval_params.filename = &local_filename; } else { eval_params.filename = NULL; @@ -1356,7 +1356,7 @@ static VALUE rb_external_function_notify_v8(VALUE self) { Local v8_str = String::NewFromUtf8(isolate, RSTRING_PTR(name), - NewStringType::kNormal, (int)RSTRING_LEN(name)) + NewStringType::kNormal, RSTRING_LENINT(name)) .ToLocalChecked(); // Note that self (rb_cExternalFunction) is a pure Ruby T_OBJECT, @@ -1376,7 +1376,7 @@ static VALUE rb_external_function_notify_v8(VALUE self) { Local eval = String::NewFromUtf8(isolate, RSTRING_PTR(parent_object_eval), NewStringType::kNormal, - (int)RSTRING_LEN(parent_object_eval)) + RSTRING_LENINT(parent_object_eval)) .ToLocalChecked(); MaybeLocal