summaryrefslogtreecommitdiff
path: root/lib/relocatable.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/relocatable.c')
-rw-r--r--lib/relocatable.c70
1 files changed, 38 insertions, 32 deletions
diff --git a/lib/relocatable.c b/lib/relocatable.c
index 1353ab5..1ca8ec0 100644
--- a/lib/relocatable.c
+++ b/lib/relocatable.c
@@ -1,27 +1,18 @@
/* Provide relocatable packages.
- Copyright (C) 2003-2006, 2008-2018 Free Software Foundation, Inc.
+ Copyright (C) 2003-2006, 2008-2022 Free Software Foundation, Inc.
Written by Bruno Haible <bruno@clisp.org>, 2003.
- This program is free software: you can redistribute it and/or
- modify it under the terms of either:
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
- * the GNU Lesser General Public License as published by the Free
- Software Foundation; either version 3 of the License, or (at your
- option) any later version.
-
- or
-
- * the GNU General Public License as published by the Free
- Software Foundation; either version 2 of the License, or (at your
- option) any later version.
-
- or both in parallel, as here.
- This program is distributed in the hope that it will be useful,
+ This file is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
+ GNU Lesser General Public License for more details.
- You should have received a copy of the GNU General Public License
+ You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. */
@@ -74,6 +65,12 @@
# include <libintl.h>
#endif
+#if defined _WIN32 && !defined __CYGWIN__
+/* Don't assume that UNICODE is not defined. */
+# undef GetModuleFileName
+# define GetModuleFileName GetModuleFileNameA
+#endif
+
/* Faked cheap 'bool'. */
#undef bool
#undef false
@@ -83,8 +80,8 @@
#define true 1
/* Pathname support.
- ISSLASH(C) tests whether C is a directory separator character.
- IS_PATH_WITH_DIR(P) tests whether P contains a directory specification.
+ ISSLASH(C) tests whether C is a directory separator character.
+ IS_FILE_NAME_WITH_DIR(P) tests whether P contains a directory specification.
*/
#if (defined _WIN32 && !defined __CYGWIN__) || defined __EMX__ || defined __DJGPP__
/* Native Windows, OS/2, DOS */
@@ -92,13 +89,13 @@
# define HAS_DEVICE(P) \
((((P)[0] >= 'A' && (P)[0] <= 'Z') || ((P)[0] >= 'a' && (P)[0] <= 'z')) \
&& (P)[1] == ':')
-# define IS_PATH_WITH_DIR(P) \
+# define IS_FILE_NAME_WITH_DIR(P) \
(strchr (P, '/') != NULL || strchr (P, '\\') != NULL || HAS_DEVICE (P))
# define FILE_SYSTEM_PREFIX_LEN(P) (HAS_DEVICE (P) ? 2 : 0)
#else
/* Unix */
# define ISSLASH(C) ((C) == '/')
-# define IS_PATH_WITH_DIR(P) (strchr (P, '/') != NULL)
+# define IS_FILE_NAME_WITH_DIR(P) (strchr (P, '/') != NULL)
# define FILE_SYSTEM_PREFIX_LEN(P) 0
#endif
@@ -277,7 +274,7 @@ compute_curr_prefix (const char *orig_installprefix,
}
if (!same)
break;
- /* The last pathname component was the same. opi and cpi now point
+ /* The last pathname component was the same. rpi and cpi now point
to the slash before it. */
rp = rpi;
cp = cpi;
@@ -291,23 +288,23 @@ compute_curr_prefix (const char *orig_installprefix,
}
{
- size_t curr_prefix_len = cp - curr_installdir;
- char *curr_prefix;
+ size_t computed_curr_prefix_len = cp - curr_installdir;
+ char *computed_curr_prefix;
- curr_prefix = (char *) xmalloc (curr_prefix_len + 1);
+ computed_curr_prefix = (char *) xmalloc (computed_curr_prefix_len + 1);
#ifdef NO_XMALLOC
- if (curr_prefix == NULL)
+ if (computed_curr_prefix == NULL)
{
free (curr_installdir);
return NULL;
}
#endif
- memcpy (curr_prefix, curr_installdir, curr_prefix_len);
- curr_prefix[curr_prefix_len] = '\0';
+ memcpy (computed_curr_prefix, curr_installdir, computed_curr_prefix_len);
+ computed_curr_prefix[computed_curr_prefix_len] = '\0';
free (curr_installdir);
- return curr_prefix;
+ return computed_curr_prefix;
}
}
}
@@ -326,7 +323,10 @@ static char *shared_library_fullname;
supports longer file names
(see <https://cygwin.com/ml/cygwin/2011-01/msg00410.html>). */
-/* Determine the full pathname of the shared library when it is loaded. */
+/* Determine the full pathname of the shared library when it is loaded.
+
+ Documentation:
+ <https://docs.microsoft.com/en-us/windows/win32/dlls/dllmain> */
BOOL WINAPI
DllMain (HINSTANCE module_handle, DWORD event, LPVOID reserved)
@@ -342,11 +342,17 @@ DllMain (HINSTANCE module_handle, DWORD event, LPVOID reserved)
/* Shouldn't happen. */
return FALSE;
- if (!IS_PATH_WITH_DIR (location))
+ if (!IS_FILE_NAME_WITH_DIR (location))
/* Shouldn't happen. */
return FALSE;
- shared_library_fullname = strdup (location);
+ /* Avoid a memory leak when the same DLL get attached, detached,
+ attached, detached, and so on. This happens e.g. when a spell
+ checker DLL is used repeatedly by a mail program. */
+ if (!(shared_library_fullname != NULL
+ && strcmp (shared_library_fullname, location) == 0))
+ /* Remember the full pathname of the shared library. */
+ shared_library_fullname = strdup (location);
}
return TRUE;