Commit ffd15f52 authored by Guido van Rossum's avatar Guido van Rossum

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).
parent fb2789f3
...@@ -692,7 +692,18 @@ posix_chmod(self, args) ...@@ -692,7 +692,18 @@ posix_chmod(self, args)
PyObject *self; PyObject *self;
PyObject *args; 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 @@ posix_listdir(self, args) ...@@ -998,14 +1009,11 @@ posix_listdir(self, args)
struct dirent *ep; struct dirent *ep;
if (!PyArg_ParseTuple(args, "s:listdir", &name)) if (!PyArg_ParseTuple(args, "s:listdir", &name))
return NULL; return NULL;
Py_BEGIN_ALLOW_THREADS
if ((dirp = opendir(name)) == NULL) { if ((dirp = opendir(name)) == NULL) {
Py_BLOCK_THREADS
return posix_error_with_filename(name); return posix_error_with_filename(name);
} }
if ((d = PyList_New(0)) == NULL) { if ((d = PyList_New(0)) == NULL) {
closedir(dirp); closedir(dirp);
Py_BLOCK_THREADS
return NULL; return NULL;
} }
while ((ep = readdir(dirp)) != NULL) { while ((ep = readdir(dirp)) != NULL) {
...@@ -1028,7 +1036,6 @@ posix_listdir(self, args) ...@@ -1028,7 +1036,6 @@ posix_listdir(self, args)
Py_DECREF(v); Py_DECREF(v);
} }
closedir(dirp); closedir(dirp);
Py_END_ALLOW_THREADS
return d; return d;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment