Two robustness patches:

(1) In opendir(), don't call the lock-release macros; we're
manipulating list objects and that shouldn't be done in unlocked
state.

(2) Don't use posix_strint() for chmod() -- the mode_t arg might be a
64 bit int (reported by Nick Maclaren).
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
index 8ae5d2f..f5ac1d5 100644
--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -692,7 +692,18 @@
 	PyObject *self;
 	PyObject *args;
 {
-	return posix_strint(args, "si:chmod", chmod);
+	char *path;
+	int i;
+	int res;
+	if (!PyArg_ParseTuple(args, format, &path, &i))
+		return NULL;
+	Py_BEGIN_ALLOW_THREADS
+	res = chmod(path, i);
+	Py_END_ALLOW_THREADS
+	if (res < 0)
+		return posix_error_with_filename(path);
+	Py_INCREF(Py_None);
+	return Py_None;
 }
 
 
@@ -998,14 +1009,11 @@
 	struct dirent *ep;
 	if (!PyArg_ParseTuple(args, "s:listdir", &name))
 		return NULL;
-	Py_BEGIN_ALLOW_THREADS
 	if ((dirp = opendir(name)) == NULL) {
-		Py_BLOCK_THREADS
 		return posix_error_with_filename(name);
 	}
 	if ((d = PyList_New(0)) == NULL) {
 		closedir(dirp);
-		Py_BLOCK_THREADS
 		return NULL;
 	}
 	while ((ep = readdir(dirp)) != NULL) {
@@ -1028,7 +1036,6 @@
 		Py_DECREF(v);
 	}
 	closedir(dirp);
-	Py_END_ALLOW_THREADS
 
 	return d;