@@ -770,6 +770,12 @@ static void vstate_spill(struct generate_json_data *data)
770770 RB_OBJ_WRITTEN (vstate , Qundef , state -> sort_keys );
771771}
772772
773+ static inline VALUE json_to_s (VALUE obj )
774+ {
775+ VALUE tmp = rb_funcall (obj , i_to_s , 0 );
776+ return StringValue (tmp );
777+ }
778+
773779static inline VALUE json_call_to_json (struct generate_json_data * data , VALUE obj )
774780{
775781 if (RB_UNLIKELY (!data -> vstate )) {
@@ -865,7 +871,12 @@ NOINLINE(static) VALUE convert_invalid_encoding(struct generate_json_data *data,
865871 }
866872 }
867873
868- return rb_rescue (encode_json_string_try , str , encode_json_string_rescue , str );
874+ str = rb_rescue (encode_json_string_try , str , encode_json_string_rescue , str );
875+ Check_Type (str , T_STRING );
876+ if (!valid_json_string_p (str )) {
877+ raise_generator_error (str , "source sequence is illegal/malformed utf-8" );
878+ }
879+ return str ;
869880}
870881
871882ALWAYS_INLINE (static ) VALUE ensure_valid_encoding (struct generate_json_data * data , VALUE str , bool as_json_called , bool is_key )
@@ -1114,9 +1125,7 @@ static void generate_json_fallback(FBuffer *buffer, struct generate_json_data *d
11141125 Check_Type (tmp , T_STRING );
11151126 fbuffer_append_str (buffer , tmp );
11161127 } else {
1117- tmp = rb_funcall (obj , i_to_s , 0 );
1118- Check_Type (tmp , T_STRING );
1119- generate_json_string (buffer , data , tmp );
1128+ generate_json_string (buffer , data , json_to_s (obj ));
11201129 }
11211130}
11221131
@@ -1157,8 +1166,7 @@ static void generate_json_bignum(FBuffer *buffer, struct generate_json_data *dat
11571166 generate_json_rfc8785_number (buffer , obj );
11581167 return ;
11591168 }
1160- VALUE tmp = rb_funcall (obj , i_to_s , 0 );
1161- fbuffer_append_str (buffer , StringValue (tmp ));
1169+ fbuffer_append_str (buffer , json_to_s (obj ));
11621170}
11631171
11641172static void generate_json_float (FBuffer * buffer , struct generate_json_data * data , VALUE obj )
@@ -1177,11 +1185,10 @@ static void generate_json_float(FBuffer *buffer, struct generate_json_data *data
11771185 return ;
11781186 }
11791187 }
1180- raise_generator_error (obj , "%" PRIsVALUE " not allowed in JSON" , rb_funcall (obj , i_to_s , 0 ));
1188+ raise_generator_error (obj , "%" PRIsVALUE " not allowed in JSON" , json_to_s (obj ));
11811189 }
11821190
1183- VALUE tmp = rb_funcall (obj , i_to_s , 0 );
1184- fbuffer_append_str (buffer , tmp );
1191+ fbuffer_append_str (buffer , json_to_s (obj ));
11851192 return ;
11861193 }
11871194
0 commit comments