Skip to content

Commit 1d00df7

Browse files
committed
f change name, fix offset, add more details to why
1 parent abbd452 commit 1d00df7

File tree

1 file changed

+18
-15
lines changed

1 file changed

+18
-15
lines changed

lightning/src/util/ser.rs

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -387,28 +387,31 @@ impl Readable for BigSize {
387387
/// primarily targets that, we must as well. However, because we may serialize objects that have
388388
/// more than 65K entries, we need to be able to store larger values. Thus, we define a variable
389389
/// length integer here which is backwards-compatible but treats 0xffff as "read eight more bytes".
390-
struct U16Or64(pub u64);
391-
impl Writeable for U16Or64 {
390+
///
391+
/// To ensure we only have one valid encoding per value, we add 0xffff to values written as eight
392+
/// bytes, representing 0xffff as zero-eight-bytes, which 0xfffe is 0xfffe-two-bytes.
393+
struct U16OrU64(pub u64);
394+
impl Writeable for U16OrU64 {
392395
#[inline]
393396
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), io::Error> {
394397
if self.0 < 0xffff {
395398
(self.0 as u16).write(writer)
396399
} else {
397400
0xffffu16.write(writer)?;
398-
(self.0 - 0xfffe).write(writer)
401+
(self.0 - 0xffff).write(writer)
399402
}
400403
}
401404
}
402405

403-
impl Readable for U16Or64 {
406+
impl Readable for U16OrU64 {
404407
#[inline]
405408
fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
406409
let mut val: u64 = <u16 as Readable>::read(r)? as u64;
407410
if val == 0xffff {
408411
val = <u64 as Readable>::read(r)?
409-
.checked_add(0xfffe).ok_or(DecodeError::InvalidValue)?;
412+
.checked_add(0xffff).ok_or(DecodeError::InvalidValue)?;
410413
}
411-
Ok(U16Or64(val))
414+
Ok(U16OrU64(val))
412415
}
413416
}
414417

@@ -626,7 +629,7 @@ macro_rules! impl_for_map {
626629
{
627630
#[inline]
628631
fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
629-
U16Or64(self.len() as u64).write(w)?;
632+
U16OrU64(self.len() as u64).write(w)?;
630633
for (key, value) in self.iter() {
631634
key.write(w)?;
632635
value.write(w)?;
@@ -640,7 +643,7 @@ macro_rules! impl_for_map {
640643
{
641644
#[inline]
642645
fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
643-
let len: U16Or64 = Readable::read(r)?;
646+
let len: U16OrU64 = Readable::read(r)?;
644647
let mut ret = $constr(len.0 as usize);
645648
for _ in 0..len.0 {
646649
let k = K::read(r)?;
@@ -666,7 +669,7 @@ where T: Writeable + Eq + Hash
666669
{
667670
#[inline]
668671
fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
669-
U16Or64(self.len() as u64).write(w)?;
672+
U16OrU64(self.len() as u64).write(w)?;
670673
for item in self.iter() {
671674
item.write(w)?;
672675
}
@@ -679,7 +682,7 @@ where T: Readable + Eq + Hash
679682
{
680683
#[inline]
681684
fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
682-
let len: U16Or64 = Readable::read(r)?;
685+
let len: U16OrU64 = Readable::read(r)?;
683686
let mut ret = HashSet::with_capacity(cmp::min(len.0 as usize, MAX_BUF_SIZE / core::mem::size_of::<T>()));
684687
for _ in 0..len.0 {
685688
if !ret.insert(T::read(r)?) {
@@ -696,7 +699,7 @@ macro_rules! impl_for_vec {
696699
impl<$($name : Writeable),*> Writeable for Vec<$ty> {
697700
#[inline]
698701
fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
699-
U16Or64(self.len() as u64).write(w)?;
702+
U16OrU64(self.len() as u64).write(w)?;
700703
for elem in self.iter() {
701704
elem.write(w)?;
702705
}
@@ -707,7 +710,7 @@ macro_rules! impl_for_vec {
707710
impl<$($name : Readable),*> Readable for Vec<$ty> {
708711
#[inline]
709712
fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
710-
let len: U16Or64 = Readable::read(r)?;
713+
let len: U16OrU64 = Readable::read(r)?;
711714
let mut ret = Vec::with_capacity(cmp::min(len.0 as usize, MAX_BUF_SIZE / core::mem::size_of::<$ty>()));
712715
for _ in 0..len.0 {
713716
if let Some(val) = MaybeReadable::read(r)? {
@@ -723,15 +726,15 @@ macro_rules! impl_for_vec {
723726
impl Writeable for Vec<u8> {
724727
#[inline]
725728
fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
726-
U16Or64(self.len() as u64).write(w)?;
729+
U16OrU64(self.len() as u64).write(w)?;
727730
w.write_all(&self)
728731
}
729732
}
730733

731734
impl Readable for Vec<u8> {
732735
#[inline]
733736
fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
734-
let mut len: U16Or64 = Readable::read(r)?;
737+
let mut len: U16OrU64 = Readable::read(r)?;
735738
let mut ret = Vec::new();
736739
while len.0 > 0 {
737740
let readamt = cmp::min(len.0 as usize, MAX_BUF_SIZE);
@@ -1074,7 +1077,7 @@ impl Readable for () {
10741077
impl Writeable for String {
10751078
#[inline]
10761079
fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
1077-
U16Or64(self.len() as u64).write(w)?;
1080+
U16OrU64(self.len() as u64).write(w)?;
10781081
w.write_all(self.as_bytes())
10791082
}
10801083
}

0 commit comments

Comments
 (0)