Alexandre Julliard : ntdll: Use malloc() to allocate the directory cache.
Alexandre Julliard
julliard at winehq.org
Tue Jul 14 16:23:37 CDT 2020
Module: wine
Branch: master
Commit: e9abe3f7395a81dcb6d192b48bd54848dc4f2b5e
URL: https://source.winehq.org/git/wine.git/?a=commit;h=e9abe3f7395a81dcb6d192b48bd54848dc4f2b5e
Author: Alexandre Julliard <julliard at winehq.org>
Date: Tue Jul 14 10:33:18 2020 +0200
ntdll: Use malloc() to allocate the directory cache.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/ntdll/unix/file.c | 46 ++++++++++++++--------------------------------
1 file changed, 14 insertions(+), 32 deletions(-)
diff --git a/dlls/ntdll/unix/file.c b/dlls/ntdll/unix/file.c
index cee9800fc8..c003b08996 100644
--- a/dlls/ntdll/unix/file.c
+++ b/dlls/ntdll/unix/file.c
@@ -379,8 +379,7 @@ static void *get_dir_data_space( struct dir_data *data, unsigned int size )
{
unsigned int new_size = buffer ? buffer->size * 2 : dir_data_buffer_initial_size;
if (new_size < size) new_size = size;
- if (!(buffer = RtlAllocateHeap( GetProcessHeap(), 0,
- offsetof( struct dir_data_buffer, data[new_size] ) ))) return NULL;
+ if (!(buffer = malloc( offsetof( struct dir_data_buffer, data[new_size] ) ))) return NULL;
buffer->pos = 0;
buffer->size = new_size;
buffer->next = data->buffer;
@@ -419,9 +418,7 @@ static BOOL add_dir_data_names( struct dir_data *data, const WCHAR *long_name,
{
unsigned int new_size = max( data->size * 2, dir_data_names_initial_size );
- if (names) names = RtlReAllocateHeap( GetProcessHeap(), 0, names, new_size * sizeof(*names) );
- else names = RtlAllocateHeap( GetProcessHeap(), 0, new_size * sizeof(*names) );
- if (!names) return FALSE;
+ if (!(names = realloc( names, new_size * sizeof(*names) ))) return FALSE;
data->size = new_size;
data->names = names;
}
@@ -448,10 +445,10 @@ static void free_dir_data( struct dir_data *data )
for (buffer = data->buffer; buffer; buffer = next)
{
next = buffer->next;
- RtlFreeHeap( GetProcessHeap(), 0, buffer );
+ free( buffer );
}
- RtlFreeHeap( GetProcessHeap(), 0, data->names );
- RtlFreeHeap( GetProcessHeap(), 0, data );
+ free( data->names );
+ free( data );
}
@@ -468,8 +465,7 @@ static struct list dir_queue = LIST_INIT( dir_queue );
static NTSTATUS add_dir_to_queue( const char *name )
{
int len = strlen( name ) + 1;
- struct dir_name *dir = RtlAllocateHeap( GetProcessHeap(), 0,
- FIELD_OFFSET( struct dir_name, name[len] ));
+ struct dir_name *dir = malloc( offsetof( struct dir_name, name[len] ));
if (!dir) return STATUS_NO_MEMORY;
strcpy( dir->name, name );
list_add_tail( &dir_queue, &dir->entry );
@@ -484,7 +480,7 @@ static NTSTATUS next_dir_in_queue( char *name )
struct dir_name *dir = LIST_ENTRY( head, struct dir_name, entry );
strcpy( name, dir->name );
list_remove( &dir->entry );
- RtlFreeHeap( GetProcessHeap(), 0, dir );
+ free( dir );
return STATUS_SUCCESS;
}
return STATUS_OBJECT_NAME_NOT_FOUND;
@@ -498,7 +494,7 @@ static void flush_dir_queue(void)
{
struct dir_name *dir = LIST_ENTRY( head, struct dir_name, entry );
list_remove( &dir->entry );
- RtlFreeHeap( GetProcessHeap(), 0, dir );
+ free( dir );
}
}
@@ -2293,8 +2289,7 @@ static NTSTATUS init_cached_dir_data( struct dir_data **data_ret, int fd, const
NTSTATUS status;
unsigned int i;
- if (!(data = RtlAllocateHeap( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*data) )))
- return STATUS_NO_MEMORY;
+ if (!(data = calloc( 1, sizeof(*data) ))) return STATUS_NO_MEMORY;
if ((status = read_directory_data( data, fd, mask )))
{
@@ -2310,18 +2305,9 @@ static NTSTATUS init_cached_dir_data( struct dir_data **data_ret, int fd, const
if (data->count)
{
- /* release unused space */
- if (data->buffer)
- RtlReAllocateHeap( GetProcessHeap(), HEAP_REALLOC_IN_PLACE_ONLY, data->buffer,
- offsetof( struct dir_data_buffer, data[data->buffer->pos] ));
- if (data->count < data->size)
- RtlReAllocateHeap( GetProcessHeap(), HEAP_REALLOC_IN_PLACE_ONLY, data->names,
- data->count * sizeof(*data->names) );
- if (!fstat( fd, &st ))
- {
- data->id.dev = st.st_dev;
- data->id.ino = st.st_ino;
- }
+ fstat( fd, &st );
+ data->id.dev = st.st_dev;
+ data->id.ino = st.st_ino;
}
TRACE( "mask %s found %u files\n", debugstr_us( mask ), data->count );
@@ -2372,14 +2358,10 @@ static NTSTATUS get_cached_dir_data( HANDLE handle, struct dir_data **data_ret,
if (entry >= dir_data_cache_size)
{
unsigned int size = max( dir_data_cache_initial_size, max( dir_data_cache_size * 2, entry + 1 ) );
- struct dir_data **new_cache;
+ struct dir_data **new_cache = realloc( dir_data_cache, size * sizeof(*new_cache) );
- if (dir_data_cache)
- new_cache = RtlReAllocateHeap( GetProcessHeap(), HEAP_ZERO_MEMORY, dir_data_cache,
- size * sizeof(*new_cache) );
- else
- new_cache = RtlAllocateHeap( GetProcessHeap(), HEAP_ZERO_MEMORY, size * sizeof(*new_cache) );
if (!new_cache) return STATUS_NO_MEMORY;
+ memset( new_cache + dir_data_cache_size, 0, (size - dir_data_cache_size) * sizeof(*new_cache) );
dir_data_cache = new_cache;
dir_data_cache_size = size;
}
More information about the wine-cvs
mailing list