diff options
-rw-r--r-- | ChangeLog | 9 | ||||
-rw-r--r-- | iconv/gconv_cache.c | 23 | ||||
-rw-r--r-- | iconv/gconv_db.c | 15 | ||||
-rw-r--r-- | iconv/gconv_dl.c | 8 | ||||
-rw-r--r-- | iconv/gconv_int.h | 5 | ||||
-rw-r--r-- | iconv/iconvconfig.c | 3 | ||||
-rw-r--r-- | linuxthreads/Makefile | 2 |
7 files changed, 45 insertions, 20 deletions
@@ -1,5 +1,14 @@ 2001-07-24 Ulrich Drepper <drepper@redhat.com> + * iconv/gconv_cache.c (find_module): Don't allocate room for the + filename. Use alloca, we don't need it beyond this function. + (__gconv_release_cache): New function. + * iconv/gconv_db.c (__gconv_close_transform): Call + __gconv_release_cache after the steps are handled. + * iconv/gconv_dl.c (__gconv_find_shlib): Allocate file name in the + record as well. + * iconv/gconv_int.h: Add prototype fpr __gconv_release_cache. + * iconv/gconv_cache.c (__gconv_lookup_cache): Catch one more boundary case and reject it. diff --git a/iconv/gconv_cache.c b/iconv/gconv_cache.c index 79e5dde..c664075 100644 --- a/iconv/gconv_cache.c +++ b/iconv/gconv_cache.c @@ -177,13 +177,9 @@ find_module (const char *directory, const char *filename, { size_t dirlen = strlen (directory); size_t fnamelen = strlen (filename) + 1; - char *fullname; + char fullname[dirlen + fnamelen]; int status = __GCONV_NOCONV; - fullname = (char *) malloc (dirlen + fnamelen); - if (fullname == NULL) - return __GCONV_NOMEM; - memcpy (__mempcpy (fullname, directory, dirlen), filename, fnamelen); result->__shlib_handle = __gconv_find_shlib (fullname); @@ -191,7 +187,7 @@ find_module (const char *directory, const char *filename, { status = __GCONV_OK; - result->__modname = fullname; + result->__modname = NULL; result->__fct = result->__shlib_handle->fct; result->__init_fct = result->__shlib_handle->init_fct; result->__end_fct = result->__shlib_handle->end_fct; @@ -201,9 +197,6 @@ find_module (const char *directory, const char *filename, status = DL_CALL_FCT (result->__init_fct, (result)); } - if (__builtin_expect (status, __GCONV_OK) != __GCONV_OK) - free (fullname); - return status; } @@ -409,6 +402,18 @@ __gconv_lookup_cache (const char *toset, const char *fromset, } +/* Free memory allocated for the transformation record. */ +void +internal_function +__gconv_release_cache (struct __gconv_step *steps, size_t nsteps) +{ + if (cache != NULL) + /* The only thing we have to deallocate is the record with the + steps. */ + free (steps); +} + + /* Free all resources if necessary. */ static void __attribute__ ((unused)) free_mem (void) diff --git a/iconv/gconv_db.c b/iconv/gconv_db.c index 92b5209..47861d1 100644 --- a/iconv/gconv_db.c +++ b/iconv/gconv_db.c @@ -713,17 +713,24 @@ internal_function __gconv_close_transform (struct __gconv_step *steps, size_t nsteps) { int result = __GCONV_OK; + size_t cnt; -#ifndef STATIC_GCONV /* Acquire the lock. */ __libc_lock_lock (lock); - while (nsteps-- > 0) - __gconv_release_step (&steps[nsteps]); +#ifndef STATIC_GCONV + cnt = nsteps; + while (cnt-- > 0) + __gconv_release_step (&steps[cnt]); +#endif + + /* If we use the cache we free a bit more since we don't keep any + transformation records around, they are cheap enough to + recreate. */ + __gconv_release_cache (steps, nsteps); /* Release the lock. */ __libc_lock_unlock (lock); -#endif return result; } diff --git a/iconv/gconv_dl.c b/iconv/gconv_dl.c index 2ca75a8..990338f 100644 --- a/iconv/gconv_dl.c +++ b/iconv/gconv_dl.c @@ -1,5 +1,5 @@ /* Handle loading/unloading of shared object for transformation. - Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation, Inc. + Copyright (C) 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. @@ -83,11 +83,13 @@ __gconv_find_shlib (const char *name) if (keyp == NULL) { /* This name was not known before. */ - found = malloc (sizeof (struct __gconv_loaded_object)); + size_t namelen = strlen (name) + 1; + + found = malloc (sizeof (struct __gconv_loaded_object) + namelen); if (found != NULL) { /* Point the tree node at this new structure. */ - found->name = name; + found->name = (char *) memcpy (found + 1, name, namelen); found->counter = -TRIES_BEFORE_UNLOAD - 1; found->handle = NULL; diff --git a/iconv/gconv_int.h b/iconv/gconv_int.h index c517bd9..13698d8 100644 --- a/iconv/gconv_int.h +++ b/iconv/gconv_int.h @@ -210,6 +210,11 @@ extern int __gconv_close_transform (struct __gconv_step *steps, size_t nsteps) internal_function; +/* Free all resources allocated for the transformation record when + using the cache. */ +extern void __gconv_release_cache (struct __gconv_step *steps, size_t nsteps) + internal_function; + /* Load shared object named by NAME. If already loaded increment reference count. */ extern struct __gconv_loaded_object *__gconv_find_shlib (const char *name) diff --git a/iconv/iconvconfig.c b/iconv/iconvconfig.c index d7a514c..e0811d4 100644 --- a/iconv/iconvconfig.c +++ b/iconv/iconvconfig.c @@ -714,8 +714,6 @@ add_builtins (void) /* add the builtin transformations. */ for (cnt = 0; cnt < nbuiltin_trans; ++cnt) - { - printf("%s: %s -> %s\n", builtin_trans[cnt].module,builtin_trans[cnt].from,builtin_trans[cnt].to); new_module (builtin_trans[cnt].from, strlen (builtin_trans[cnt].from) + 1, builtin_trans[cnt].to, @@ -723,7 +721,6 @@ add_builtins (void) "", builtin_trans[cnt].module, strlen (builtin_trans[cnt].module) + 1, builtin_trans[cnt].cost, 0); - } } diff --git a/linuxthreads/Makefile b/linuxthreads/Makefile index 7869005..b57abd1 100644 --- a/linuxthreads/Makefile +++ b/linuxthreads/Makefile @@ -60,7 +60,7 @@ endif librt-tests = ex10 ex11 tests = ex1 ex2 ex3 ex4 ex5 ex6 ex7 ex8 ex9 $(librt-tests) ex12 ex13 joinrace \ tststack $(tests-nodelete-$(have-z-nodelete)) ecmutex ex14 ex15 ex16 \ - ex17 tst-cancel + ex17 tst-cancel tst-context ifeq (yes,$(build-shared)) tests-nodelete-yes = unload |