@@ -220,7 +220,7 @@ gen_src_to_dst_encodings_key(const char *key_buf, const char *sname, const char
220220 memcpy (p , ":" , 1 );
221221 p += 1 ;
222222 size_t dlen = strlen (dname );
223- RUBY_ASSERT (slen + dlen < SRC_ENC_TO_DST_ENC_KEY_SIZE );
223+ RUBY_ASSERT (slen + dlen + 1 < SRC_ENC_TO_DST_ENC_KEY_SIZE );
224224 memcpy (p , dname , dlen );
225225}
226226
@@ -280,7 +280,8 @@ get_transcoder_entry(const char *sname, const char *dname)
280280 char key_buf [SRC_ENC_TO_DST_ENC_KEY_SIZE ] = { 0 };
281281 gen_src_to_dst_encodings_key (key_buf , sname , dname );
282282 VALUE entry_val ;
283- if (rb_managed_st_table_lookup (fast_transcoder_entry_table , (st_data_t )key_buf , & entry_val )) {
283+ VALUE tbl = RUBY_ATOMIC_VALUE_LOAD (fast_transcoder_entry_table );
284+ if (rb_managed_st_table_lookup (tbl , (st_data_t )key_buf , & entry_val )) {
284285 return (transcoder_entry_t * )entry_val ;
285286 }
286287 return NULL ;
@@ -1057,7 +1058,7 @@ trans_open_i(const char *sname, const char *dname, int depth, void *arg)
10571058 if (!toarg -> entries ) {
10581059 size_t num = depth + 1 + toarg -> num_additional + 1 ;
10591060 toarg -> entries = ALLOC_N (transcoder_entry_t * , num );
1060- memset (toarg -> entries + num - 1 , 0 , sizeof (transcoder_entry_t * )); // last entry is 0
1061+ memset (toarg -> entries + num - 1 , 0 , sizeof (transcoder_entry_t * )); // last entry is 0 so we can loop over it
10611062 }
10621063 toarg -> entries [depth ] = get_transcoder_entry (sname , dname );
10631064}
0 commit comments