Alexandre Julliard : server: Store a filename for memory views of .so dlls.
Alexandre Julliard
julliard at winehq.org
Mon Feb 15 16:09:50 CST 2021
Module: wine
Branch: master
Commit: 9ce326eea026f99ecc7c1e45084e8fd53105e8a8
URL: https://source.winehq.org/git/wine.git/?a=commit;h=9ce326eea026f99ecc7c1e45084e8fd53105e8a8
Author: Alexandre Julliard <julliard at winehq.org>
Date: Mon Feb 15 12:24:15 2021 +0100
server: Store a filename for memory views of .so dlls.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/ntdll/unix/loader.c | 9 +++++----
dlls/ntdll/unix/unix_private.h | 3 ++-
dlls/ntdll/unix/virtual.c | 5 +++--
include/wine/server_protocol.h | 3 ++-
server/mapping.c | 25 +++++++++++++++++++------
server/protocol.def | 1 +
server/trace.c | 3 ++-
7 files changed, 34 insertions(+), 15 deletions(-)
diff --git a/dlls/ntdll/unix/loader.c b/dlls/ntdll/unix/loader.c
index e8853415205..b82bc10485b 100644
--- a/dlls/ntdll/unix/loader.c
+++ b/dlls/ntdll/unix/loader.c
@@ -981,7 +981,8 @@ static void fill_builtin_image_info( void *module, pe_image_info_t *info )
/***********************************************************************
* dlopen_dll
*/
-static NTSTATUS dlopen_dll( const char *so_name, void **ret_module, pe_image_info_t *image_info )
+static NTSTATUS dlopen_dll( const char *so_name, UNICODE_STRING *nt_name,
+ void **ret_module, pe_image_info_t *image_info )
{
struct builtin_module *builtin;
void *module, *handle;
@@ -1028,7 +1029,7 @@ static NTSTATUS dlopen_dll( const char *so_name, void **ret_module, pe_image_inf
dlclose( handle );
return STATUS_NO_MEMORY;
}
- virtual_create_builtin_view( module, image_info );
+ virtual_create_builtin_view( module, nt_name, image_info );
*ret_module = module;
return STATUS_SUCCESS;
@@ -1107,7 +1108,7 @@ static NTSTATUS CDECL load_so_dll( UNICODE_STRING *nt_name, void **module )
len = nt_name->Length / sizeof(WCHAR);
if (len > 3 && !wcsicmp( nt_name->Buffer + len - 3, soW )) nt_name->Length -= 3 * sizeof(WCHAR);
- status = dlopen_dll( unix_name, module, &info );
+ status = dlopen_dll( unix_name, nt_name, module, &info );
free( unix_name );
return status;
}
@@ -1261,7 +1262,7 @@ static NTSTATUS open_builtin_file( char *name, OBJECT_ATTRIBUTES *attr, HANDLE *
{
pe_image_info_t info;
- if (!dlopen_dll( name, module, &info ))
+ if (!dlopen_dll( name, attr->ObjectName, module, &info ))
{
virtual_fill_image_information( &info, image_info );
status = STATUS_SUCCESS;
diff --git a/dlls/ntdll/unix/unix_private.h b/dlls/ntdll/unix/unix_private.h
index 292a38043dd..af8a14a8c65 100644
--- a/dlls/ntdll/unix/unix_private.h
+++ b/dlls/ntdll/unix/unix_private.h
@@ -179,7 +179,8 @@ extern void *anon_mmap_alloc( size_t size, int prot ) DECLSPEC_HIDDEN;
extern void virtual_init(void) DECLSPEC_HIDDEN;
extern ULONG_PTR get_system_affinity_mask(void) DECLSPEC_HIDDEN;
extern void virtual_get_system_info( SYSTEM_BASIC_INFORMATION *info ) DECLSPEC_HIDDEN;
-extern NTSTATUS virtual_create_builtin_view( void *module, pe_image_info_t *info ) DECLSPEC_HIDDEN;
+extern NTSTATUS virtual_create_builtin_view( void *module, const UNICODE_STRING *nt_name,
+ pe_image_info_t *info ) DECLSPEC_HIDDEN;
extern TEB *virtual_alloc_first_teb(void) DECLSPEC_HIDDEN;
extern NTSTATUS virtual_alloc_teb( TEB **ret_teb ) DECLSPEC_HIDDEN;
extern void virtual_free_teb( TEB *teb ) DECLSPEC_HIDDEN;
diff --git a/dlls/ntdll/unix/virtual.c b/dlls/ntdll/unix/virtual.c
index e0346a28ea3..c35f9c2fc07 100644
--- a/dlls/ntdll/unix/virtual.c
+++ b/dlls/ntdll/unix/virtual.c
@@ -2483,7 +2483,7 @@ void virtual_get_system_info( SYSTEM_BASIC_INFORMATION *info )
/***********************************************************************
* virtual_create_builtin_view
*/
-NTSTATUS virtual_create_builtin_view( void *module, pe_image_info_t *info )
+NTSTATUS virtual_create_builtin_view( void *module, const UNICODE_STRING *nt_name, pe_image_info_t *info )
{
NTSTATUS status;
sigset_t sigset;
@@ -2500,7 +2500,7 @@ NTSTATUS virtual_create_builtin_view( void *module, pe_image_info_t *info )
VPROT_COMMITTED | VPROT_READ | VPROT_WRITECOPY | VPROT_EXEC );
if (!status)
{
- TRACE( "created %p-%p\n", base, (char *)base + size );
+ TRACE( "created %p-%p for %s\n", base, (char *)base + size, debugstr_us(nt_name) );
/* The PE header is always read-only, no write, no execute. */
set_page_vprot( base, page_size, VPROT_COMMITTED | VPROT_READ );
@@ -2521,6 +2521,7 @@ NTSTATUS virtual_create_builtin_view( void *module, pe_image_info_t *info )
req->base = wine_server_client_ptr( view->base );
req->size = size;
wine_server_add_data( req, info, sizeof(*info) );
+ wine_server_add_data( req, nt_name->Buffer, nt_name->Length );
status = wine_server_call( req );
}
SERVER_END_REQ;
diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h
index 9b9626c1c84..d2a361df26d 100644
--- a/include/wine/server_protocol.h
+++ b/include/wine/server_protocol.h
@@ -1923,6 +1923,7 @@ struct map_view_request
mem_size_t size;
file_pos_t start;
/* VARARG(image,pe_image_info); */
+ /* VARARG(name,unicode_str); */
};
struct map_view_reply
{
@@ -6265,7 +6266,7 @@ union generic_reply
/* ### protocol_version begin ### */
-#define SERVER_PROTOCOL_VERSION 674
+#define SERVER_PROTOCOL_VERSION 675
/* ### protocol_version end ### */
diff --git a/server/mapping.c b/server/mapping.c
index 0e97391f74b..17c7ca26b3a 100644
--- a/server/mapping.c
+++ b/server/mapping.c
@@ -134,6 +134,8 @@ struct memory_view
client_ptr_t base; /* view base address (in process addr space) */
mem_size_t size; /* view size */
file_pos_t start; /* start offset in mapping */
+ data_size_t namelen;
+ WCHAR name[1]; /* filename for .so dll image views */
};
@@ -1000,6 +1002,12 @@ const pe_image_info_t *get_view_image_info( const struct memory_view *view, clie
/* get the file name for a mapped view */
int get_view_nt_name( const struct memory_view *view, struct unicode_str *name )
{
+ if (view->namelen) /* .so builtin */
+ {
+ name->str = view->name;
+ name->len = view->namelen;
+ return 1;
+ }
if (!view->fd) return 0;
get_nt_name( view->fd, name );
return 1;
@@ -1157,6 +1165,7 @@ DECL_HANDLER(map_view)
{
struct mapping *mapping = NULL;
struct memory_view *view;
+ data_size_t namelen = 0;
if (!req->size || (req->base & page_mask) || req->base + req->size < req->base) /* overflow */
{
@@ -1175,13 +1184,16 @@ DECL_HANDLER(map_view)
if (!req->mapping) /* image mapping for a .so dll */
{
- if (!(view = mem_alloc( sizeof(*view) ))) return;
+ if (get_req_data_size() > sizeof(view->image)) namelen = get_req_data_size() - sizeof(view->image);
+ if (!(view = mem_alloc( offsetof( struct memory_view, name[namelen] )))) return;
memset( view, 0, sizeof(*view) );
- view->base = req->base;
- view->size = req->size;
- view->start = req->start;
- view->flags = SEC_IMAGE;
+ view->base = req->base;
+ view->size = req->size;
+ view->start = req->start;
+ view->flags = SEC_IMAGE;
+ view->namelen = namelen;
memcpy( &view->image, get_req_data(), min( sizeof(view->image), get_req_data_size() ));
+ memcpy( view->name, (pe_image_info_t *)get_req_data() + 1, namelen );
add_process_view( current, view );
return;
}
@@ -1204,12 +1216,13 @@ DECL_HANDLER(map_view)
goto done;
}
- if ((view = mem_alloc( sizeof(*view) )))
+ if ((view = mem_alloc( offsetof( struct memory_view, name[namelen] ))))
{
view->base = req->base;
view->size = req->size;
view->start = req->start;
view->flags = mapping->flags;
+ view->namelen = namelen;
view->fd = !is_fd_removable( mapping->fd ) ? (struct fd *)grab_object( mapping->fd ) : NULL;
view->committed = mapping->committed ? (struct ranges *)grab_object( mapping->committed ) : NULL;
view->shared = mapping->shared ? (struct shared_map *)grab_object( mapping->shared ) : NULL;
diff --git a/server/protocol.def b/server/protocol.def
index caed5c37352..f85826cc277 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -1540,6 +1540,7 @@ enum server_fd_type
mem_size_t size; /* view size */
file_pos_t start; /* start offset in mapping */
VARARG(image,pe_image_info);/* image info for .so builtins */
+ VARARG(name,unicode_str); /* image filename for .so builtins */
@END
diff --git a/server/trace.c b/server/trace.c
index 8984b75590d..5265cc69a15 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -1308,7 +1308,7 @@ static void dump_varargs_pe_image_info( const char *prefix, data_size_t size )
info.header_size, info.file_size, info.checksum );
dump_client_cpu( ",cpu=", &info.cpu );
fputc( '}', stderr );
- remove_data( size );
+ remove_data( min( size, sizeof(info) ));
}
static void dump_varargs_rawinput_devices(const char *prefix, data_size_t size )
@@ -2158,6 +2158,7 @@ static void dump_map_view_request( const struct map_view_request *req )
dump_uint64( ", size=", &req->size );
dump_uint64( ", start=", &req->start );
dump_varargs_pe_image_info( ", image=", cur_size );
+ dump_varargs_unicode_str( ", name=", cur_size );
}
static void dump_unmap_view_request( const struct unmap_view_request *req )
More information about the wine-cvs
mailing list