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