Rob Shearman : ntdll: Shared manifests should have a less-strict version check performed when loading them as dependencies .

Alexandre Julliard julliard at winehq.org
Mon Nov 26 08:16:16 CST 2007


Module: wine
Branch: master
Commit: 542e10e44eae105d970bcfbf41362e3af417abb5
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=542e10e44eae105d970bcfbf41362e3af417abb5

Author: Rob Shearman <rob at codeweavers.com>
Date:   Tue Nov 20 13:46:43 2007 +0000

ntdll: Shared manifests should have a less-strict version check performed when loading them as dependencies.

---

 dlls/ntdll/actctx.c |   56 +++++++++++++++++++++++++++++++-------------------
 1 files changed, 35 insertions(+), 21 deletions(-)

diff --git a/dlls/ntdll/actctx.c b/dlls/ntdll/actctx.c
index fe83be6..60128bc 100644
--- a/dlls/ntdll/actctx.c
+++ b/dlls/ntdll/actctx.c
@@ -144,7 +144,8 @@ struct dll_redirect
 enum assembly_type
 {
     APPLICATION_MANIFEST,
-    ASSEMBLY_MANIFEST
+    ASSEMBLY_MANIFEST,
+    ASSEMBLY_SHARED_MANIFEST,
 };
 
 struct assembly
@@ -1379,7 +1380,8 @@ static BOOL parse_assembly_elem(xmlbuf_t* xmlbuf, struct actctx_loader* acl,
         if (!parse_noinheritable_elem(xmlbuf) || !next_xml_elem(xmlbuf, &elem))
             return FALSE;
     }
-    else if (assembly->type == ASSEMBLY_MANIFEST && assembly->no_inherit)
+    else if ((assembly->type == ASSEMBLY_MANIFEST || assembly->type == ASSEMBLY_SHARED_MANIFEST) &&
+             assembly->no_inherit)
         return FALSE;
 
     if (xmlstr_cmp(&elem, assemblyIdentityW))
@@ -1393,7 +1395,17 @@ static BOOL parse_assembly_elem(xmlbuf_t* xmlbuf, struct actctx_loader* acl,
             if (assembly->type == ASSEMBLY_MANIFEST &&
                 memcmp(&assembly->id.version, &expected_ai->version, sizeof(assembly->id.version)))
             {
-                FIXME("wrong version\n");
+                FIXME("wrong version for assembly manifest\n");
+                return FALSE;
+            }
+            else if (assembly->type == ASSEMBLY_SHARED_MANIFEST &&
+                (assembly->id.version.major != expected_ai->version.major ||
+                 assembly->id.version.minor != expected_ai->version.minor ||
+                 assembly->id.version.build < expected_ai->version.build ||
+                 (assembly->id.version.build == expected_ai->version.build &&
+                  assembly->id.version.revision < expected_ai->version.revision)))
+            {
+                FIXME("wrong version for shared assembly manifest\n");
                 return FALSE;
             }
         }
