From 1146b210ba48607a5a29ea516a5cda3d5afa6542 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Tue, 8 Jan 2008 00:28:30 +0100 Subject: [PATCH] Improve memory cleanup in 'relocatable' module. --- ChangeLog | 11 +++++++++++ lib/progreloc.c | 12 ++++++++---- lib/relocatable.c | 35 ++++++++++++++++++++++++----------- lib/relocatable.h | 11 ++++++----- 4 files changed, 49 insertions(+), 20 deletions(-) diff --git a/ChangeLog b/ChangeLog index ca56feee8..3215e80e1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2008-01-01 Sylvain Beucler + Bruno Haible + + Improve memory cleanup in 'relocatable' module. + * lib/relocatable.h (compute_curr_prefix): Change return type to + 'char *'. + * lib/relocatable.c (compute_curr_prefix): Change return type to + 'char *'. Free curr_installdir after use. + (relocate): Free curr_prefix_better after use. + * lib/progreloc.c (prepare_relocate): Free curr_prefix after use. + 2008-01-01 Bruno Haible * tests/test-wcwidth.c (main): Relax test of U+2060. Avoids a test diff --git a/lib/progreloc.c b/lib/progreloc.c index ac9433bf6..0eaad3855 100644 --- a/lib/progreloc.c +++ b/lib/progreloc.c @@ -1,5 +1,5 @@ /* Provide relocatable programs. - Copyright (C) 2003-2007 Free Software Foundation, Inc. + Copyright (C) 2003-2008 Free Software Foundation, Inc. Written by Bruno Haible , 2003. This program is free software: you can redistribute it and/or modify @@ -281,7 +281,7 @@ static void prepare_relocate (const char *orig_installprefix, const char *orig_installdir, const char *argv0) { - const char *curr_prefix; + char *curr_prefix; /* Determine the full pathname of the current executable. */ executable_fullname = find_executable (argv0); @@ -290,8 +290,12 @@ prepare_relocate (const char *orig_installprefix, const char *orig_installdir, curr_prefix = compute_curr_prefix (orig_installprefix, orig_installdir, executable_fullname); if (curr_prefix != NULL) - /* Now pass this prefix to all copies of the relocate.c source file. */ - set_relocation_prefix (orig_installprefix, curr_prefix); + { + /* Now pass this prefix to all copies of the relocate.c source file. */ + set_relocation_prefix (orig_installprefix, curr_prefix); + + free (curr_prefix); + } } /* Set program_name, based on argv[0], and original installation prefix and diff --git a/lib/relocatable.c b/lib/relocatable.c index 5e1dde6c8..e814a0e4e 100644 --- a/lib/relocatable.c +++ b/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 , 2003. This program is free software; you can redistribute it and/or modify it @@ -160,17 +160,18 @@ set_relocation_prefix (const char *orig_prefix_arg, const char *curr_prefix_arg) /* 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 @@ compute_curr_prefix (const char *orig_installprefix, } 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 @@ compute_curr_prefix (const char *orig_installprefix, 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; } } @@ -420,15 +429,19 @@ relocate (const char *pathname) 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; } diff --git a/lib/relocatable.h b/lib/relocatable.h index f6d38321a..5970be7a2 100644 --- a/lib/relocatable.h +++ b/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 , 2003. This program is free software; you can redistribute it and/or modify it @@ -59,10 +59,11 @@ extern const char * relocate (const char *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 -- 2.11.0