Skip to content

Commit 1295e41

Browse files
author
Michael Ward
committed
[Rust] fixed RustGenerator::generateEncoderVarData() to cap slice len to primitive type size
1 parent 2c062f0 commit 1295e41

File tree

4 files changed

+51
-5
lines changed

4 files changed

+51
-5
lines changed

build.gradle

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -679,8 +679,9 @@ tasks.register('generateRustTestCodecs', JavaExec) {
679679
'sbe-tool/src/test/resources/issue1028.xml',
680680
'sbe-tool/src/test/resources/issue1057.xml',
681681
'sbe-tool/src/test/resources/issue1066.xml',
682-
'sbe-tool/src/test/resources/fixed-sized-primitive-array-types.xml',
682+
'sbe-tool/src/test/resources/basic-variable-length-schema.xml',
683683
'sbe-tool/src/test/resources/example-bigendian-test-schema.xml',
684+
'sbe-tool/src/test/resources/fixed-sized-primitive-array-types.xml',
684685
'sbe-tool/src/test/resources/nested-composite-name.xml',
685686
]
686687
}

rust/Cargo.toml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
name = "sbe_rust_example"
33
version = "0.1.0"
44
authors = []
5-
edition = "2018"
5+
edition = "2021"
66
publish = false
77

88
[dependencies]
@@ -21,10 +21,11 @@ issue_1057 = { path = "../generated/rust/issue1057" }
2121
issue_1066 = { path = "../generated/rust/issue1066" }
2222
baseline_bigendian = { path = "../generated/rust/baseline-bigendian" }
2323
nested_composite_name = { path = "../generated/rust/nested-composite-name" }
24+
sbe_tests = { path = "../generated/rust/sbe_tests" }
2425
fixed_sized_primitive_array = { path = "../generated/rust/fixed_sized_primitive_array" }
2526

2627
[dev-dependencies]
27-
criterion = "0.5"
28+
criterion = "0.7"
2829

2930
[[bench]]
3031
name = "car_benchmark"
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
use sbe_tests::{
2+
message_header_codec::MessageHeaderDecoder,
3+
test_message_1_codec::{
4+
TestMessage1Decoder, SBE_BLOCK_LENGTH, SBE_SCHEMA_ID, SBE_SCHEMA_VERSION, SBE_TEMPLATE_ID,
5+
},
6+
};
7+
use sbe_tests::{
8+
WriteBuf,
9+
{message_header_codec, test_message_1_codec::TestMessage1Encoder, Encoder, ReadBuf},
10+
};
11+
12+
#[test]
13+
fn should_limit_var_data_length() {
14+
// encode...
15+
let mut buffer = vec![0u8; 1024];
16+
let mut encoder = TestMessage1Encoder::default();
17+
encoder = encoder.wrap(
18+
WriteBuf::new(buffer.as_mut_slice()),
19+
message_header_codec::ENCODED_LENGTH,
20+
);
21+
encoder = encoder.header(0).parent().unwrap();
22+
23+
let password: String = (0..1024).map(|_| 'x' as char).collect();
24+
encoder.encrypted_new_password(password.as_bytes());
25+
assert_eq!(263, encoder.get_limit());
26+
27+
// decode...
28+
let buf = ReadBuf::new(buffer.as_slice());
29+
let header = MessageHeaderDecoder::default().wrap(buf, 0);
30+
assert_eq!(SBE_BLOCK_LENGTH, header.block_length());
31+
assert_eq!(SBE_SCHEMA_VERSION, header.version());
32+
assert_eq!(SBE_TEMPLATE_ID, header.template_id());
33+
assert_eq!(SBE_SCHEMA_ID, header.schema_id());
34+
35+
let mut decoder = TestMessage1Decoder::default().header(header, 0);
36+
let coord = decoder.encrypted_new_password_decoder();
37+
let password = String::from_utf8_lossy(decoder.encrypted_new_password_slice(coord));
38+
assert_eq!(254, password.len());
39+
password
40+
.as_bytes()
41+
.iter()
42+
.for_each(|x| assert_eq!(b'x', *x));
43+
}

sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/rust/RustGenerator.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -356,14 +356,15 @@ static void generateEncoderVarData(
356356
indent(sb, level, "pub fn %s(&mut self, value: %s) {\n", propertyName, varDataType);
357357

358358
indent(sb, level + 1, "let limit = self.get_limit();\n");
359-
indent(sb, level + 1, "let data_length = value.len();\n");
359+
indent(sb, level + 1, "let data_length = value.len().min((%s::MAX - 1) as usize);\n",
360+
rustTypeName(lengthType));
360361
indent(sb, level + 1, "self.set_limit(limit + %d + data_length);\n", lengthType.size());
361362

362363
indent(sb, level + 1,
363364
"self.get_buf_mut().put_%s_at(limit, data_length as %1$s);\n",
364365
rustTypeName(lengthType));
365366

366-
indent(sb, level + 1, "self.get_buf_mut().put_slice_at(limit + %d, value%s);\n",
367+
indent(sb, level + 1, "self.get_buf_mut().put_slice_at(limit + %d, &value[0..data_length]%s);\n",
367368
lengthType.size(),
368369
toBytesFn);
369370

0 commit comments

Comments
 (0)