Francois Gouget : libwine: Fully dereference the /proc/self/ exe symbolic link.

Alexandre Julliard julliard at winehq.org
Tue Sep 3 16:34:07 CDT 2019


Module: wine
Branch: master
Commit: 728b6fc5e65aabeb1bb94954045d739b605a5a1f
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=728b6fc5e65aabeb1bb94954045d739b605a5a1f

Author: Francois Gouget <fgouget at codeweavers.com>
Date:   Mon Sep  2 04:20:40 2019 +0200

libwine: Fully dereference the /proc/self/exe symbolic link.

Linux will do it for us but not NetBSD. That is, if foo is an executable
that prints the path /proc/self/exe points to, on Linux one gets:

$ ./foo
/tmp/foo
$ ln -s foo bar
$ ln -s bar babar
$ /tmp/babar
/tmp/foo

But on NetBSD one gets instead:

$ ./foo
/tmp/./foo
$ ln -s foo bar
$ ln -s bar babar
$ /tmp/babar
/tmp/babar

Fully dereferencing /proc/self/exe is necessary to be able to run both
32 and 64 bit executables from the build tree.

Signed-off-by: Francois Gouget <fgouget at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 libs/wine/config.c | 30 ++++++------------------------
 1 file changed, 6 insertions(+), 24 deletions(-)

diff --git a/libs/wine/config.c b/libs/wine/config.c
index 3c9110b..bdf065f 100644
--- a/libs/wine/config.c
+++ b/libs/wine/config.c
@@ -164,33 +164,15 @@ static char *get_runtime_libdir(void)
 /* read a symlink and return its directory */
 static char *symlink_dirname( const char *name )
 {
-    char *p, *buffer, *absdir = NULL;
-    int ret, size;
+    char *p, *fullpath = realpath( name, NULL );
 
-    for (size = 256; ; size *= 2)
+    if (fullpath)
     {
-        if (!(buffer = malloc( size ))) return NULL;
-        if ((ret = readlink( name, buffer, size )) == -1) break;
-        if (ret != size)
-        {
-            buffer[ret] = 0;
-            if (!(p = strrchr( buffer, '/' ))) break;
-            if (p == buffer) p++;
-            *p = 0;
-            if (buffer[0] == '/') return buffer;
-            /* make it absolute */
-            absdir = xmalloc( strlen(name) + strlen(buffer) + 1 );
-            strcpy( absdir, name );
-            if (!(p = strrchr( absdir, '/' ))) break;
-            strcpy( p + 1, buffer );
-            free( buffer );
-            return absdir;
-        }
-        free( buffer );
+        p = strrchr( fullpath, '/' );
+        if (p == fullpath) p++;
+        if (p) *p = 0;
     }
-    free( buffer );
-    free( absdir );
-    return NULL;
+    return fullpath;
 }
 
 /* return the directory that contains the main exe at run-time */




More information about the wine-cvs mailing list