=== modified file 'source/modules/vfs_shadow_copy.c' --- source/modules/vfs_shadow_copy.c 2006-12-21 13:52:11 +0000 +++ source/modules/vfs_shadow_copy.c 2007-04-16 01:45:15 +0000 @@ -58,8 +58,8 @@ typedef struct { int pos; - int num; - SMB_STRUCT_DIRENT *dirs; + int length; + unsigned char *dirs; } shadow_copy_Dir; static BOOL shadow_copy_match_name(const char *name) @@ -106,13 +106,14 @@ DEBUG(10,("shadow_copy_opendir: not hide [%s]\n",d->d_name)); - dirp->dirs = SMB_REALLOC_ARRAY(dirp->dirs,SMB_STRUCT_DIRENT, dirp->num+1); + dirp->dirs = SMB_REALLOC(dirp->dirs, dirp->length + d->d_reclen); if (!dirp->dirs) { DEBUG(0,("shadow_copy_opendir: Out of memory\n")); break; } - dirp->dirs[dirp->num++] = *d; + memcpy(dirp->dirs + dirp->length, d, d->d_reclen); + dirp->length += d->d_reclen; } SMB_VFS_NEXT_CLOSEDIR(handle,p); @@ -121,10 +122,13 @@ static SMB_STRUCT_DIRENT *shadow_copy_readdir(vfs_handle_struct *handle, SMB_STRUCT_DIR *_dirp) { + SMB_STRUCT_DIRENT *d; shadow_copy_Dir *dirp = (shadow_copy_Dir *)_dirp; - if (dirp->pos < dirp->num) { - return &(dirp->dirs[dirp->pos++]); + if (dirp->pos < dirp->length) { + d = (SMB_STRUCT_DIRENT *)(dirp->dirs + dirp->pos); + dirp->pos += d->d_reclen; + return d; } return NULL; @@ -134,7 +138,7 @@ { shadow_copy_Dir *dirp = (shadow_copy_Dir *)_dirp; - if (offset < dirp->num) { + if (offset < dirp->length) { dirp->pos = offset ; } }