=== 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 ;
 	}
 }

