ntdll: Ignore some system directories in NtQueryDirectoryFile to avoid recursion troubles.
This commit is contained in:
parent
56788cc5b6
commit
f0fed2831a
|
@ -23,6 +23,7 @@
|
|||
#include "config.h"
|
||||
#include "wine/port.h"
|
||||
|
||||
#include <assert.h>
|
||||
#include <sys/types.h>
|
||||
#ifdef HAVE_DIRENT_H
|
||||
# include <dirent.h>
|
||||
|
@ -136,6 +137,15 @@ static inline int getdents64( int fd, char *de, unsigned int size )
|
|||
|
||||
#define MAX_DIR_ENTRY_LEN 255 /* max length of a directory entry in chars */
|
||||
|
||||
#define MAX_IGNORED_FILES 4
|
||||
|
||||
static struct
|
||||
{
|
||||
dev_t dev;
|
||||
ino_t ino;
|
||||
} ignored_files[MAX_IGNORED_FILES];
|
||||
static int ignored_files_count;
|
||||
|
||||
static const unsigned int max_dir_info_size = FIELD_OFFSET( FILE_BOTH_DIR_INFORMATION, FileName[MAX_DIR_ENTRY_LEN] );
|
||||
|
||||
static int show_dot_files = -1;
|
||||
|
@ -172,6 +182,28 @@ static inline int is_valid_mounted_device( const struct stat *st )
|
|||
#endif
|
||||
}
|
||||
|
||||
static inline void ignore_file( const char *name )
|
||||
{
|
||||
struct stat st;
|
||||
assert( ignored_files_count < MAX_IGNORED_FILES );
|
||||
if (!stat( name, &st ))
|
||||
{
|
||||
ignored_files[ignored_files_count].dev = st.st_dev;
|
||||
ignored_files[ignored_files_count].ino = st.st_ino;
|
||||
ignored_files_count++;
|
||||
}
|
||||
}
|
||||
|
||||
static inline BOOL is_ignored_file( const struct stat *st )
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < ignored_files_count; i++)
|
||||
if (ignored_files[i].dev == st->st_dev && ignored_files[i].ino == st->st_ino)
|
||||
return TRUE;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* get_default_com_device
|
||||
*
|
||||
|
@ -694,6 +726,14 @@ static void init_options(void)
|
|||
NtClose( hkey );
|
||||
}
|
||||
NtClose( root );
|
||||
|
||||
/* a couple of directories that we don't want to return in directory searches */
|
||||
ignore_file( wine_get_config_dir() );
|
||||
ignore_file( "/dev" );
|
||||
ignore_file( "/proc" );
|
||||
#ifdef linux
|
||||
ignore_file( "/sys" );
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
@ -929,6 +969,11 @@ static FILE_BOTH_DIR_INFORMATION *append_entry( void *info_ptr, ULONG_PTR *pos,
|
|||
if (stat( long_name, &st ) == -1) return NULL;
|
||||
if (S_ISDIR( st.st_mode )) info->FileAttributes |= FILE_ATTRIBUTE_REPARSE_POINT;
|
||||
}
|
||||
if (is_ignored_file( &st ))
|
||||
{
|
||||
TRACE( "ignoring file %s\n", long_name );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
info->NextEntryOffset = total_len;
|
||||
info->FileIndex = 0; /* NTFS always has 0 here, so let's not bother with it */
|
||||
|
|
Loading…
Reference in New Issue