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.

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;
...

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
[email protected]
http://lists.busybox.net/mailman/listinfo/uclibc

Reply via email to