Fix endless loop occuring on empty directories listing on 512 bytes/sector
media like harddiscs. Also provide provide a `safety net' on readdir so it will signal EOF when its requested an entry outside the directory.
This commit is contained in:
parent
1355265509
commit
0be5b3fe22
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: udf_vnops.c,v 1.33 2008/12/16 10:30:19 reinoud Exp $ */
|
/* $NetBSD: udf_vnops.c,v 1.34 2008/12/16 14:28:34 reinoud Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2006, 2008 Reinoud Zandijk
|
* Copyright (c) 2006, 2008 Reinoud Zandijk
|
||||||
@ -32,7 +32,7 @@
|
|||||||
|
|
||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
#ifndef lint
|
#ifndef lint
|
||||||
__KERNEL_RCSID(0, "$NetBSD: udf_vnops.c,v 1.33 2008/12/16 10:30:19 reinoud Exp $");
|
__KERNEL_RCSID(0, "$NetBSD: udf_vnops.c,v 1.34 2008/12/16 14:28:34 reinoud Exp $");
|
||||||
#endif /* not lint */
|
#endif /* not lint */
|
||||||
|
|
||||||
|
|
||||||
@ -546,8 +546,7 @@ udf_readdir(void *v)
|
|||||||
|
|
||||||
/* we are called just as long as we keep on pushing data in */
|
/* we are called just as long as we keep on pushing data in */
|
||||||
error = 0;
|
error = 0;
|
||||||
if ((uio->uio_offset < file_size) &&
|
if (uio->uio_offset < file_size) {
|
||||||
(uio->uio_resid >= sizeof(struct dirent))) {
|
|
||||||
/* allocate temporary space for fid */
|
/* allocate temporary space for fid */
|
||||||
lb_size = udf_rw32(udf_node->ump->logical_vol->lb_size);
|
lb_size = udf_rw32(udf_node->ump->logical_vol->lb_size);
|
||||||
fid = malloc(lb_size, M_UDFTEMP, M_WAITOK);
|
fid = malloc(lb_size, M_UDFTEMP, M_WAITOK);
|
||||||
@ -597,7 +596,7 @@ udf_readdir(void *v)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (ap->a_eofflag)
|
if (ap->a_eofflag)
|
||||||
*ap->a_eofflag = (uio->uio_offset == file_size);
|
*ap->a_eofflag = (uio->uio_offset >= file_size);
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
if (udf_verbose & UDF_DEBUG_READDIR) {
|
if (udf_verbose & UDF_DEBUG_READDIR) {
|
||||||
|
Loading…
Reference in New Issue
Block a user