Skip to content

Commit c031d8e

Browse files
committed
fix: can not connect to ZooKeeper 3.3
deserialization of `ConnectResponse.readonly` is simply wrong.
1 parent 20b0ddd commit c031d8e

File tree

2 files changed

+14
-5
lines changed

2 files changed

+14
-5
lines changed

src/proto/connect.rs

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

tests/zookeeper.rs

+12-3
Original file line numberDiff line numberDiff line change
@@ -368,8 +368,15 @@ impl Cluster {
368368
pub async fn with_options(options: ClusterOptions<'_>) -> Self {
369369
let mut dir = LazyTempDir::new();
370370
let tls = if options.tls.unwrap_or_else(|| env_toggle("ZK_TEST_TLS")) {
371-
Some(Tls::new(dir.tempdir().clone()))
371+
let tls = Tls::new(dir.tempdir().clone());
372+
println!(
373+
"starting tls zookeeper server {} {} hostname verification ...",
374+
options.tag,
375+
if tls.hostname_verification { "with" } else { "without" }
376+
);
377+
Some(tls)
372378
} else {
379+
println!("starting plaintext zookeeper server {} ...", options.tag);
373380
None
374381
};
375382
let docker = Arc::new(DockerCli::default());
@@ -913,9 +920,11 @@ async fn test_create_container() {
913920
assert_that!(client.delete("/container", None).await.unwrap_err()).is_equal_to(zk::Error::NoNode);
914921
}
915922

923+
#[test_case("3.3"; "3.3")]
924+
#[test_case("3.4"; "3.4")]
916925
#[test_log::test(tokio::test)]
917-
async fn test_zookeeper34() {
918-
let cluster = Cluster::with_options(ClusterOptions { tls: Some(false), tag: "3.4", ..Default::default() }).await;
926+
async fn test_zookeeper_old_server(tag: &'static str) {
927+
let cluster = Cluster::with_options(ClusterOptions { tls: Some(false), tag, ..Default::default() }).await;
919928

920929
let client = cluster.custom_client(None, |connector| connector.server_version(3, 4, u32::MAX)).await.unwrap();
921930
let (stat, _sequence) = client.create("/a", b"a1", PERSISTENT_OPEN).await.unwrap();

0 commit comments

Comments
 (0)