Issue #9020: The Py_IS* macros from pyctype.h should generally only be
used with signed/unsigned char arguments. For integer arguments, EOF
has to be handled separately.
diff --git a/Include/pyctype.h b/Include/pyctype.h
index 0d211ec..c5cc614 100644
--- a/Include/pyctype.h
+++ b/Include/pyctype.h
@@ -11,6 +11,9 @@
extern const unsigned int _Py_ctype_table[256];
+/* Unlike their C counterparts, the following macros are not meant to
+ * handle an int with any of the values [EOF, 0-UCHAR_MAX]. The argument
+ * must be a signed/unsigned char. */
#define Py_ISLOWER(c) (_Py_ctype_table[Py_CHARMASK(c)] & PY_CTF_LOWER)
#define Py_ISUPPER(c) (_Py_ctype_table[Py_CHARMASK(c)] & PY_CTF_UPPER)
#define Py_ISALPHA(c) (_Py_ctype_table[Py_CHARMASK(c)] & PY_CTF_ALPHA)
diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c
index a647d9c..ee6313b 100644
--- a/Parser/tokenizer.c
+++ b/Parser/tokenizer.c
@@ -1365,7 +1365,7 @@
goto letter_quote;
break;
}
- while (Py_ISALNUM(c) || c == '_') {
+ while (c != EOF && (Py_ISALNUM(c) || c == '_')) {
c = tok_nextc(tok);
}
tok_backup(tok, c);