electrum

Electrum Bitcoin wallet
git clone https://git.parazyd.org/electrum
Log | Files | Refs | Submodules

commit c0be0471f22f71ae30ff6e1983c1a958c83c5eef
parent aaf174ef3efb7744a48bcacd805618c1523766f3
Author: zebra-lucky <zebra.lucky@gmail.com>
Date:   Tue, 25 Feb 2020 20:58:03 +0200

fix BCDataStream.read_bytes (#5991)

* fix BCDataStream.read_bytes

* followup fix BCDataStream.read_bytes: fix TestBCDataStream.test_bytes

Diffstat:
Melectrum/tests/test_transaction.py | 8++++++--
Melectrum/transaction.py | 12++++++++----
2 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/electrum/tests/test_transaction.py b/electrum/tests/test_transaction.py @@ -58,8 +58,12 @@ class TestBCDataStream(ElectrumTestCase): s.write(b'foobar') self.assertEqual(s.read_bytes(3), b'foo') self.assertEqual(s.read_bytes(2), b'ba') - self.assertEqual(s.read_bytes(4), b'r') - self.assertEqual(s.read_bytes(1), b'') + with self.assertRaises(transaction.SerializationError): + s.read_bytes(4) + self.assertEqual(s.read_bytes(0), b'') + self.assertEqual(s.read_bytes(1), b'r') + self.assertEqual(s.read_bytes(0), b'') + class TestTransaction(ElectrumTestCase): diff --git a/electrum/transaction.py b/electrum/transaction.py @@ -272,12 +272,16 @@ class BCDataStream(object): self.write(string) def read_bytes(self, length) -> bytes: - try: - result = self.input[self.read_cursor:self.read_cursor+length] # type: bytearray + assert length >= 0 + input_len = len(self.input) + read_begin = self.read_cursor + read_end = read_begin + length + if 0 <= read_begin <= input_len and read_end <= input_len: + result = self.input[read_begin:read_end] # type: bytearray self.read_cursor += length return bytes(result) - except IndexError: - raise SerializationError("attempt to read past end of buffer") from None + else: + raise SerializationError('attempt to read past end of buffer') def can_read_more(self) -> bool: if not self.input: