Skip to content

Commit acd1e0f

Browse files
Fix get_int if nbytes is zero (#806)
1 parent a7952fb commit acd1e0f

2 files changed

Lines changed: 25 additions & 9 deletions

File tree

src/buf/buf_impl.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,13 @@ macro_rules! buf_get_impl {
8686

8787
// https://en.wikipedia.org/wiki/Sign_extension
8888
fn sign_extend(val: u64, nbytes: usize) -> i64 {
89-
let shift = (8 - nbytes) * 8;
90-
(val << shift) as i64 >> shift
89+
if nbytes == 0 {
90+
// avoid `val << 64` panic
91+
0
92+
} else {
93+
let shift = (8 - nbytes) * 8;
94+
(val << shift) as i64 >> shift
95+
}
9196
}
9297

9398
/// Read bytes from a buffer.

tests/test_buf.rs

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -250,12 +250,12 @@ macro_rules! buf_tests {
250250
buf_tests!(number $make_input, get_f64_le, get_f64_le_overflow, f64, get_f64_le, f64::from_bits(0x7144726a727146ff));
251251
buf_tests!(number $make_input, get_f64_ne, get_f64_ne_overflow, f64, get_f64_ne, f64::from_bits(e!(0xff4671726a724471, 0x7144726a727146ff)));
252252

253-
buf_tests!(var_number $make_input, get_uint_be, get_uint_be_overflow, u64, get_uint, 3, 0xff4671);
254-
buf_tests!(var_number $make_input, get_uint_le, get_uint_le_overflow, u64, get_uint_le, 3, 0x7146ff);
255-
buf_tests!(var_number $make_input, get_uint_ne, get_uint_ne_overflow, u64, get_uint_ne, 3, e!(0xff4671, 0x7146ff));
256-
buf_tests!(var_number $make_input, get_int_be, get_int_be_overflow, i64, get_int, 3, 0xffffffffffff4671u64 as i64);
257-
buf_tests!(var_number $make_input, get_int_le, get_int_le_overflow, i64, get_int_le, 3, 0x7146ff);
258-
buf_tests!(var_number $make_input, get_int_ne, get_int_ne_overflow, i64, get_int_ne, 3, e!(0xffffffffffff4671u64 as i64, 0x7146ff));
253+
buf_tests!(var_number $make_input, get_uint_be, get_uint_be_zero, get_uint_be_overflow, u64, get_uint, 3, 0xff4671);
254+
buf_tests!(var_number $make_input, get_uint_le, get_uint_le_zero, get_uint_le_overflow, u64, get_uint_le, 3, 0x7146ff);
255+
buf_tests!(var_number $make_input, get_uint_ne, get_uint_ne_zero, get_uint_ne_overflow, u64, get_uint_ne, 3, e!(0xff4671, 0x7146ff));
256+
buf_tests!(var_number $make_input, get_int_be, get_int_be_zero, get_int_be_overflow, i64, get_int, 3, 0xffffffffffff4671u64 as i64);
257+
buf_tests!(var_number $make_input, get_int_le, get_int_le_zero, get_int_le_overflow, i64, get_int_le, 3, 0x7146ff);
258+
buf_tests!(var_number $make_input, get_int_ne, get_int_ne_zero, get_int_ne_overflow, i64, get_int_ne, 3, e!(0xffffffffffff4671u64 as i64, 0x7146ff));
259259
};
260260
(number $make_input:ident, $ok_name:ident, $panic_name:ident, $number:ty, $method:ident, $value:expr) => {
261261
#[test]
@@ -276,7 +276,7 @@ macro_rules! buf_tests {
276276
let _ = buf.$method();
277277
}
278278
};
279-
(var_number $make_input:ident, $ok_name:ident, $panic_name:ident, $number:ty, $method:ident, $len:expr, $value:expr) => {
279+
(var_number $make_input:ident, $ok_name:ident, $ok_zero_name:ident, $panic_name:ident, $number:ty, $method:ident, $len:expr, $value:expr) => {
280280
#[test]
281281
fn $ok_name() {
282282
let mut buf = $make_input(INPUT);
@@ -287,6 +287,17 @@ macro_rules! buf_tests {
287287
assert_eq!(value, $value);
288288
}
289289

290+
// Regression test for https://github.com/tokio-rs/bytes/issues/798
291+
#[test]
292+
fn $ok_zero_name() {
293+
let mut buf = $make_input(INPUT);
294+
295+
let value = buf.$method(0);
296+
assert_eq!(buf.remaining(), 64);
297+
assert!(buf.has_remaining());
298+
assert_eq!(value, 0);
299+
}
300+
290301
#[test]
291302
#[should_panic]
292303
fn $panic_name() {

0 commit comments

Comments
 (0)