@@ -1479,7 +1491,8 @@ static NTSTATUS parse_manifest_buffer( struct actctx_loader* acl, struct assembl
 }
 
 static NTSTATUS parse_manifest( struct actctx_loader* acl, struct assembly_identity* ai,
-                                LPCWSTR filename, LPCWSTR directory, const void *buffer, SIZE_T size )
+                                LPCWSTR filename, LPCWSTR directory, BOOL shared,
+                                const void *buffer, SIZE_T size )
 {
     xmlbuf_t xmlbuf;
     NTSTATUS status;
@@ -1488,7 +1501,7 @@ static NTSTATUS parse_manifest( struct actctx_loader* acl, struct assembly_ident
 
     TRACE( "parsing manifest loaded from %s base dir %s\n", debugstr_w(filename), debugstr_w(directory) );
 
-    if (!(assembly = add_assembly(acl->actctx, ASSEMBLY_MANIFEST)))
+    if (!(assembly = add_assembly(acl->actctx, shared ? ASSEMBLY_SHARED_MANIFEST : ASSEMBLY_MANIFEST)))
         return STATUS_SXS_CANT_GEN_ACTCTX;
 
     if (directory && !(assembly->directory = strdupW(directory)))
@@ -1580,8 +1593,8 @@ static NTSTATUS get_module_filename( HMODULE module, UNICODE_STRING *str, unsign
 }
 
 static NTSTATUS get_manifest_in_module( struct actctx_loader* acl, struct assembly_identity* ai,
-                                        LPCWSTR filename, LPCWSTR directory, HANDLE hModule,
-                                        LPCWSTR resname, ULONG lang )
+                                        LPCWSTR filename, LPCWSTR directory, BOOL shared,
+                                        HANDLE hModule, LPCWSTR resname, ULONG lang )
 {
     NTSTATUS status;
     UNICODE_STRING nameW;
@@ -1630,14 +1643,14 @@ static NTSTATUS get_manifest_in_module( struct actctx_loader* acl, struct assemb
     if (status == STATUS_SUCCESS) status = LdrAccessResource(hModule, entry, &ptr, NULL);
 
     if (status == STATUS_SUCCESS)
-        status = parse_manifest(acl, ai, filename, directory, ptr, entry->Size);
+        status = parse_manifest(acl, ai, filename, directory, shared, ptr, entry->Size);
 
     return status;
 }
 
 static NTSTATUS get_manifest_in_pe_file( struct actctx_loader* acl, struct assembly_identity* ai,
-                                         LPCWSTR filename, LPCWSTR directory, HANDLE file,
-                                         LPCWSTR resname, ULONG lang )
+                                         LPCWSTR filename, LPCWSTR directory, BOOL shared,
+                                         HANDLE file, LPCWSTR resname, ULONG lang )
 {
     HANDLE              mapping;
     OBJECT_ATTRIBUTES   attr;
@@ -1672,7 +1685,7 @@ static NTSTATUS get_manifest_in_pe_file( struct actctx_loader* acl, struct assem
     if (RtlImageNtHeader(base)) /* we got a PE file */
     {
         HANDLE module = (HMODULE)((ULONG_PTR)base | 1);  /* make it a LOAD_LIBRARY_AS_DATAFILE handle */
-        status = get_manifest_in_module( acl, ai, filename, directory, module, resname, lang );
+        status = get_manifest_in_module( acl, ai, filename, directory, shared, module, resname, lang );
     }
     else status = STATUS_INVALID_IMAGE_FORMAT;
 
@@ -1681,7 +1694,7 @@ static NTSTATUS get_manifest_in_pe_file( struct actctx_loader* acl, struct assem
 }
 
 static NTSTATUS get_manifest_in_manifest_file( struct actctx_loader* acl, struct assembly_identity* ai,
-                                               LPCWSTR filename, LPCWSTR directory, HANDLE file )
+                                               LPCWSTR filename, LPCWSTR directory, BOOL shared, HANDLE file )
 {
     FILE_END_OF_FILE_INFORMATION info;
     IO_STATUS_BLOCK io;
@@ -1717,7 +1730,7 @@ static NTSTATUS get_manifest_in_manifest_file( struct actctx_loader* acl, struct
 
     status = NtQueryInformationFile( file, &io, &info, sizeof(info), FileEndOfFileInformation );
     if (status == STATUS_SUCCESS)
-        status = parse_manifest(acl, ai, filename, directory, base, info.EndOfFile.QuadPart);
+        status = parse_manifest(acl, ai, filename, directory, shared, base, info.EndOfFile.QuadPart);
 
     NtUnmapViewOfSection( GetCurrentProcess(), base );
     return status;
@@ -1765,7 +1778,7 @@ static NTSTATUS get_manifest_in_associated_manifest( struct actctx_loader* acl,
 
     if (!open_nt_file( &file, &nameW ))
     {
-        status = get_manifest_in_manifest_file( acl, ai, nameW.Buffer, directory, file );
+        status = get_manifest_in_manifest_file( acl, ai, nameW.Buffer, directory, FALSE, file );
         NtClose( file );
     }
     else status = STATUS_RESOURCE_DATA_NOT_FOUND;
@@ -1905,7 +1918,7 @@ static NTSTATUS lookup_winsxs(struct actctx_loader* acl, struct assembly_identit
 
     if (!open_nt_file( &handle, &path_us ))
     {
-        io.u.Status = get_manifest_in_manifest_file(acl, &sxs_ai, path_us.Buffer, file, handle);
+        io.u.Status = get_manifest_in_manifest_file(acl, &sxs_ai, path_us.Buffer, file, TRUE, handle);
         NtClose( handle );
     }
     else io.u.Status = STATUS_NO_SUCH_FILE;
@@ -1962,7 +1975,7 @@ static NTSTATUS lookup_assembly(struct actctx_loader* acl,
             status = open_nt_file( &file, &nameW );
             if (!status)
             {
-                status = get_manifest_in_pe_file( acl, ai, nameW.Buffer, directory, file,
+                status = get_manifest_in_pe_file( acl, ai, nameW.Buffer, directory, FALSE, file,
                                                   (LPCWSTR)CREATEPROCESS_MANIFEST_RESOURCE_ID, 0 );
                 NtClose( file );
                 break;
@@ -1976,7 +1989,7 @@ static NTSTATUS lookup_assembly(struct actctx_loader* acl,
             status = open_nt_file( &file, &nameW );
             if (!status)
             {
-                status = get_manifest_in_manifest_file( acl, ai, nameW.Buffer, directory, file );
+                status = get_manifest_in_manifest_file( acl, ai, nameW.Buffer, directory, FALSE, file );
                 NtClose( file );
                 break;
             }
@@ -2230,7 +2243,7 @@ NTSTATUS WINAPI RtlCreateActivationContext( HANDLE *handle, const void *ptr )
         /* if we have a resource it's a PE file */
         if (pActCtx->dwFlags & ACTCTX_FLAG_HMODULE_VALID)
         {
-            status = get_manifest_in_module( &acl, NULL, NULL, directory, pActCtx->hModule,
+            status = get_manifest_in_module( &acl, NULL, NULL, directory, FALSE, pActCtx->hModule,
                                              pActCtx->lpResourceName, lang );
             if (status && status != STATUS_SXS_CANT_GEN_ACTCTX)
                 /* FIXME: what to do if pActCtx->lpSource is set */
@@ -2239,7 +2252,7 @@ NTSTATUS WINAPI RtlCreateActivationContext( HANDLE *handle, const void *ptr )
         }
         else if (pActCtx->lpSource)
         {
-            status = get_manifest_in_pe_file( &acl, NULL, nameW.Buffer, directory,
+            status = get_manifest_in_pe_file( &acl, NULL, nameW.Buffer, directory, FALSE,
                                               file, pActCtx->lpResourceName, lang );
             if (status && status != STATUS_SXS_CANT_GEN_ACTCTX)
                 status = get_manifest_in_associated_manifest( &acl, NULL, nameW.Buffer, directory,
@@ -2249,7 +2262,7 @@ NTSTATUS WINAPI RtlCreateActivationContext( HANDLE *handle, const void *ptr )
     }
     else
     {
-        status = get_manifest_in_manifest_file( &acl, NULL, nameW.Buffer, directory, file );
+        status = get_manifest_in_manifest_file( &acl, NULL, nameW.Buffer, directory, FALSE, file );
     }
 
     if (file) NtClose( file );
@@ -2502,7 +2515,8 @@ NTSTATUS WINAPI RtlQueryInformationActivationContext( ULONG flags, HANDLE handle
             id_len = strlenW(assembly_id) + 1;
             if (assembly->directory) ad_len = strlenW(assembly->directory) + 1;
 
-            if (assembly->manifest.info && assembly->type == ASSEMBLY_MANIFEST)
+            if (assembly->manifest.info &&
+                (assembly->type == ASSEMBLY_MANIFEST || assembly->type == ASSEMBLY_SHARED_MANIFEST))
                 path_len  = strlenW(assembly->manifest.info) + 1;
 
             len = sizeof(*afdi) + (id_len + ad_len + path_len) * sizeof(WCHAR);




More information about the wine-cvs mailing list