From 00058aa28c8215562995593c57ff9388e2bdb266 Mon Sep 17 00:00:00 2001
From: Guido van Rossum <guido@python.org>
Date: Thu, 19 Jul 2007 18:21:28 +0000
Subject: [PATCH] Fix a bug in PyUnicode_FromStringAndSize() with signed
 characters.

---
 Objects/unicodeobject.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c
index 5dc3b4150d5..1399d191820 100644
--- a/Objects/unicodeobject.c
+++ b/Objects/unicodeobject.c
@@ -438,13 +438,13 @@ PyObject *PyUnicode_FromStringAndSize(const char *u, Py_ssize_t size)
 
 	/* Single characters are shared when using this constructor */
 	if (size == 1) {
-	    unicode = unicode_latin1[(int)*u];
+	    unicode = unicode_latin1[Py_CHARMASK(*u)];
 	    if (!unicode) {
 		unicode = _PyUnicode_New(1);
 		if (!unicode)
 		    return NULL;
-		unicode->str[0] = *u;
-		unicode_latin1[(int)*u] = unicode;
+		unicode->str[0] = Py_CHARMASK(*u);
+		unicode_latin1[Py_CHARMASK(*u)] = unicode;
 	    }
 	    Py_INCREF(unicode);
 	    return (PyObject *)unicode;
@@ -459,7 +459,7 @@ PyObject *PyUnicode_FromStringAndSize(const char *u, Py_ssize_t size)
     if (u != NULL) {
         Py_UNICODE *p = unicode->str;
         while (size--)
-            *p++ = *u++;
+            *p++ = Py_CHARMASK(*u++);
         /* Don't need to write trailing 0 because
            that's already done by _PyUnicode_New */
     }
-- 
2.30.9