Skip to content
This repository was archived by the owner on Jan 22, 2025. It is now read-only.

Commit db21cc6

Browse files
committed
Fix versioned message json deserialization (#34808)
(cherry picked from commit 747df9c)
1 parent fbb11a8 commit db21cc6

File tree

1 file changed

+34
-20
lines changed
  • sdk/program/src/message/versions

1 file changed

+34
-20
lines changed

sdk/program/src/message/versions/mod.rs

Lines changed: 34 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use {
88
short_vec,
99
},
1010
serde::{
11-
de::{self, Deserializer, SeqAccess, Visitor},
11+
de::{self, Deserializer, SeqAccess, Unexpected, Visitor},
1212
ser::{SerializeTuple, Serializer},
1313
Deserialize, Serialize,
1414
},
@@ -198,7 +198,16 @@ impl<'de> Deserialize<'de> for MessagePrefix {
198198
formatter.write_str("message prefix byte")
199199
}
200200

201-
fn visit_u8<E>(self, byte: u8) -> Result<MessagePrefix, E> {
201+
// Serde's integer visitors bubble up to u64 so check the prefix
202+
// with this function instead of visit_u8. This approach is
203+
// necessary because serde_json directly calls visit_u64 for
204+
// unsigned integers.
205+
fn visit_u64<E: de::Error>(self, value: u64) -> Result<MessagePrefix, E> {
206+
if value > u8::MAX as u64 {
207+
Err(de::Error::invalid_type(Unexpected::Unsigned(value), &self))?;
208+
}
209+
210+
let byte = value as u8;
202211
if byte & MESSAGE_VERSION_PREFIX != 0 {
203212
Ok(MessagePrefix::Versioned(byte & !MESSAGE_VERSION_PREFIX))
204213
} else {
@@ -331,26 +340,32 @@ mod tests {
331340

332341
let mut message = LegacyMessage::new(&instructions, Some(&id1));
333342
message.recent_blockhash = Hash::new_unique();
343+
let wrapped_message = VersionedMessage::Legacy(message.clone());
334344

335-
let bytes1 = bincode::serialize(&message).unwrap();
336-
let bytes2 = bincode::serialize(&VersionedMessage::Legacy(message.clone())).unwrap();
345+
// bincode
346+
{
347+
let bytes = bincode::serialize(&message).unwrap();
348+
assert_eq!(bytes, bincode::serialize(&wrapped_message).unwrap());
337349

338-
assert_eq!(bytes1, bytes2);
350+
let message_from_bytes: LegacyMessage = bincode::deserialize(&bytes).unwrap();
351+
let wrapped_message_from_bytes: VersionedMessage =
352+
bincode::deserialize(&bytes).unwrap();
339353

340-
let message1: LegacyMessage = bincode::deserialize(&bytes1).unwrap();
341-
let message2: VersionedMessage = bincode::deserialize(&bytes2).unwrap();
354+
assert_eq!(message, message_from_bytes);
355+
assert_eq!(wrapped_message, wrapped_message_from_bytes);
356+
}
342357

343-
if let VersionedMessage::Legacy(message2) = message2 {
344-
assert_eq!(message, message1);
345-
assert_eq!(message1, message2);
346-
} else {
347-
panic!("should deserialize to legacy message");
358+
// serde_json
359+
{
360+
let string = serde_json::to_string(&message).unwrap();
361+
let message_from_string: LegacyMessage = serde_json::from_str(&string).unwrap();
362+
assert_eq!(message, message_from_string);
348363
}
349364
}
350365

351366
#[test]
352367
fn test_versioned_message_serialization() {
353-
let message = v0::Message {
368+
let message = VersionedMessage::V0(v0::Message {
354369
header: MessageHeader {
355370
num_required_signatures: 1,
356371
num_readonly_signed_accounts: 0,
@@ -375,15 +390,14 @@ mod tests {
375390
accounts: vec![0, 2, 3, 4],
376391
data: vec![],
377392
}],
378-
};
393+
});
379394

380-
let bytes = bincode::serialize(&VersionedMessage::V0(message.clone())).unwrap();
395+
let bytes = bincode::serialize(&message).unwrap();
381396
let message_from_bytes: VersionedMessage = bincode::deserialize(&bytes).unwrap();
397+
assert_eq!(message, message_from_bytes);
382398

383-
if let VersionedMessage::V0(message_from_bytes) = message_from_bytes {
384-
assert_eq!(message, message_from_bytes);
385-
} else {
386-
panic!("should deserialize to versioned message");
387-
}
399+
let string = serde_json::to_string(&message).unwrap();
400+
let message_from_string: VersionedMessage = serde_json::from_str(&string).unwrap();
401+
assert_eq!(message, message_from_string);
388402
}
389403
}

0 commit comments

Comments
 (0)