aboutsummaryrefslogtreecommitdiff
path: root/iconv
diff options
context:
space:
mode:
Diffstat (limited to 'iconv')
-rw-r--r--iconv/gconv.h2
-rw-r--r--iconv/gconv_close.c3
-rw-r--r--iconv/gconv_conf.c11
-rw-r--r--iconv/gconv_db.c9
-rw-r--r--iconv/gconv_open.c72
5 files changed, 45 insertions, 52 deletions
diff --git a/iconv/gconv.h b/iconv/gconv.h
index 6576b06..4b71ccf 100644
--- a/iconv/gconv.h
+++ b/iconv/gconv.h
@@ -123,7 +123,7 @@ typedef struct gconv_info
{
size_t nsteps;
struct gconv_step *steps;
- struct gconv_step_data *data;
+ struct gconv_step_data data[0];
} *gconv_t;
#endif /* gconv.h */
diff --git a/iconv/gconv_close.c b/iconv/gconv_close.c
index de0937d..2fe8424 100644
--- a/iconv/gconv_close.c
+++ b/iconv/gconv_close.c
@@ -1,5 +1,5 @@
/* Release any resource associated with given conversion descriptor.
- Copyright (C) 1997, 1998 Free Software Foundation, Inc.
+ Copyright (C) 1997, 1998, 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
@@ -44,7 +44,6 @@ __gconv_close (gconv_t cd)
while (!(drunp++)->is_last);
/* Free the data allocated for the descriptor. */
- free (cd->data);
free (cd);
/* Close the participating modules. */
diff --git a/iconv/gconv_conf.c b/iconv/gconv_conf.c
index a0aae43..dce913d 100644
--- a/iconv/gconv_conf.c
+++ b/iconv/gconv_conf.c
@@ -67,8 +67,7 @@ static struct gconv_module builtin_modules[] =
#undef BUILTIN_TRANSFORMATION
#undef BUILTIN_ALIAS
-static const char *
-builtin_aliases[] =
+static const char *builtin_aliases[] =
{
#define BUILTIN_TRANSFORMATION(From, ConstPfx, ConstLen, To, Cost, Name, \
Fct, Init, End, MinF, MaxF, MinT, MaxT)
@@ -201,14 +200,16 @@ add_alias (char *rp, void *modules)
malloc (sizeof (struct gconv_alias) + (wp - from));
if (new_alias != NULL)
{
+ void **inserted;
+
new_alias->fromname = memcpy ((char *) new_alias
+ sizeof (struct gconv_alias),
from, wp - from);
new_alias->toname = new_alias->fromname + (to - from);
- if (__tfind (new_alias, &__gconv_alias_db, __gconv_alias_compare) != NULL
- || (__tsearch (new_alias, &__gconv_alias_db, __gconv_alias_compare)
- == NULL))
+ inserted = (void **) __tsearch (new_alias, &__gconv_alias_db,
+ __gconv_alias_compare);
+ if (inserted == NULL || *inserted != (void **) new_alias)
/* Something went wrong, free this entry. */
free (new_alias);
}
diff --git a/iconv/gconv_db.c b/iconv/gconv_db.c
index fdc3064..4abc1ae 100644
--- a/iconv/gconv_db.c
+++ b/iconv/gconv_db.c
@@ -139,14 +139,17 @@ add_derivation (const char *fromset, const char *toset,
malloc (sizeof (struct known_derivation) + fromset_len + toset_len);
if (new_deriv != NULL)
{
- new_deriv->from = memcpy (new_deriv + 1, fromset, fromset_len);
- new_deriv->to = memcpy ((char *) new_deriv->from + fromset_len,
+ new_deriv->from = (char *) (new_deriv + 1);
+ new_deriv->to = memcpy (__mempcpy (new_deriv + 1, fromset, fromset_len),
toset, toset_len);
new_deriv->steps = handle;
new_deriv->nsteps = nsteps;
- __tsearch (new_deriv, &known_derivations, derivation_compare);
+ if (__tsearch (new_deriv, &known_derivations, derivation_compare)
+ == NULL)
+ /* There is some kind of memory allocation problem. */
+ free (new_deriv);
}
/* Please note that we don't complain if the allocation failed. This
is not tragically but in case we use the memory debugging facilities
diff --git a/iconv/gconv_open.c b/iconv/gconv_open.c
index fb5f88b..f3b6dfa 100644
--- a/iconv/gconv_open.c
+++ b/iconv/gconv_open.c
@@ -1,5 +1,5 @@
/* Find matching transformation algorithms and initialize steps.
- Copyright (C) 1997, 1998 Free Software Foundation, Inc.
+ Copyright (C) 1997, 1998, 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
@@ -38,7 +38,8 @@ __gconv_open (const char *toset, const char *fromset, gconv_t *handle)
if (res == GCONV_OK)
{
/* Allocate room for handle. */
- result = (gconv_t) malloc (sizeof (struct gconv_info));
+ result = (gconv_t) malloc (sizeof (struct gconv_info)
+ + nsteps * sizeof (struct gconv_step_data));
if (result == NULL)
res = GCONV_NOMEM;
else
@@ -47,47 +48,41 @@ __gconv_open (const char *toset, const char *fromset, gconv_t *handle)
result->steps = steps;
result->nsteps = nsteps;
- /* Allocate array for the step data. */
- result->data = (struct gconv_step_data *)
- calloc (nsteps, sizeof (struct gconv_step_data));
+ /* Clear the array for the step data. */
+ memset (result->data, '\0',
+ nsteps * sizeof (struct gconv_step_data));
- if (result->data == NULL)
- res = GCONV_NOMEM;
- else
+ /* Call all initialization functions for the transformation
+ step implemenations. */
+ for (cnt = 0; cnt < nsteps; ++cnt)
{
- /* Call all initialization functions for the transformation
- step implemenations. */
- struct gconv_step_data *data = result->data;
+ /* If this is the last step we must not allocate an
+ output buffer. */
+ result->data[cnt].is_last = cnt == nsteps - 1;
- for (cnt = 0; cnt < nsteps; ++cnt)
- {
- /* If this is the last step we must not allocate an output
- buffer. */
- data[cnt].is_last = cnt == nsteps - 1;
+ /* Reset the counter. */
+ result->data[cnt].invocation_counter = 0;
- /* Reset the counter. */
- data[cnt].invocation_counter = 0;
+ /* It's a regular use. */
+ result->data[cnt].internal_use = 0;
- /* It's a regular use. */
- data[cnt].internal_use = 0;
+ /* We use the `mbstate_t' member in DATA. */
+ result->data[cnt].statep = &result->data[cnt].__state;
- /* We use the `mbstate_t' member in DATA. */
- data[cnt].statep = &data[cnt].__state;
+ /* Allocate the buffer. */
+ if (!result->data[cnt].is_last)
+ {
+ size_t size = (GCONV_NCHAR_GOAL
+ * steps[cnt].max_needed_to);
- /* Allocate the buffer. */
- if (!data[cnt].is_last)
+ result->data[cnt].outbuf = (char *) malloc (size);
+ if (result->data[cnt].outbuf == NULL)
{
- size_t size = (GCONV_NCHAR_GOAL
- * steps[cnt].max_needed_to);
-
- data[cnt].outbuf = (char *) malloc (size);
- if (data[cnt].outbuf == NULL)
- {
- res = GCONV_NOMEM;
- break;
- }
- data[cnt].outbufend = data[cnt].outbuf + size;
+ res = GCONV_NOMEM;
+ break;
}
+ result->data[cnt].outbufend = (result->data[cnt].outbuf
+ + size);
}
}
}
@@ -100,13 +95,8 @@ __gconv_open (const char *toset, const char *fromset, gconv_t *handle)
if (result != NULL)
{
- if (result->data != NULL)
- {
- while (cnt-- > 0)
- free (result->data[cnt].outbuf);
-
- free (result->data);
- }
+ while (cnt-- > 0)
+ free (result->data[cnt].outbuf);
free (result);
result = NULL;