mirror of git://sourceware.org/git/glibc.git
Update.
* sysdeps/unix/sysv/linux/getdents.c (__getdents): Avoid initial lseek call be passing in a buffer which never allow a successful first getdents syscall if not at leas the initial entry can be stored in the user buffer.
This commit is contained in:
parent
8956ac9e97
commit
4186c9f42b
|
|
@ -1,5 +1,10 @@
|
||||||
2000-04-09 Ulrich Drepper <drepper@redhat.com>
|
2000-04-09 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
|
* sysdeps/unix/sysv/linux/getdents.c (__getdents): Avoid initial
|
||||||
|
lseek call be passing in a buffer which never allow a successful
|
||||||
|
first getdents syscall if not at leas the initial entry can be
|
||||||
|
stored in the user buffer.
|
||||||
|
|
||||||
* localedata/Makefile: Add rules to clean up directories created by
|
* localedata/Makefile: Add rules to clean up directories created by
|
||||||
new strfmon tests.
|
new strfmon tests.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,9 @@
|
||||||
|
2000-04-09 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
|
* signals.c (sigaction): Fix return value for the case SIG is one
|
||||||
|
of the signals the implementation uses.
|
||||||
|
Patch by Xavier.Leroy@inria.fr.
|
||||||
|
|
||||||
2000-04-01 Andreas Jaeger <aj@suse.de>
|
2000-04-01 Andreas Jaeger <aj@suse.de>
|
||||||
|
|
||||||
* attr.c: Use shlib-compat macros.
|
* attr.c: Use shlib-compat macros.
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,7 @@
|
||||||
Boston, MA 02111-1307, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
#include <alloca.h>
|
#include <alloca.h>
|
||||||
|
#include <assert.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
@ -33,7 +34,7 @@
|
||||||
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
|
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
|
||||||
|
|
||||||
|
|
||||||
extern int __syscall_getdents __P ((int fd, char *buf, size_t nbytes));
|
extern int __syscall_getdents (int fd, char *buf, size_t nbytes);
|
||||||
|
|
||||||
/* For Linux we need a special version of this file since the
|
/* For Linux we need a special version of this file since the
|
||||||
definition of `struct dirent' is not the same for the kernel and
|
definition of `struct dirent' is not the same for the kernel and
|
||||||
|
|
@ -67,7 +68,7 @@ ssize_t
|
||||||
internal_function
|
internal_function
|
||||||
__getdents (int fd, char *buf, size_t nbytes)
|
__getdents (int fd, char *buf, size_t nbytes)
|
||||||
{
|
{
|
||||||
off_t last_offset = __lseek (fd, 0, SEEK_CUR);
|
off_t last_offset = -1;
|
||||||
size_t red_nbytes;
|
size_t red_nbytes;
|
||||||
struct kernel_dirent *skdp, *kdp;
|
struct kernel_dirent *skdp, *kdp;
|
||||||
struct dirent *dp;
|
struct dirent *dp;
|
||||||
|
|
@ -75,8 +76,10 @@ __getdents (int fd, char *buf, size_t nbytes)
|
||||||
const size_t size_diff = (offsetof (struct dirent, d_name)
|
const size_t size_diff = (offsetof (struct dirent, d_name)
|
||||||
- offsetof (struct kernel_dirent, d_name));
|
- offsetof (struct kernel_dirent, d_name));
|
||||||
|
|
||||||
red_nbytes = nbytes - ((nbytes / (offsetof (struct dirent, d_name) + 14))
|
red_nbytes = MIN (nbytes
|
||||||
* size_diff);
|
- ((nbytes / (offsetof (struct dirent, d_name) + 14))
|
||||||
|
* size_diff),
|
||||||
|
nbytes - size_diff);
|
||||||
|
|
||||||
dp = (struct dirent *) buf;
|
dp = (struct dirent *) buf;
|
||||||
skdp = kdp = __alloca (red_nbytes);
|
skdp = kdp = __alloca (red_nbytes);
|
||||||
|
|
@ -97,6 +100,7 @@ __getdents (int fd, char *buf, size_t nbytes)
|
||||||
{
|
{
|
||||||
/* Our heuristic failed. We read too many entries. Reset
|
/* Our heuristic failed. We read too many entries. Reset
|
||||||
the stream. */
|
the stream. */
|
||||||
|
assert (last_offset != -1);
|
||||||
__lseek (fd, last_offset, SEEK_SET);
|
__lseek (fd, last_offset, SEEK_SET);
|
||||||
|
|
||||||
if ((char *) dp == buf)
|
if ((char *) dp == buf)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue