Check the keys of the locals dict -- they need not be a list.
diff --git a/Objects/object.c b/Objects/object.c
index e2d1b13..f4ae4f3 100644
--- a/Objects/object.c
+++ b/Objects/object.c
@@ -1349,6 +1349,7 @@
 static PyObject *
 _dir_locals()
 {
+	PyObject *names;
 	PyObject *locals = PyEval_GetLocals();
 
 	if (locals == NULL) {
@@ -1356,8 +1357,18 @@
 		return NULL;
 	}
 
+	names = PyMapping_Keys(locals);
+	if (!names)
+		return NULL;
+	if (!PyList_Check(names)) {
+		PyErr_Format(PyExc_TypeError,
+			"dir(): expected keys() of locals to be a list, "
+			"not '%.200s'", names->ob_type->tp_name);
+		Py_DECREF(names);
+		return NULL;
+	}
 	/* the locals don't need to be DECREF'd */
-	return PyMapping_Keys(locals);
+	return names;
 }
 
 /* Helper for PyObject_Dir of type objects: returns __dict__ and __bases__.