@@ -150,8 +150,11 @@ PyResult<PyString *> PyString::create(const Bytes &bytes, const std::string &enc
150150 if (byte < std::byte{ 128 }) {
151151 result.push_back (static_cast <char >(byte));
152152 } else {
153- result.push_back (0xc2 + (static_cast <unsigned char >(byte) > 0xbf ));
154- result.push_back ((static_cast <char >(byte) & 0x3f ) + 0x80 );
153+ result.push_back (
154+ static_cast <unsigned char >(0xc2 ) + static_cast <unsigned char >(byte) > 0xbf );
155+ result.push_back (static_cast <char >(
156+ (static_cast <unsigned char >(byte) & static_cast <unsigned char >(0x3f ))
157+ + static_cast <unsigned char >(0x80 )));
155158 }
156159 }
157160 return PyString::create (result);
@@ -1864,9 +1867,14 @@ PyResult<PyObject *> PyString::translate(PyObject *table) const
18641867 if (mapped_cp > 0x110000 || mapped_cp < 0 ) {
18651868 return Err (value_error (" character mapping must be in range(0x110000)" ));
18661869 }
1867- auto el = utf8::utf8chr (mapped_cp.get_ui ());
1870+ auto mapped_cp_ui = mapped_cp.get_ui ();
1871+ if (!fits_in<uint32_t >(mapped_cp_ui)) {
1872+ return Err (value_error (
1873+ " character mapping value {} does not fit in uint32_t" , mapped_cp_ui));
1874+ }
1875+ auto el = utf8::utf8chr (static_cast <uint32_t >(mapped_cp_ui));
18681876 if (!el.has_value ()) {}
1869- cache[mapped_cp. get_ui ( )] = *el;
1877+ cache[static_cast < uint32_t >(mapped_cp_ui )] = *el;
18701878 result.append (*el);
18711879 } else if (mapped_value.unwrap ()->type ()->issubclass (types::str ())) {
18721880 auto mapped_str = static_cast <const PyString &>(*mapped_value.unwrap ()).value ();
0 commit comments