Skip to content

Commit

Permalink
* iconv/gconv.c: Demangle pointers before use if necessary.
Browse files Browse the repository at this point in the history
	* iconv/gconv_cache.c: Likewise.
	* iconv/skeleton.c: Likewise.
	* libio/iofwide.c: Likewise.
	* wcsmbs/btowc.c: Likewise.
	* wcsmbs/mbrtowc.c: Likewise.
	* wcsmbs/mbsnrtowcs.c: Likewise.
	* wcsmbs/mbsrtowcs_l.c: Likewise.
	* wcsmbs/wcrtomb.c: Likewise.
	* wcsmbs/wcsnrtombs.c: Likewise.
	* wcsmbs/wcsrtombs.c: Likewise.
	* wcsmbs/wctob.c: Likewise.
	* iconv_gconv_db.c: Likewise.  After init functions returns mangle
	btowc pointer if necessary.
	* iconv/gconv_dl.c: Mangle function pointers retrieved from dlsym.
  • Loading branch information
Ulrich Drepper committed Dec 19, 2005
1 parent 477aa86 commit 915a6c5
Show file tree
Hide file tree
Showing 14 changed files with 228 additions and 77 deletions.
16 changes: 16 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,5 +1,21 @@
2005-12-18 Ulrich Drepper <drepper@redhat.com>

* iconv/gconv.c: Demangle pointers before use if necessary.
* iconv/gconv_cache.c: Likewise.
* iconv/skeleton.c: Likewise.
* libio/iofwide.c: Likewise.
* wcsmbs/btowc.c: Likewise.
* wcsmbs/mbrtowc.c: Likewise.
* wcsmbs/mbsnrtowcs.c: Likewise.
* wcsmbs/mbsrtowcs_l.c: Likewise.
* wcsmbs/wcrtomb.c: Likewise.
* wcsmbs/wcsnrtombs.c: Likewise.
* wcsmbs/wcsrtombs.c: Likewise.
* wcsmbs/wctob.c: Likewise.
* iconv_gconv_db.c: Likewise. After init functions returns mangle
btowc pointer if necessary.
* iconv/gconv_dl.c: Mangle function pointers retrieved from dlsym.

* iconv/gconv_builtin.c (builtin_map): Change type of size
information fields to int8_t.

Expand Down
19 changes: 14 additions & 5 deletions iconv/gconv.c
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/* Convert characters in input buffer using conversion descriptor to
output buffer.
Copyright (C) 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
Copyright (C) 1997-2001, 2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
Expand All @@ -20,10 +20,13 @@
02111-1307 USA. */

#include <assert.h>
#include <gconv_int.h>
#include <sys/param.h>
#include <dlfcn.h>
#include <stddef.h>
#include <sys/param.h>

#include <gconv_int.h>
#include <sysdep.h>


