slot_tp_descr_get(): guard against NULL obj or type (bug reported by
Thomas Hellor on python-dev).

slot_tp_descr_set(): if value is NULL, call __del__ instead of
__set__.
diff --git a/Objects/typeobject.c b/Objects/typeobject.c
index b64e10b..2017b1e 100644
--- a/Objects/typeobject.c
+++ b/Objects/typeobject.c
@@ -2806,14 +2806,23 @@
 		Py_INCREF(self);
 		return self;
 	}
+	if (obj == NULL)
+		obj = Py_None;
+	if (type == NULL)
+		type = Py_None;
 	return PyObject_CallFunction(get, "OOO", self, obj, type);
 }
 
 static int
 slot_tp_descr_set(PyObject *self, PyObject *target, PyObject *value)
 {
-	PyObject *res = PyObject_CallMethod(self, "__set__",
-					    "OO", target, value);
+	PyObject *res;
+
+	if (value == NULL)
+		res = PyObject_CallMethod(self, "__del__", "O", target);
+	else
+		res = PyObject_CallMethod(self, "__set__",
+					  "OO", target, value);
 	if (res == NULL)
 		return -1;
 	Py_DECREF(res);