problem with errno in readdir64_r() and readdir_r()
Filippo ARCIDIACONO
filippo.arcidiacono at st.com
Wed Mar 25 12:49:39 UTC 2009
> -----Original Message-----
> From: uclibc-bounces at uclibc.org
> [mailto:uclibc-bounces at uclibc.org] On Behalf Of Kovesdi Gyorgy
> Sent: Wednesday, March 25, 2009 9:49 AM
> To: uclibc at uclibc.org
> Subject: problem with errno in readdir64_r() and readdir_r()
>
> Hi,
>
> I found that the above mentioned functions can return with
> strange error values in some cases: it is possible to return
> the previous value of the 'errno' without modifying it.
> e.g. the 'svn' executable reports strange errors due to this bug.
If there is a bug you should provide a simlpe test case that raise the
problem.
>
> Those functions contain this code:
>
> bytes = __getdents64(dir->dd_fd, dir->dd_buf, dir->dd_max);
> if (bytes <= 0) {
> *result = NULL;
> ret = (bytes==0)? 0 : errno;
> goto all_done;
> ...
>
> AFAIK the functions __getdents64() and __getdents() return
> zero at the end of the directory, and the 'errno' is not
> modified in this case (because it is not an error), so the
> previous value of 'errno' can be returned by these functions.
> I suggest a modification:
>
> bytes = __getdents64(dir->dd_fd, dir->dd_buf, dir->dd_max);
> if (bytes == 0) {
> *result = NULL;
> ret = 0;
> goto all_done;
> } else if (bytes < 0) {
> *result = NULL;
> ret = (bytes==0)? 0 : errno;
> goto all_done;
> ...
Sorry, but I cannot see any distinction with the previous one.
>
> or something similar. I did not test it, because it is too
> complicated for me to recompile the whole uClibc. It is just an idea.
>
> Regards
> K. Gy.
> _______________________________________________
> uClibc mailing list
> uClibc at uclibc.org
> http://lists.busybox.net/mailman/listinfo/uclibc
>
More information about the uClibc
mailing list