From 0b1c169c4a009e1094fe5df938d2367e63ebeea0 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Sat, 17 Apr 2021 23:28:45 +0100 Subject: bpo-38530: Cover more error paths in error suggestion functions (GH-25462) --- Lib/test/test_exceptions.py | 10 ++++++++++ Python/suggestions.c | 7 +++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_exceptions.py b/Lib/test/test_exceptions.py index b730858..d1e1b19 100644 --- a/Lib/test/test_exceptions.py +++ b/Lib/test/test_exceptions.py @@ -1741,6 +1741,16 @@ class AttributeErrorTests(unittest.TestCase): self.assertNotIn("blech", err.getvalue()) self.assertNotIn("oh no!", err.getvalue()) + def test_attribute_error_with_bad_name(self): + try: + raise AttributeError(name=12, obj=23) + except AttributeError as exc: + with support.captured_stderr() as err: + sys.__excepthook__(*sys.exc_info()) + + self.assertNotIn("?", err.getvalue()) + + class ImportErrorTests(unittest.TestCase): def test_attributes(self): diff --git a/Python/suggestions.c b/Python/suggestions.c index aa4870d..d4e9dc2 100644 --- a/Python/suggestions.c +++ b/Python/suggestions.c @@ -8,7 +8,7 @@ #define MAX_STRING_SIZE 25 /* Calculate the Levenshtein distance between string1 and string2 */ -static size_t +static Py_ssize_t levenshtein_distance(const char *a, size_t a_size, const char *b, size_t b_size) { @@ -33,7 +33,7 @@ levenshtein_distance(const char *a, size_t a_size, size_t *buffer = PyMem_Calloc(a_size, sizeof(size_t)); if (buffer == NULL) { - return 0; + return -1; } // Initialize the buffer row @@ -99,6 +99,9 @@ calculate_suggestions(PyObject *dir, } Py_ssize_t current_distance = levenshtein_distance( name_str, name_size, item_str, item_size); + if (current_distance == -1) { + return NULL; + } if (current_distance == 0 || current_distance > MAX_DISTANCE) { continue; } -- cgit v0.12