From c41418751fcef0a42f336ba91871827b45d558a7 Mon Sep 17 00:00:00 2001
From: Guido van Rossum <guido@python.org>
Date: Thu, 30 Aug 2001 04:43:35 +0000
Subject: [PATCH] Safety measures now that str and tuple are subclassable:

If tp_itemsize of the basetype is nonzero, only allow empty __slots__
(declaring that no __dict__ should be added), and don't add a weakref
offset.
---
 Objects/typeobject.c | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/Objects/typeobject.c b/Objects/typeobject.c
index 559c41b6e8..719a0a4021 100644
--- a/Objects/typeobject.c
+++ b/Objects/typeobject.c
@@ -712,6 +712,13 @@ type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds)
 		if (slots == NULL)
 			return NULL;
 		nslots = PyTuple_GET_SIZE(slots);
+		if (nslots > 0 && base->tp_itemsize != 0) {
+			PyErr_Format(PyExc_TypeError,
+				     "nonempty __slots__ "
+				     "not supported for subtype of '%s'",
+				     base->tp_name);
+			return NULL;
+		}
 		for (i = 0; i < nslots; i++) {
 			if (!PyString_Check(PyTuple_GET_ITEM(slots, i))) {
 				PyErr_SetString(PyExc_TypeError,
@@ -728,7 +735,8 @@ type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds)
 		nslots++;
 		add_dict++;
 	}
-	if (slots == NULL && base->tp_weaklistoffset == 0) {
+	if (slots == NULL && base->tp_weaklistoffset == 0 &&
+	    base->tp_itemsize == 0) {
 		nslots++;
 		add_weak++;
 	}
-- 
2.40.0