diff options
Diffstat (limited to 'iconv')
-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 |
5 files changed, 35 insertions, 19 deletions
diff --git a/iconv/gconv_cache.c b/iconv/gconv_cache.c index 79e5dde629..c6640759ec 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 92b520987b..47861d19ca 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 2ca75a81ca..990338f070 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 c517bd9e97..13698d8ac4 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 d7a514cf88..e0811d422a 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); - } } |