`network::protocol::codec::Header::encode` is silently truncate-casting IPROTO_TYPE
pub struct Header {
pub sync: SyncIndex,
pub iproto_type: u32, // attention #1: `u32`
pub error_code: u32,
pub schema_version: u64,
}
impl Header {
// ...
pub fn encode(&self, stream: &mut impl Write) -> Result<(), Error> {
rmp::encode::write_map_len(stream, 2)?;
rmp::encode::write_pfix(stream, REQUEST_TYPE)?;
rmp::encode::write_pfix(stream, self.iproto_type as u8)?; // attention #2: `u32` as `u8`
rmp::encode::write_pfix(stream, SYNC)?;
rmp::encode::write_uint(stream, self.sync.0)?;
Ok(())
}
// ...
}
Сценарий среза байт после каста имеет место быть, так как функция публична, а также используется как в самом модуле, а затем, транзитивно, и в Пикодате. Также, я использую эту функцию для сериализации заголовка при обработке IPROTO_EXECUTE запросов, который, в теории, может получить запрос от нестандартного клиента и поломаться напрочь.
Предлагается поставить соответствующий assert, либо записывать беззнаковое число динамической длины при помощи rmp::encode::write_uint
.
Edited by Кирилл Безуглый