From: Bruno Haible Date: Thu, 10 Jan 2008 10:12:06 +0000 (+0100) Subject: Make it possible to avoid all memory leaks when calling relocate(). X-Git-Tag: v0.1~7854 X-Git-Url: http://erislabs.org.uk/gitweb/?a=commitdiff_plain;h=619c189e199adf139ed298d1852e92987eb6289f;p=gnulib.git Make it possible to avoid all memory leaks when calling relocate(). --- diff --git a/ChangeLog b/ChangeLog index 7ab6e166d..900413d7e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,12 @@ -2008-01-10 Colin Watson +2008-01-10 Bruno Haible + + * lib/relocatable.h (relocate): State whether result is freshly + allocated or not. + * lib/relocatable.c (relocate): Return a freshly allocated string + instead of a pointer to a privately held string. + Reported by Sylvain Beucler . + +2008-01-10 Colin Watson * lib/canonicalize-lgpl.c [!_LIBC]: Fix typo in #if directive: s/S_ISNLK/S_ISLNK/. diff --git a/lib/relocatable.c b/lib/relocatable.c index e814a0e4e..09ff8c9ef 100644 --- a/lib/relocatable.c +++ b/lib/relocatable.c @@ -409,7 +409,9 @@ get_shared_library_fullname () #endif /* PIC */ /* Returns the pathname, relocated according to the current installation - directory. */ + directory. + The returned string is either PATHNAME unmodified or a freshly allocated + string that you can free with free() after casting it to 'char *'. */ const char * relocate (const char *pathname) { @@ -455,9 +457,19 @@ relocate (const char *pathname) && strncmp (pathname, orig_prefix, orig_prefix_len) == 0) { if (pathname[orig_prefix_len] == '\0') - /* pathname equals orig_prefix. */ - return curr_prefix; - if (ISSLASH (pathname[orig_prefix_len])) + { + /* pathname equals orig_prefix. */ + char *result = (char *) xmalloc (strlen (curr_prefix) + 1); + +#ifdef NO_XMALLOC + if (result != NULL) +#endif + { + strcpy (result, curr_prefix); + return result; + } + } + else if (ISSLASH (pathname[orig_prefix_len])) { /* pathname starts with orig_prefix. */ const char *pathname_tail = &pathname[orig_prefix_len]; diff --git a/lib/relocatable.h b/lib/relocatable.h index 5970be7a2..8f1e2aa1b 100644 --- a/lib/relocatable.h +++ b/lib/relocatable.h @@ -49,12 +49,15 @@ extern RELOCATABLE_DLL_EXPORTED void const char *curr_prefix); /* Returns the pathname, relocated according to the current installation - directory. */ + directory. + The returned string is either PATHNAME unmodified or a freshly allocated + string that you can free with free() after casting it to 'char *'. */ extern const char * relocate (const char *pathname); /* Memory management: relocate() leaks memory, because it has to construct a fresh pathname. If this is a problem because your program calls - relocate() frequently, think about caching the result. */ + relocate() frequently, think about caching the result. Or free the + return value if it was different from the argument pathname. */ /* Convenience function: Computes the current installation prefix, based on the original