From a34f0aac5ba1ece6d55acc28b7924e3025e60e02 Mon Sep 17 00:00:00 2001 From: Manos Pitsidianakis Date: Mon, 9 Nov 2020 00:40:32 +0200 Subject: [PATCH] melib: fix bincode serialization Previous commit changed bincode deserializes in maildir and sqlite3.rs from bincode::deserialize_from to using bincode::config::DefaultOptions and bincode::Options trait's method deserialize_from. However, these two different deserializes use a different default settings: https://github.com/servo/bincode/issues/348 Specifically, varint encoding for integers is the default for DefaultOptions but not when using bincode::{de,}serialize_* functions. That means that serialized structs were not able to be deserialized. This commit makes all {de,}serializations use the DefaultOptions interface rather than the top level functions. --- melib/src/backends/maildir/backend.rs | 8 ++++++-- melib/src/backends/maildir/stream.rs | 6 +++++- melib/src/collection.rs | 6 +++++- melib/src/sqlite3.rs | 7 ++++--- src/conf/accounts.rs | 6 +++++- 5 files changed, 25 insertions(+), 8 deletions(-) diff --git a/melib/src/backends/maildir/backend.rs b/melib/src/backends/maildir/backend.rs index de0ba249a..d9aef7232 100644 --- a/melib/src/backends/maildir/backend.rs +++ b/melib/src/backends/maildir/backend.rs @@ -289,7 +289,11 @@ impl MailBackend for MaildirType { f.set_permissions(permissions)?; let writer = io::BufWriter::new(f); - bincode::serialize_into(writer, &env)?; + bincode::Options::serialize_into( + bincode::config::DefaultOptions::new(), + writer, + &env, + )?; } (sender)( account_hash, @@ -1366,7 +1370,7 @@ fn add_path_to_index( permissions.set_mode(0o600); // Read/write for owner only. f.set_permissions(permissions)?; let writer = io::BufWriter::new(f); - bincode::serialize_into(writer, &env)?; + bincode::Options::serialize_into(bincode::config::DefaultOptions::new(), writer, &env)?; } Ok(env) } diff --git a/melib/src/backends/maildir/stream.rs b/melib/src/backends/maildir/stream.rs index 24207708c..728bd050d 100644 --- a/melib/src/backends/maildir/stream.rs +++ b/melib/src/backends/maildir/stream.rs @@ -162,7 +162,11 @@ impl MaildirStream { f.set_permissions(permissions)?; let writer = io::BufWriter::new(f); - bincode::serialize_into(writer, &env)?; + bincode::Options::serialize_into( + bincode::config::DefaultOptions::new(), + writer, + &env, + )?; } if !env.is_seen() { unseen_total += 1; diff --git a/melib/src/collection.rs b/melib/src/collection.rs index 433133cc1..a789bc362 100644 --- a/melib/src/collection.rs +++ b/melib/src/collection.rs @@ -88,7 +88,11 @@ impl Drop for Collection { } }; let writer = io::BufWriter::new(f); - bincode::serialize_into(writer, &self.threads).unwrap(); + let _ = bincode::Options::serialize_into( + bincode::config::DefaultOptions::new(), + writer, + &self.thread, + ); } } } diff --git a/melib/src/sqlite3.rs b/melib/src/sqlite3.rs index 8d221a980..4a1a724a6 100644 --- a/melib/src/sqlite3.rs +++ b/melib/src/sqlite3.rs @@ -135,9 +135,10 @@ pub fn reset_db(description: &DatabaseDescription, identifier: Option<&str>) -> impl ToSql for Envelope { fn to_sql(&self) -> rusqlite::Result { - let v: Vec = bincode::serialize(self).map_err(|e| { - rusqlite::Error::ToSqlConversionFailure(Box::new(MeliError::new(e.to_string()))) - })?; + let v: Vec = bincode::Options::serialize(bincode::config::DefaultOptions::new(), self) + .map_err(|e| { + rusqlite::Error::ToSqlConversionFailure(Box::new(MeliError::new(e.to_string()))) + })?; Ok(ToSqlOutput::from(v)) } } diff --git a/src/conf/accounts.rs b/src/conf/accounts.rs index 980e8a8d9..d1a57336e 100644 --- a/src/conf/accounts.rs +++ b/src/conf/accounts.rs @@ -406,7 +406,11 @@ impl Drop for Account { permissions.set_mode(0o600); // Read/write for owner only. f.set_permissions(permissions).unwrap(); let writer = io::BufWriter::new(f); - if let Err(err) = bincode::serialize_into(writer, &self.collection) { + if let Err(err) = bincode::Options::serialize_into( + bincode::config::DefaultOptions::new(), + writer, + &self.collection, + ) { eprintln!("{}", err); }; };