Skip to content

Commit 7ae9cbe

Browse files
committed
fix: can not connect to ZooKeeper 3.3
deserialization of `ConnectResponse.readonly` is simply wrong.
1 parent cd9f1a2 commit 7ae9cbe

File tree

2 files changed

+8
-6
lines changed

2 files changed

+8
-6
lines changed

src/proto/connect.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -64,12 +64,12 @@ impl<'a> DeserializableRecord<'a> for ConnectResponse<'a> {
6464
)));
6565
}
6666
let len = unsafe { buf.get_unchecked_i32() };
67-
if len <= 0 || len != (buf.len() - 1) as i32 {
67+
if len <= 0 || len > buf.len() as i32 {
6868
return Err(DeserializeError::UnmarshalError(format!("invalid session password length {len}")));
6969
}
7070
let len = len as usize;
7171
let password = unsafe { buf.get_unchecked(..len) };
72-
let readonly = unsafe { *buf.get_unchecked(len) };
72+
let readonly = if len == buf.len() { 0 } else { unsafe { *buf.get_unchecked(len) } };
7373
if readonly != 0 && readonly != 1 {
7474
return Err(DeserializeError::UnmarshalError(format!("invalid session readonly value {readonly}")));
7575
}

tests/zookeeper.rs

+6-4
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@ fn zookeeper_image() -> GenericImage {
4545
zookeeper_image_with_properties(Vec::default())
4646
}
4747

48-
fn zookeeper34_image() -> GenericImage {
49-
zookeeper_image_with_version_and_properties("3.4", Vec::default())
48+
fn zookeeper_image_with_version<'a>(version: &'a str) -> GenericImage {
49+
zookeeper_image_with_version_and_properties(version, Vec::default())
5050
}
5151

5252
async fn example() {
@@ -621,10 +621,12 @@ async fn test_create_container() {
621621
assert_that!(client.delete("/container", None).await.unwrap_err()).is_equal_to(zk::Error::NoNode);
622622
}
623623

624+
#[test_case("3.3"; "3.3")]
625+
#[test_case("3.4"; "3.4")]
624626
#[test_log::test(tokio::test)]
625-
async fn test_zookeeper34() {
627+
async fn test_zookeeper_old_server(version: &'static str) {
626628
let docker = DockerCli::default();
627-
let zookeeper = docker.run(zookeeper34_image());
629+
let zookeeper = docker.run(zookeeper_image_with_version(version));
628630
let zk_port = zookeeper.get_host_port(2181);
629631
let cluster = format!("127.0.0.1:{}", zk_port);
630632
let client = zk::Client::builder().assume_server_version(3, 4, u32::MAX).connect(&cluster).await.unwrap();

0 commit comments

Comments
 (0)