summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authormarcel <marcel@FreeBSD.org>1999-10-21 09:14:49 +0000
committermarcel <marcel@FreeBSD.org>1999-10-21 09:14:49 +0000
commit90f63b1ea896541115fc71422c41a64cb0068d84 (patch)
treee5d004be4f7f44d4a7861fe040ea3ce66979529c /sys
parentf9075340a8ef01b333d169d155a235f7564dbe61 (diff)
downloadFreeBSD-src-90f63b1ea896541115fc71422c41a64cb0068d84.zip
FreeBSD-src-90f63b1ea896541115fc71422c41a64cb0068d84.tar.gz
Fix the duplicate filenames that are the result of using getdents.
glibc2 defines struct dirent differently than the Linux kernel does. The getdents function therefore needs to read a heuristically defined number of kernel dirents to satisfy the request. In case where too many kernel dirents have been read, the function lseeks on the directory so that a next call will start with the right dirent. The offset used in lseeking is the offset-field in the last dirent passed to the application. This can only mean that the offset-field holds the offset of the next dirent and not the offset of the dirent itself.
Diffstat (limited to 'sys')
-rw-r--r--sys/compat/linux/linux_file.c2
-rw-r--r--sys/i386/linux/linux_file.c2
2 files changed, 2 insertions, 2 deletions
diff --git a/sys/compat/linux/linux_file.c b/sys/compat/linux/linux_file.c
index 11ea240..16184ff 100644
--- a/sys/compat/linux/linux_file.c
+++ b/sys/compat/linux/linux_file.c
@@ -540,7 +540,7 @@ again:
linux_dirent.doff = (linux_off_t) linuxreclen;
linux_dirent.dreclen = (u_short) bdp->d_namlen;
} else {
- linux_dirent.doff = (linux_off_t) off;
+ linux_dirent.doff = (linux_off_t)(off + reclen);
linux_dirent.dreclen = (u_short) linuxreclen;
}
strcpy(linux_dirent.dname, bdp->d_name);
diff --git a/sys/i386/linux/linux_file.c b/sys/i386/linux/linux_file.c
index 11ea240..16184ff 100644
--- a/sys/i386/linux/linux_file.c
+++ b/sys/i386/linux/linux_file.c
@@ -540,7 +540,7 @@ again:
linux_dirent.doff = (linux_off_t) linuxreclen;
linux_dirent.dreclen = (u_short) bdp->d_namlen;
} else {
- linux_dirent.doff = (linux_off_t) off;
+ linux_dirent.doff = (linux_off_t)(off + reclen);
linux_dirent.dreclen = (u_short) linuxreclen;
}
strcpy(linux_dirent.dname, bdp->d_name);
OpenPOWER on IntegriCloud