int
internal_function
Expand All @@ -45,9 +48,15 @@ __gconv (__gconv_t cd, const unsigned char **inbuf,
cd->__data[last_step].__outbuf = outbuf != NULL ? *outbuf : NULL;
cd->__data[last_step].__outbufend = outbufend;

__gconv_fct fct = cd->__steps->__fct;
#ifdef PTR_DEMANGLE
if (cd->__steps->__shlib_handle != NULL)
PTR_DEMANGLE (fct);
#endif

if (inbuf == NULL || *inbuf == NULL)
/* We just flush. */
result = DL_CALL_FCT (cd->__steps->__fct,
result = DL_CALL_FCT (fct,
(cd->__steps, cd->__data, NULL, NULL, NULL,
irreversible,
cd->__data[last_step].__outbuf == NULL ? 2 : 1, 0));
Expand All @@ -60,7 +69,7 @@ __gconv (__gconv_t cd, const unsigned char **inbuf,
do
{
last_start = *inbuf;
result = DL_CALL_FCT (cd->__steps->__fct,
result = DL_CALL_FCT (fct,
(cd->__steps, cd->__data, inbuf, inbufend,
NULL, irreversible, 0, 0));
}
Expand Down
71 changes: 55 additions & 16 deletions iconv/gconv_db.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/* Provide access to the collection of available transformation modules.
Copyright (C) 1997-2003, 2004 Free Software Foundation, Inc.
Copyright (C) 1997-2003, 2004, 2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
Expand All @@ -18,6 +18,7 @@
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */

#include <assert.h>
#include <limits.h>
#include <search.h>
#include <stdlib.h>
Expand All @@ -28,6 +29,7 @@

#include <dlfcn.h>
#include <gconv_int.h>
#include <sysdep.h>


/* Simple data structure for alias mapping. We have two names, `from'
Expand Down Expand Up @@ -180,7 +182,15 @@ free_derivation (void *p)
for (cnt = 0; cnt < deriv->nsteps; ++cnt)
if (deriv->steps[cnt].__counter > 0
&& deriv->steps[cnt].__end_fct != NULL)
DL_CALL_FCT (deriv->steps[cnt].__end_fct, (&deriv->steps[cnt]));
{
assert (deriv->steps[cnt].__shlib_handle != NULL);

__gconv_end_fct end_fct = deriv->steps[cnt].__end_fct;
#ifdef PTR_DEMANGLE
PTR_DEMANGLE (end_fct);
#endif
DL_CALL_FCT (end_fct, (&deriv->steps[cnt]));
}

/* Free the name strings. */
free ((char *) deriv->steps[0].__from_name);
Expand All @@ -196,22 +206,30 @@ void
internal_function
__gconv_release_step (struct __gconv_step *step)
{
if (--step->__counter == 0)
/* Skip builtin modules; they are not reference counted. */
if (step->__shlib_handle != NULL && --step->__counter == 0)
{
/* Call the destructor. */
if (step->__end_fct != NULL)
DL_CALL_FCT (step->__end_fct, (step));

#ifndef STATIC_GCONV
/* Skip builtin modules; they are not reference counted. */
if (step->__shlib_handle != NULL)
{
/* Release the loaded module. */
__gconv_release_shlib (step->__shlib_handle);
step->__shlib_handle = NULL;
assert (step->__shlib_handle != NULL);

__gconv_end_fct end_fct = step->__end_fct;
#ifdef PTR_DEMANGLE
PTR_DEMANGLE (end_fct);
#endif
DL_CALL_FCT (end_fct, (step));
}

#ifndef STATIC_GCONV
/* Release the loaded module. */
__gconv_release_shlib (step->__shlib_handle);
step->__shlib_handle = NULL;
#endif
}
else
/* Builtin modules should not have end functions. */
assert (step->__end_fct == NULL);
}

static int
Expand Down Expand Up @@ -272,10 +290,15 @@ gen_steps (struct derivation_step *best, const char *toset,
result[step_cnt].__btowc_fct = NULL;

/* Call the init function. */
if (result[step_cnt].__init_fct != NULL)
__gconv_init_fct init_fct = result[step_cnt].__init_fct;
if (init_fct != NULL)
{
status = DL_CALL_FCT (result[step_cnt].__init_fct,
(&result[step_cnt]));
assert (result[step_cnt].__shlib_handle != NULL);

# ifdef PTR_DEMANGLE
PTR_DEMANGLE (init_fct);
# endif
status = DL_CALL_FCT (init_fct, (&result[step_cnt]));

if (__builtin_expect (status, __GCONV_OK) != __GCONV_OK)
{
Expand All @@ -285,6 +308,11 @@ gen_steps (struct derivation_step *best, const char *toset,
result[step_cnt].__end_fct = NULL;
break;
}

# ifdef PTR_MANGLE
if (result[step_cnt].__btowc_fct != NULL)
PTR_MANGLE (result[step_cnt].__btowc_fct);
# endif
}
}
else
Expand Down Expand Up @@ -362,8 +390,19 @@ increment_counter (struct __gconv_step *steps, size_t nsteps)
}

/* Call the init function. */
if (step->__init_fct != NULL)
DL_CALL_FCT (step->__init_fct, (step));
__gconv_init_fct init_fct = step->__init_fct;
if (init_fct != NULL)
{
#ifdef PTR_DEMANGLE
PTR_DEMANGLE (init_fct);
#endif
DL_CALL_FCT (init_fct, (step));

#ifdef PTR_MANGLE
if (step->__btowc_fct != NULL)
PTR_MANGLE (step->__btowc_fct);
#endif
}
}
}
return result;
Expand Down
11 changes: 10 additions & 1 deletion iconv/gconv_dl.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/* Handle loading/unloading of shared object for transformation.
Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2004
Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2004, 2005
Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
Expand Down Expand Up @@ -29,6 +29,7 @@
#include <sys/param.h>

#include <gconv_int.h>
#include <sysdep.h>


#ifdef DEBUG
Expand Down Expand Up @@ -130,6 +131,14 @@ __gconv_find_shlib (const char *name)
found->init_fct = __libc_dlsym (found->handle, "gconv_init");
found->end_fct = __libc_dlsym (found->handle, "gconv_end");

#ifdef PTR_MANGLE
PTR_MANGLE (found->fct);
if (found->init_fct != NULL)
PTR_MANGLE (found->init_fct);
if (found->end_fct != NULL)
PTR_MANGLE (found->end_fct);
#endif

/* We have succeeded in loading the shared object. */
found->counter = 1;
}
Expand Down
13 changes: 11 additions & 2 deletions iconv/skeleton.c
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,8 @@
# include <dlfcn.h>
#endif

#include <sysdep.h>

#ifndef DL_CALL_FCT
# define DL_CALL_FCT(fct, args) fct args
#endif
Expand Down Expand Up @@ -393,10 +395,17 @@ FUNCTION_NAME (struct __gconv_step *step, struct __gconv_step_data *data,
{
struct __gconv_step *next_step = step + 1;
struct __gconv_step_data *next_data = data + 1;
__gconv_fct fct;
__gconv_fct fct = NULL;
int status;

fct = (data->__flags & __GCONV_IS_LAST) ? NULL : next_step->__fct;
if ((data->__flags & __GCONV_IS_LAST) == 0)
{
fct = next_step->__fct;
#ifdef PTR_DEMANGLE
if (next_step->__shlib_handle != NULL)
PTR_DEMANGLE (fct);
#endif
}

/* If the function is called with no input this means we have to reset
to the initial state. The possibly partly converted input is
Expand Down
39 changes: 32 additions & 7 deletions libio/iofwide.c
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
# include <wcsmbs/wcsmbsload.h>
# include <iconv/gconv_int.h>
# include <shlib-compat.h>
# include <sysdep.h>
#endif


Expand Down Expand Up @@ -126,12 +127,11 @@ _IO_fwide (fp, mode)
selected locale for LC_CTYPE. */
#ifdef _LIBC
{
struct gconv_fcts fcts;

/* Clear the state. We start all over again. */
memset (&fp->_wide_data->_IO_state, '\0', sizeof (__mbstate_t));
memset (&fp->_wide_data->_IO_last_state, '\0', sizeof (__mbstate_t));

struct gconv_fcts fcts;
__wcsmbs_clone_conv (&fcts);
assert (fcts.towc_nsteps == 1);
assert (fcts.tomb_nsteps == 1);
Expand Down Expand Up @@ -159,7 +159,8 @@ _IO_fwide (fp, mode)
cc->__cd_out.__cd.__data[0].__statep = &fp->_wide_data->_IO_state;

/* And now the transliteration. */
cc->__cd_out.__cd.__data[0].__trans = &__libio_translit;
cc->__cd_out.__cd.__data[0].__trans
= (struct __gconv_trans_data *) &__libio_translit;
}
#else
# ifdef _GLIBCPP_USE_WCHAR_T
Expand Down Expand Up @@ -232,7 +233,13 @@ do_out (struct _IO_codecvt *codecvt, __mbstate_t *statep,
codecvt->__cd_out.__cd.__data[0].__outbufend = (unsigned char *) to_end;
codecvt->__cd_out.__cd.__data[0].__statep = statep;

status = DL_CALL_FCT (gs->__fct,
__gconv_fct fct = gs->__fct;
#ifdef PTR_DEMANGLE
if (gs->__shlib_handle != NULL)
PTR_DEMANGLE (fct);
#endif

status = DL_CALL_FCT (fct,
(gs, codecvt->__cd_out.__cd.__data, &from_start_copy,
(const unsigned char *) from_end, NULL,
&dummy, 0, 0));
Expand Down Expand Up @@ -298,7 +305,13 @@ do_unshift (struct _IO_codecvt *codecvt, __mbstate_t *statep,
codecvt->__cd_out.__cd.__data[0].__outbufend = (unsigned char *) to_end;
codecvt->__cd_out.__cd.__data[0].__statep = statep;

status = DL_CALL_FCT (gs->__fct,
__gconv_fct fct = gs->__fct;
#ifdef PTR_DEMANGLE
if (gs->__shlib_handle != NULL)
PTR_DEMANGLE (fct);
#endif

status = DL_CALL_FCT (fct,
(gs, codecvt->__cd_out.__cd.__data, NULL, NULL,
NULL, &dummy, 1, 0));

Expand Down Expand Up @@ -361,7 +374,13 @@ do_in (struct _IO_codecvt *codecvt, __mbstate_t *statep,
codecvt->__cd_in.__cd.__data[0].__outbufend = (unsigned char *) to_end;
codecvt->__cd_in.__cd.__data[0].__statep = statep;

status = DL_CALL_FCT (gs->__fct,
__gconv_fct fct = gs->__fct;
#ifdef PTR_DEMANGLE
if (gs->__shlib_handle != NULL)
PTR_DEMANGLE (fct);
#endif

status = DL_CALL_FCT (fct,
(gs, codecvt->__cd_in.__cd.__data, &from_start_copy,
(const unsigned char *) from_end, NULL,
&dummy, 0, 0));
Expand Down Expand Up @@ -459,7 +478,13 @@ do_length (struct _IO_codecvt *codecvt, __mbstate_t *statep,
codecvt->__cd_in.__cd.__data[0].__outbufend = (unsigned char *) &to_buf[max];
codecvt->__cd_in.__cd.__data[0].__statep = statep;

status = DL_CALL_FCT (gs->__fct,
__gconv_fct fct = gs->__fct;
#ifdef PTR_DEMANGLE
if (gs->__shlib_handle != NULL)
PTR_DEMANGLE (fct);
#endif

status = DL_CALL_FCT (fct,
(gs, codecvt->__cd_in.__cd.__data, &cp,
(const unsigned char *) from_end, NULL,
&dummy, 0, 0));
Expand Down
Loading

0 comments on commit 915a6c5

Please sign in to comment.