Skip to content

Commit 5ac5c3c

Browse files
committed
zcopy: invalid data tests and fixes
1 parent 3703595 commit 5ac5c3c

12 files changed

Lines changed: 647 additions & 20 deletions

File tree

tests/input/arrays.x

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,3 +61,11 @@ struct LimitedOpaqueArrays {
6161
struct UnlimitedOpaqueArray {
6262
opaque data<>;
6363
};
64+
65+
struct LimitedOpaqueArray {
66+
string data<4>;
67+
};
68+
69+
struct UnlimitedArrayOfLimited {
70+
LimitedOpaqueArray a<>;
71+
};

tests/input/optional.x

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,3 +42,17 @@ struct exportnode {
4242
groups ex_groups;
4343
exportnode *ex_next;
4444
};
45+
46+
enum MyEnum {
47+
ZERO = 0,
48+
ONE = 1
49+
};
50+
51+
struct EnumNode {
52+
MyEnum a;
53+
EnumNode *next;
54+
};
55+
56+
struct EnumChainStart {
57+
EnumNode* first;
58+
};

tests/input/unions.x

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,3 +87,24 @@ struct HasUnion {
8787
NumLeaves c;
8888
Plant nocache;
8989
};
90+
91+
union Bar switch (Cases blah) {
92+
case one:
93+
int a;
94+
case two:
95+
void;
96+
};
97+
98+
union AnOption switch (bool yes) {
99+
case TRUE:
100+
int a;
101+
case FALSE:
102+
void;
103+
};
104+
105+
union Foo switch(Cases blah) {
106+
case one:
107+
int *a;
108+
case two:
109+
void;
110+
};

tests/zcopy/tests/arrays.rs

Lines changed: 203 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1+
use std::{ffi::OsString, str::FromStr};
2+
13
use rand::distr::{Alphanumeric, SampleString};
24

35
include!(concat!(env!("OUT_DIR"), "/arrays.rs"));
46

57
use crate::arrays::*;
6-
use xdr_lib::Reader;
8+
use xdr_lib::{DeserializeError, Reader};
79

810
#[test]
911
fn test_opaque_arrays_minsize() {
@@ -36,6 +38,92 @@ fn test_opaque_arrays() {
3638
assert_eq!(reader.get_bytes_3(), bytes3.as_slice());
3739
}
3840

41+
#[test]
42+
fn test_opaque_arrays_size_check() {
43+
let data: Vec<u8> = vec![0x0, 0x0];
44+
assert_eq!(
45+
OpaqueArraysReader::new(data.as_slice()),
46+
Err(xdr_lib::DeserializeError)
47+
);
48+
}
49+
50+
#[test]
51+
fn test_opaque_arrays_missing_bytes_2_count() {
52+
let data: Vec<u8> = vec![0xF, 0xF, 0xF];
53+
assert_eq!(
54+
OpaqueArraysReader::new(data.as_slice()),
55+
Err(xdr_lib::DeserializeError)
56+
);
57+
58+
let data: Vec<u8> = vec![0xF, 0xF, 0xF, 0x1, 0x1, 0x1];
59+
assert_eq!(
60+
OpaqueArraysReader::new(data.as_slice()),
61+
Err(xdr_lib::DeserializeError)
62+
);
63+
}
64+
65+
#[test]
66+
fn test_opaque_arrays_missing_bytes_2() {
67+
#[rustfmt::skip]
68+
let data: Vec<u8> = vec![
69+
0xF, 0xF, 0xF, 0x0, // bytes
70+
0x0, 0x0, 0x0, 0x1, // bytes_2_count
71+
0x1 // bytes_2
72+
];
73+
74+
assert_eq!(
75+
OpaqueArraysReader::new(data.as_slice()),
76+
Err(xdr_lib::DeserializeError)
77+
);
78+
}
79+
80+
#[test]
81+
fn test_opaque_arrays_bytes_2_too_long() {
82+
#[rustfmt::skip]
83+
let data: Vec<u8> = vec![
84+
0xF, 0xF, 0xF, 0x0, // bytes
85+
0x0, 0x0, 0x0, 0x4, // bytes_2_count
86+
0x1, 0xF, 0xF, 0xF, // bytes_2
87+
0x0, 0x0, 0x0, 0x4, // bytes_3_count
88+
0x1, 0x1, 0x0, 0x0 // bytes_3
89+
];
90+
assert_eq!(
91+
OpaqueArraysReader::new(data.as_slice()),
92+
Err(xdr_lib::DeserializeError)
93+
);
94+
}
95+
96+
#[test]
97+
fn test_opaque_arrays_missing_bytes_3_count() {
98+
#[rustfmt::skip]
99+
let data: Vec<u8> = vec![
100+
0xF, 0xF, 0xF, 0x0, // bytes
101+
0x0, 0x0, 0x0, 0x1, // bytes_2_count
102+
0x1, 0xF, 0xF, 0xF, // bytes_2
103+
0x0, 0x0,
104+
];
105+
assert_eq!(
106+
OpaqueArraysReader::new(data.as_slice()),
107+
Err(xdr_lib::DeserializeError)
108+
);
109+
}
110+
111+
#[test]
112+
fn test_opaque_rrays_missing_bytes_3() {
113+
#[rustfmt::skip]
114+
let data: Vec<u8> = vec![
115+
0xF, 0xF, 0xF, 0x0, // bytes
116+
0x0, 0x0, 0x0, 0x1, // bytes_2_count
117+
0x1, 0xF, 0xF, 0xF, // bytes_2
118+
0x0, 0x0, 0x0, 0x5, // bytes_3_count
119+
0x1, 0x1, 0x0, 0x0 // bytes_3
120+
];
121+
assert_eq!(
122+
OpaqueArraysReader::new(data.as_slice()),
123+
Err(xdr_lib::DeserializeError)
124+
);
125+
}
126+
39127
#[test]
40128
fn test_opaque_arrays_reader() {
41129
let mut data = Vec::new();
@@ -81,11 +169,12 @@ fn test_int_arrays_reader() {
81169
let reader = IntArraysReader::new(&data).unwrap();
82170

83171
let mut fixed_iter = reader.get_fixed();
172+
assert_eq!(reader.get_fixed().get_count(), 4);
84173
assert_eq!(fixed_iter.next().unwrap().unwrap().get_a(), 1);
85174
assert_eq!(fixed_iter.next().unwrap().unwrap().get_a(), 2);
86175
assert_eq!(fixed_iter.next().unwrap().unwrap().get_a(), 3);
87176
assert_eq!(fixed_iter.next().unwrap().unwrap().get_a(), 4);
88-
assert!(fixed_iter.next().is_none());
177+
assert_eq!(fixed_iter.next(), None);
89178

90179
let mut limited_iter = reader.get_limited();
91180
assert_eq!(limited_iter.next().unwrap().unwrap().get_a(), 10);
@@ -101,6 +190,59 @@ fn test_int_arrays_reader() {
101190
assert_eq!(reader.get_width(), Ok(12 + 8 + 16));
102191
}
103192

193+
#[test]
194+
fn test_int_arrays_empty() {
195+
let data: Vec<u8> = Vec::new();
196+
assert_eq!(IntArraysReader::new(data.as_slice()), Err(DeserializeError));
197+
}
198+
199+
#[test]
200+
fn test_int_arrays_fixed_array_missing_element() {
201+
let data: Vec<u8> = vec![0xF, 0xE, 0xE];
202+
assert_eq!(IntArraysReader::new(data.as_slice()), Err(DeserializeError));
203+
}
204+
205+
#[test]
206+
fn test_int_arrays_fixed_array_limited_missing_count() {
207+
let data: Vec<u8> = vec![0xF, 0xE, 0xE, 0x0];
208+
assert_eq!(IntArraysReader::new(data.as_slice()), Err(DeserializeError));
209+
}
210+
211+
#[test]
212+
fn test_int_arrays_fixed_array_limited_under_count() {
213+
#[rustfmt::skip]
214+
let data: Vec<u8> = vec![
215+
0xF, 0xE, 0xE, 0x0, // fixed
216+
0x0, 0x0, 0x0, 0x2, // limited_count
217+
0x0, 0x0, 0x0, 0x1, // limited
218+
];
219+
assert_eq!(IntArraysReader::new(data.as_slice()), Err(DeserializeError));
220+
}
221+
222+
#[test]
223+
fn test_int_arrays_fixed_array_missing_unlimited_count() {
224+
let data: Vec<u8> = vec![
225+
0xF, 0xE, 0xE, 0x2, // fixed
226+
0x0, 0x0, 0x0, 0x2, // limited_count
227+
0x0, 0x0, 0x0, 0x1, // limited
228+
0x0, 0x0, 0x0, 0x1,
229+
];
230+
assert_eq!(IntArraysReader::new(data.as_slice()), Err(DeserializeError));
231+
}
232+
233+
#[test]
234+
fn test_int_arrays_fixed_array_under_unlimited_count() {
235+
#[rustfmt::skip]
236+
let data: Vec<u8> = vec![
237+
0xF, 0xE, 0xE, 0x2, // fixed
238+
0x0, 0x0, 0x0, 0x2, // limited_count
239+
0x0, 0x0, 0x0, 0x1, // limited
240+
0x0, 0x0, 0x0, 0x1,
241+
0x0, 0x0, 0x0, 0x2, // unlimited_count
242+
];
243+
assert_eq!(IntArraysReader::new(data.as_slice()), Err(DeserializeError));
244+
}
245+
104246
#[test]
105247
fn test_strings_reader() {
106248
let mut data = Vec::new();
@@ -180,3 +322,62 @@ fn test_many_ints_reader() {
180322
assert_eq!(reader.get_third_width(), Ok(12));
181323
assert_eq!(reader.get_width(), Ok(12 + 12 + 16));
182324
}
325+
326+
#[test]
327+
fn test_unlimited_array_of_unlimited() {
328+
let mut data: Vec<u8> = vec![];
329+
let mut strings: Vec<xdr_lib::Result<OsString>> = vec![];
330+
data.extend(100_u32.to_be_bytes());
331+
for _ in 0..100 {
332+
let my_string = Alphanumeric.sample_string(&mut rand::rng(), 2);
333+
334+
strings.push(Ok(OsString::from_str(&my_string).unwrap()));
335+
336+
// if false && i == 49 {
337+
// data.extend(5_u32.to_be_bytes());
338+
// } else {
339+
data.extend(2_u32.to_be_bytes());
340+
// }
341+
data.extend(my_string.as_bytes());
342+
data.extend(&[0x0, 0x0]);
343+
}
344+
345+
assert_eq!(data.len() % 4, 0);
346+
347+
let reader = UnlimitedArrayOfLimitedReader::new(data.as_slice()).unwrap();
348+
assert_eq!(
349+
reader
350+
.get_a()
351+
.map(|v| v.map(|res| res.get_data().to_os_string()))
352+
.collect::<Vec<xdr_lib::Result<OsString>>>(),
353+
strings
354+
);
355+
}
356+
357+
#[test]
358+
fn test_unlimited_array_of_unlimited_error_in_middle() {
359+
let mut data: Vec<u8> = vec![];
360+
let mut strings: Vec<xdr_lib::Result<OsString>> = vec![];
361+
data.extend(100_u32.to_be_bytes());
362+
for i in 0..100 {
363+
let my_string = Alphanumeric.sample_string(&mut rand::rng(), 2);
364+
365+
strings.push(Ok(OsString::from_str(&my_string).unwrap()));
366+
367+
if i == 49 {
368+
data.extend(5_u32.to_be_bytes());
369+
strings.push(Err(DeserializeError));
370+
} else {
371+
data.extend(2_u32.to_be_bytes());
372+
}
373+
data.extend(my_string.as_bytes());
374+
data.extend(&[0x0, 0x0]);
375+
}
376+
377+
assert_eq!(data.len() % 4, 0);
378+
379+
assert_eq!(
380+
UnlimitedArrayOfLimitedReader::new(data.as_slice()),
381+
Err(DeserializeError)
382+
);
383+
}

tests/zcopy/tests/basic_xdr_types.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,3 +57,18 @@ fn test_hello_invalid_enum() {
5757
Err(xdr_lib::DeserializeError)
5858
);
5959
}
60+
61+
#[test]
62+
fn test_hello_one_byte_short() {
63+
#[rustfmt::skip]
64+
let data: Vec<u8> = vec![
65+
0xC0, 0xFF, 0xEE, 0x11, // unsigned int abc
66+
0x00, 0xBA, 0xB1, 0x0C, // int def
67+
0x80, 0x00, 0x00, // favorite_fruit = invalid
68+
];
69+
70+
assert_eq!(
71+
HelloReader::new(data.as_slice()),
72+
Err(xdr_lib::DeserializeError)
73+
);
74+
}

0 commit comments

Comments
 (0)