Update from gnulib.
diff --git a/libcharset/lib/ChangeLog b/libcharset/lib/ChangeLog
index 221df04..de9638e 100644
--- a/libcharset/lib/ChangeLog
+++ b/libcharset/lib/ChangeLog
@@ -1,3 +1,8 @@
+2009-03-25  Bruno Haible  <bruno@clisp.org>
+
+	* relocatable.h: Update from gnulib.
+	* relocatable.c: Likewise.
+
 2009-01-25  Bruno Haible  <bruno@clisp.org>
 
 	Don't install charset.alias on MacOS X >= 10.3.
diff --git a/libcharset/lib/relocatable.c b/libcharset/lib/relocatable.c
index 5e1dde6..09ff8c9 100644
--- a/libcharset/lib/relocatable.c
+++ b/libcharset/lib/relocatable.c
@@ -1,5 +1,5 @@
 /* Provide relocatable packages.
-   Copyright (C) 2003-2006 Free Software Foundation, Inc.
+   Copyright (C) 2003-2006, 2008 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
@@ -160,17 +160,18 @@
 /* Convenience function:
    Computes the current installation prefix, based on the original
    installation prefix, the original installation directory of a particular
-   file, and the current pathname of this file.  Returns NULL upon failure.  */
+   file, and the current pathname of this file.
+   Returns it, freshly allocated.  Returns NULL upon failure.  */
 #ifdef IN_LIBRARY
 #define compute_curr_prefix local_compute_curr_prefix
 static
 #endif
-const char *
+char *
 compute_curr_prefix (const char *orig_installprefix,
 		     const char *orig_installdir,
 		     const char *curr_pathname)
 {
-  const char *curr_installdir;
+  char *curr_installdir;
   const char *rel_installdir;
 
   if (curr_pathname == NULL)
@@ -254,8 +255,11 @@
       }
 
     if (rp > rel_installdir)
-      /* Unexpected: The curr_installdir does not end with rel_installdir.  */
-      return NULL;
+      {
+	/* Unexpected: The curr_installdir does not end with rel_installdir.  */
+	free (curr_installdir);
+	return NULL;
+      }
 
     {
       size_t curr_prefix_len = cp - curr_installdir;
@@ -264,11 +268,16 @@
       curr_prefix = (char *) xmalloc (curr_prefix_len + 1);
 #ifdef NO_XMALLOC
       if (curr_prefix == NULL)
-	return NULL;
+	{
+	  free (curr_installdir);
+	  return NULL;
+	}
 #endif
       memcpy (curr_prefix, curr_installdir, curr_prefix_len);
       curr_prefix[curr_prefix_len] = '\0';
 
+      free (curr_installdir);
+
       return curr_prefix;
     }
   }
@@ -400,7 +409,9 @@
 #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)
 {
@@ -420,15 +431,19 @@
 	 orig_prefix.  */
       const char *orig_installprefix = INSTALLPREFIX;
       const char *orig_installdir = INSTALLDIR;
-      const char *curr_prefix_better;
+      char *curr_prefix_better;
 
       curr_prefix_better =
 	compute_curr_prefix (orig_installprefix, orig_installdir,
 			     get_shared_library_fullname ());
-      if (curr_prefix_better == NULL)
-	curr_prefix_better = curr_prefix;
 
-      set_relocation_prefix (orig_installprefix, curr_prefix_better);
+      set_relocation_prefix (orig_installprefix,
+			     curr_prefix_better != NULL
+			     ? curr_prefix_better
+			     : curr_prefix);
+
+      if (curr_prefix_better != NULL)
+	free (curr_prefix_better);
 
       initialized = 1;
     }
@@ -442,9 +457,19 @@
       && 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/libcharset/lib/relocatable.h b/libcharset/lib/relocatable.h
index f6d3832..5dfd710 100644
--- a/libcharset/lib/relocatable.h
+++ b/libcharset/lib/relocatable.h
@@ -1,5 +1,5 @@
 /* Provide relocatable packages.
-   Copyright (C) 2003, 2005 Free Software Foundation, Inc.
+   Copyright (C) 2003, 2005, 2008 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
@@ -49,20 +49,24 @@
 			      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.  */
+/* Memory management: relocate() potentially allocates 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.  Or free the
+   return value if it was different from the argument pathname.  */
 
 /* Convenience function:
    Computes the current installation prefix, based on the original
    installation prefix, the original installation directory of a particular
-   file, and the current pathname of this file.  Returns NULL upon failure.  */
-extern const char * compute_curr_prefix (const char *orig_installprefix,
-					 const char *orig_installdir,
-					 const char *curr_pathname);
+   file, and the current pathname of this file.
+   Returns it, freshly allocated.  Returns NULL upon failure.  */
+extern char * compute_curr_prefix (const char *orig_installprefix,
+				   const char *orig_installdir,
+				   const char *curr_pathname);
 
 #else