[PATCH] libwine: Collapse relative paths inside config directories.

Paul Gofman gofmanp at gmail.com
Wed Oct 2 15:20:18 CDT 2019


Signed-off-by: Paul Gofman <gofmanp at gmail.com>
---
    The motivation under this patch is fixing the crash in Halo Online which
    originates from libcef.dll with Wine Staging. The crash scenario is the
    following.

    A staging patch puts a 'Times New Roman' font replacement to
    <datadir>/fonts/times.ttf. This is the only relevant difference introduced by
    Staging. When the font file is found there, gdi32 uses wine_get_data_dir()
    for a directory prefix to construct font file name. Later libcef.dll works
    with fonts through dwrite, and somehow gets confused by a "\\..\\" inside the
    font file name which it gets with IDWriteLocalFontFileLoader_GetFilePathFromKey()
    from system font file enumerator object.

    A minimally sufficient fix for that is to collapse the font file name in
    create_local_file_reference() or right in localfontfileloader_GetFilePathFromKey()
    in dwrite/font.c. But it probably makes sense to have the paths in registry
    free of spurious "\\..\\" as these values are also exposed to applications.

 libs/wine/config.c | 17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)

diff --git a/libs/wine/config.c b/libs/wine/config.c
index 2a3314cbfd..5fbda6ca51 100644
--- a/libs/wine/config.c
+++ b/libs/wine/config.c
@@ -132,10 +132,23 @@ static inline void remove_trailing_slashes( char *path )
 static char *build_path( const char *dir, const char *name )
 {
     size_t len = strlen(dir);
-    char *ret = xmalloc( len + strlen(name) + 2 );
+    char *ret;
+
+    if (len && dir[len - 1] == '/')
+        --len;
+
+    while (len && name[0] == '.' && name[1] == '.' && name[2] == '/')
+    {
+        while (--len && dir[len] != '/')
+            ;
+
+        name += 3;
+    }
+
+    ret = xmalloc( len + strlen(name) + 2 );
 
     memcpy( ret, dir, len );
-    if (len && ret[len-1] != '/') ret[len++] = '/';
+    ret[len++] = '/';
     strcpy( ret + len, name );
     return ret;
 }
-- 
2.21.0




More information about the wine-devel mailing list