[PATCH] osutil: implementation for Win32
Petr Kodl
petrkodl at gmail.com
Wed Sep 10 17:21:44 CDT 2008
There are two more left - both PyList_Append and PyList_Sort can fail ...
and maybe
s/return ret ? ret : NULL; /return ret;
pk
On Wed, Sep 10, 2008 at 6:06 PM, Benoit Boissinot <bboissin at gmail.com>wrote:
> On Wed, Sep 10, 2008 at 10:05 PM, Petr Kodl <petrkodl at gmail.com> wrote:
> > As for the existing Unix code - it is actually buggy - it uses return
> values
> > from PyErr function as an indicator of an error, but that value is always
> > NULL - I think all of the Python PyErr functions do that - so the final
> >
> > return err ? err : list
> >
> > is actually meaningless and what makes it work is the list being
> initialized
> > to NULL.
> >
> > There is still a potential bug if the code runs out of memory - than it
> can
> > really return partial list or list with partially initialized stat part
> and
> > the caller would never know about it.
>
> Possible patch below.
>
> Actually there are more problems. It seems the file descriptor isn't closed
> too.
>
> diff --git a/mercurial/osutil.c b/mercurial/osutil.c
> --- a/mercurial/osutil.c
> +++ b/mercurial/osutil.c
> @@ -158,7 +158,7 @@
> Py_DECREF(val);
> }
>
> - return 0;
> + return list;
> }
>
> static PyObject *statfiles(PyObject *list, PyObject *ctor_args, int keep,
> @@ -230,7 +230,7 @@
> }
> }
>
> - return 0;
> + return list;
> }
>
> static PyObject *listdir(PyObject *self, PyObject *args, PyObject *kwargs)
> @@ -239,7 +239,7 @@
> DIR *dir = NULL;
> PyObject *statobj = NULL;
> PyObject *list = NULL;
> - PyObject *err = NULL;
> + PyObject *ret = NULL;
> PyObject *ctor_args = NULL;
> char *path;
> char full_path[PATH_MAX + 10];
> @@ -262,7 +262,7 @@
> dfd = -1;
> #endif
> if (!dir) {
> - err = PyErr_SetFromErrnoWithFilename(PyExc_OSError, path);
> + PyErr_SetFromErrnoWithFilename(PyExc_OSError, path);
> goto bail;
> }
>
> @@ -274,8 +274,8 @@
> strncpy(full_path, path, PATH_MAX);
> full_path[path_len] = '/';
>
> - err = listfiles(list, dir, keep_stat, &need_stat);
> - if (err)
> + ret = listfiles(list, dir, keep_stat, &need_stat);
> + if (!ret)
> goto bail;
>
> PyList_Sort(list);
> @@ -283,8 +283,8 @@
> if (!keep_stat && !need_stat)
> goto done;
>
> - err = statfiles(list, ctor_args, keep_stat, full_path, path_len,
> dfd);
> - if (!err)
> + ret = statfiles(list, ctor_args, keep_stat, full_path, path_len,
> dfd);
> + if (ret)
> goto done;
>
> bail:
> @@ -294,7 +294,7 @@
> Py_XDECREF(ctor_args);
> if (dir)
> closedir(dir);
> - return err ? err : list;
> + return ret ? ret : NULL;
> }
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://selenic.com/pipermail/mercurial-devel/attachments/20080910/7a130e43/attachment.htm
More information about the Mercurial-devel
mailing list