Module: wine Branch: master Commit: 728b6fc5e65aabeb1bb94954045d739b605a5a1f URL: https://source.winehq.org/git/wine.git/?a=commit;h=728b6fc5e65aabeb1bb949540...
Author: Francois Gouget fgouget@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@codeweavers.com Signed-off-by: Alexandre Julliard julliard@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 */