From 9a9c588f9b8d69d6b634fbb357f67bf68d85d378 Mon Sep 17 00:00:00 2001 From: Peter Hinch Date: Wed, 10 Jan 2024 08:20:39 +0000 Subject: [PATCH] bdevice.py: Protect _set_pagesize against exceptions. --- bdevice.py | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/bdevice.py b/bdevice.py index 285fd66..6539ea6 100644 --- a/bdevice.py +++ b/bdevice.py @@ -100,17 +100,22 @@ class EepromDevice(BlockDevice): if page_size is None: # Measure it self._psize(16) # Conservative old = self[:129] # Save old contents (nonvolatile!) - self._psize(256) # Ambitious - r = (16, 32, 64, 128) # Legal page sizes + 256 - for x in r: - self[x] = 255 # Write single bytes, don't invoke page write - self[0:129] = b"\0" * 129 # Zero 129 bytes attempting to use 256 byte pages try: - ps = next(z for z in r if self[z]) - except StopIteration: - ps = 256 - self._psize(ps) - self[:129] = old + self._psize(256) # Ambitious + r = (16, 32, 64, 128) # Legal page sizes + 256 + for x in r: + self[x] = 255 # Write single bytes, don't invoke page write + self[0:129] = b"\0" * 129 # Zero 129 bytes attempting to use 256 byte pages + try: + ps = next(z for z in r if self[z]) + except StopIteration: + ps = 256 + self._psize(ps) + self[:129] = old + except: # If anything goes wrong, restore old data and raise + for n, v in enumerate(old): + self[n] = v + raise else: # Validated page_size was supplied self._psize(page_size)