From 21b695bb43b8765f2c0452c26c9d09224a2ba56b Mon Sep 17 00:00:00 2001 From: Maor Kern Date: Thu, 6 Jun 2024 19:25:07 +0300 Subject: [PATCH] Read TLV length correctly in optional metadata --- src/binlog/events/table_map_event.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/binlog/events/table_map_event.rs b/src/binlog/events/table_map_event.rs index 720f739..4406a0f 100644 --- a/src/binlog/events/table_map_event.rs +++ b/src/binlog/events/table_map_event.rs @@ -9,7 +9,7 @@ use std::{borrow::Cow, cmp::min, convert::TryFrom, io, iter::Peekable}; use bitvec::prelude::*; -use byteorder::ReadBytesExt; +use byteorder::{LittleEndian, ReadBytesExt}; use saturating::Saturating as S; use crate::{ @@ -1159,7 +1159,13 @@ impl<'a> OptionalMetadataIter<'a> { /// Reads type-length-value value. fn read_tlv(&mut self) -> io::Result<(RawConst, &'a [u8])> { let t = self.data.read_u8()?; - let l = self.data.read_u8()? as usize; + // The length is encoded in 1, 3 or 8 bytes (https://github.com/mysql/mysql-server/blob/824e2b4064053f7daf17d7f3f84b7a3ed92e5fb4/libs/mysql/binlog/event/binlog_event.h#L812) + let l = match self.data.read_u8()? { + 252 => self.data.read_u16::()? as usize, + 253 => self.data.read_u24::()? as usize, + 254 => self.data.read_u64::()? as usize, + t => t as usize, + }; let v = match self.data.get(..l) { Some(v) => v, None => {