From 543cd436fa198e7dab3f6ea8537cf8f61ab323c1 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 12 Oct 2020 17:22:10 +0530 Subject: [PATCH] Windows: Fix regression that broke querying registry for default programs Apparently under python 3 StopIteration no longer stops while loops, instead propagating out of them. --- src/calibre/utils/winreg/lib.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/calibre/utils/winreg/lib.py b/src/calibre/utils/winreg/lib.py index 65af342bbc..e439843443 100644 --- a/src/calibre/utils/winreg/lib.py +++ b/src/calibre/utils/winreg/lib.py @@ -269,6 +269,8 @@ class Key(object): file_time = RegEnumKeyEx(self.hkey, i, name_buf, ctypes.byref(lname_buf)) except ValueError: raise RuntimeError('Enumerating keys failed with buffer too small, which should never happen') + except StopIteration: + break if get_last_write_times: yield name_buf.value[:lname_buf.value], filetime_to_datettime(file_time) else: @@ -330,11 +332,16 @@ class Key(object): except ValueError: data_buf = (BYTE * ldata_buf.value)() continue + except StopIteration: + break data = convert_registry_data(data_buf, ldata_buf.value, vtype.value) yield name_buf.value[:lname_buf.value], data else: - RegEnumValue( - key, i, name_buf, ctypes.byref(lname_buf), None, None, None, None) + try: + RegEnumValue( + key, i, name_buf, ctypes.byref(lname_buf), None, None, None, None) + except StopIteration: + break yield name_buf.value[:lname_buf.value] i += 1