Explorar o código

yes: deal with UnicodeDecodeError in input(), fixes #6984

if retry is True, it will just retry to get a valid answer.
if retry is False, it will return the default.

the code can be tested by entering "error" (without the quotes).
Thomas Waldmann hai 11 meses
pai
achega
2982382315
Modificáronse 1 ficheiros con 8 adicións e 1 borrados
  1. 8 1
      src/borg/helpers/yes.py

+ 8 - 1
src/borg/helpers/yes.py

@@ -8,6 +8,9 @@ FALSISH = ('No', 'NO', 'no', 'N', 'n', '0', )
 TRUISH = ('Yes', 'YES', 'yes', 'Y', 'y', '1', )
 DEFAULTISH = ('Default', 'DEFAULT', 'default', 'D', 'd', '', )
 
+ERROR = "error"
+assert ERROR not in TRUISH + FALSISH + DEFAULTISH
+
 
 def yes(msg=None, false_msg=None, true_msg=None, default_msg=None,
         retry_msg=None, invalid_msg=None, env_msg='{} (from {})',
@@ -77,10 +80,14 @@ def yes(msg=None, false_msg=None, true_msg=None, default_msg=None,
             if not prompt:
                 return default
             try:
-                answer = input()
+                answer = input()  # this may raise UnicodeDecodeError, #6984
+                if answer == ERROR:  # for testing purposes
+                    raise UnicodeDecodeError("?", b"?", 0, 1, "?")  # args don't matter
             except EOFError:
                 # avoid defaultish[0], defaultish could be empty
                 answer = truish[0] if default else falsish[0]
+            except UnicodeDecodeError:
+                answer = ERROR
         if answer in defaultish:
             if default_msg:
                 output(default_msg, 'accepted_default')