From fb625847bfc9fb3ebf548b8c32a9accd21868d18 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marc-Andr=C3=A9=20Lemburg?= Date: Sun, 16 Jul 2000 13:29:13 +0000 Subject: [PATCH] Fix to a bug found by Florian Weimer: The UTF-8 decoder is still buggy (i.e. it doesn't pass Markus Kuhn's stress test), mainly due to the following construct: #define UTF8_ERROR(details) do { \ if (utf8_decoding_error(&s, &p, errors, details)) \ goto onError; \ continue; \ } while (0) (The "continue" statement is supposed to exit from the outer loop, but of course, it doesn't. Indeed, this is a marvelous example of the dangers of the C programming language and especially of the C preprocessor.) --- Objects/unicodeobject.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 12c5be435d..7c35f1c98f 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -634,7 +634,7 @@ int utf8_decoding_error(const char **source, #define UTF8_ERROR(details) do { \ if (utf8_decoding_error(&s, &p, errors, details)) \ goto onError; \ - continue; \ + goto nextChar; \ } while (0) PyObject *PyUnicode_DecodeUTF8(const char *s, @@ -731,6 +731,7 @@ PyObject *PyUnicode_DecodeUTF8(const char *s, UTF8_ERROR("unsupported Unicode code range"); } s += n; +nextChar: } /* Adjust length */ -- 2.40.0