Skip to content

Commit 3fdb79d

Browse files
Do not panic when PrepareOk fails to decode (#2572)
1 parent 8c7f541 commit 3fdb79d

File tree

1 file changed

+13
-7
lines changed

1 file changed

+13
-7
lines changed

sqlx-mysql/src/protocol/statement/prepare_ok.rs

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,22 +16,28 @@ pub(crate) struct PrepareOk {
1616
}
1717

1818
impl Decode<'_, Capabilities> for PrepareOk {
19-
fn decode_with(mut buf: Bytes, _: Capabilities) -> Result<Self, Error> {
20-
let status = buf.get_u8();
19+
fn decode_with(buf: Bytes, _: Capabilities) -> Result<Self, Error> {
20+
const SIZE: usize = 12;
21+
22+
let mut slice = buf.get(..SIZE).ok_or_else(|| {
23+
err_protocol!("PrepareOk expected 12 bytes but got {} bytes", buf.len())
24+
})?;
25+
26+
let status = slice.get_u8();
2127
if status != 0x00 {
2228
return Err(err_protocol!(
2329
"expected 0x00 (COM_STMT_PREPARE_OK) but found 0x{:02x}",
2430
status
2531
));
2632
}
2733

28-
let statement_id = buf.get_u32_le();
29-
let columns = buf.get_u16_le();
30-
let params = buf.get_u16_le();
34+
let statement_id = slice.get_u32_le();
35+
let columns = slice.get_u16_le();
36+
let params = slice.get_u16_le();
3137

32-
buf.advance(1); // reserved: string<1>
38+
slice.advance(1); // reserved: string<1>
3339

34-
let warnings = buf.get_u16_le();
40+
let warnings = slice.get_u16_le();
3541

3642
Ok(Self {
3743
statement_id,

0 commit comments

Comments
 (0)