Fix a long standing regression of readdir(3) in fdescfs(5) introduced
in r1.48. We were stopping at the first null pointer when multiple file descriptors were opened and one in the middle was closed. This restores traditional behaviour of fdescfs. MFC after: 3 days
This commit is contained in:
parent
6b533b5ddb
commit
d04be5775f
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=205223
@ -522,11 +522,10 @@ fdesc_readdir(ap)
|
||||
|
||||
FILEDESC_SLOCK(fdp);
|
||||
while (i < fdp->fd_nfiles + 2 && uio->uio_resid >= UIO_MX) {
|
||||
bzero((caddr_t)dp, UIO_MX);
|
||||
switch (i) {
|
||||
case 0: /* `.' */
|
||||
case 1: /* `..' */
|
||||
bzero((caddr_t)dp, UIO_MX);
|
||||
|
||||
dp->d_fileno = i + FD_ROOT;
|
||||
dp->d_namlen = i + 1;
|
||||
dp->d_reclen = UIO_MX;
|
||||
@ -535,26 +534,24 @@ fdesc_readdir(ap)
|
||||
dp->d_type = DT_DIR;
|
||||
break;
|
||||
default:
|
||||
if (fdp->fd_ofiles[fcnt] == NULL) {
|
||||
FILEDESC_SUNLOCK(fdp);
|
||||
goto done;
|
||||
}
|
||||
|
||||
bzero((caddr_t) dp, UIO_MX);
|
||||
if (fdp->fd_ofiles[fcnt] == NULL)
|
||||
break;
|
||||
dp->d_namlen = sprintf(dp->d_name, "%d", fcnt);
|
||||
dp->d_reclen = UIO_MX;
|
||||
dp->d_type = DT_UNKNOWN;
|
||||
dp->d_fileno = i + FD_DESC;
|
||||
break;
|
||||
}
|
||||
/*
|
||||
* And ship to userland
|
||||
*/
|
||||
FILEDESC_SUNLOCK(fdp);
|
||||
error = uiomove(dp, UIO_MX, uio);
|
||||
if (error)
|
||||
goto done;
|
||||
FILEDESC_SLOCK(fdp);
|
||||
if (dp->d_namlen != 0) {
|
||||
/*
|
||||
* And ship to userland
|
||||
*/
|
||||
FILEDESC_SUNLOCK(fdp);
|
||||
error = uiomove(dp, UIO_MX, uio);
|
||||
if (error)
|
||||
goto done;
|
||||
FILEDESC_SLOCK(fdp);
|
||||
}
|
||||
i++;
|
||||
fcnt++;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user