Make it possible to avoid all memory leaks when calling relocate().
authorBruno Haible <bruno@clisp.org>
Thu, 10 Jan 2008 10:12:06 +0000 (11:12 +0100)
committerBruno Haible <bruno@clisp.org>
Thu, 10 Jan 2008 10:12:06 +0000 (11:12 +0100)
ChangeLog
lib/relocatable.c
lib/relocatable.h

index 7ab6e16..900413d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,12 @@
-2008-01-10   Colin Watson  <cjwatson@debian.org>
+2008-01-10  Bruno Haible  <bruno@clisp.org>
+
+       * 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 <beuc@gnu.org>.
+
+2008-01-10  Colin Watson  <cjwatson@debian.org>
 
        * lib/canonicalize-lgpl.c [!_LIBC]: Fix typo in #if directive:
        s/S_ISNLK/S_ISLNK/.
index e814a0e..09ff8c9 100644 (file)
@@ -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];
index 5970be7..8f1e2aa 100644 (file)
@@ -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