Skip to content

Commit

Permalink
Update.
Browse files Browse the repository at this point in the history
2001-05-20  Bruno Haible  <haible@clisp.cons.org>

	* iconvdata/cp1255.c: Completely rewritten.
	* iconvdata/Makefile (gen-8bit-gap-modules): Remove cp1255.
	* iconvdata/testdata/WINDOWS-1255: New file.
	* iconvdata/testdata/WINDOWS-1255..UTF8: New file.
	* iconvdata/TESTS: Add WINDOWS-1255 test.
	* iconvdata/CP1255.irreversible: New file.

2001-05-20  Bruno Haible  <haible@clisp.cons.org>

	* iconvdata/cp1258.c: Completely rewritten.
	* iconvdata/Makefile (gen-8bit-gap-modules): Remove cp1258.
	* iconvdata/testdata/WINDOWS-1258: New file.
	* iconvdata/testdata/WINDOWS-1258..UTF8: New file.
	* iconvdata/TESTS: Add WINDOWS-1258 test.
	* iconvdata/tst-table-from.c (try): Reset the iconv descriptor before
	the main call, and flush it afterwards.
	(utf8_decode): Return a string, possibly containing several Unicode
	characters.
	(main): Update all utf8_decode calls.
	* iconvdata/CP1258.irreversible: New file.

2001-05-20  Bruno Haible  <haible@clisp.cons.org>

	* iconv/gconv.c (__gconv): For flush without output, pass do_flush = 2.
	* iconv/skeleton.c: Distinguish do_flush = 1 and do_flush = 2. In the
	first case, set outbuf, outstart, outend, and call PREPARE_LOOP before
	EMIT_SHIFT_TO_INIT; then pass the output produced by this step down to
	the next step. In the second case, clear the state without calling
	EMIT_SHIFT_TO_INIT.
	* iconvdata/ibm930.c (EMIT_SHIFT_TO_INIT): Use outbuf instead of
	data->__outbuf, and outend instead of data->__outbufend.
	* iconvdata/ibm933.c (EMIT_SHIFT_TO_INIT): Likewise.
	* iconvdata/ibm935.c (EMIT_SHIFT_TO_INIT): Likewise.
	* iconvdata/ibm937.c (EMIT_SHIFT_TO_INIT): Likewise.
	* iconvdata/ibm939.c (EMIT_SHIFT_TO_INIT): Likewise.
	* iconvdata/iso-2022-cn.c (EMIT_SHIFT_TO_INIT): Likewise.
	* iconvdata/iso-2022-cn-ext.c (EMIT_SHIFT_TO_INIT): Likewise.
	* iconvdata/iso-2022-jp.c (EMIT_SHIFT_TO_INIT): Likewise.
	* iconvdata/iso-2022-kr.c (EMIT_SHIFT_TO_INIT): Likewise.
	* iconvdata/utf-7.c (EMIT_SHIFT_TO_INIT): Likewise.

2001-05-21  Jakub Jelinek  <jakub@redhat.com>

	* elf/rtld.c (dl_main): Compute l_map_end for the main program.
	* elf/dl-sym.c (_dl_sym): Don't check for l_addr == 0.
	If match == _dl_loaded, caller can still come from the main program.
	(_dl_vsym): Likewise.
	* elf/dl-open.c (dl_open_worker): Don't check for l_addr == 0.
	* elf/dl-error.c (_dl_signal_error): Change NULL objname into "".
	* elf/restest2.c: New test.
	* elf/Makefile (tests): Add restest2.
	(restest2, LDFLAGS-restest2): Add rules.
  • Loading branch information
Ulrich Drepper committed May 22, 2001
1 parent 25e57b1 commit 2373b30
Show file tree
Hide file tree
Showing 30 changed files with 1,915 additions and 108 deletions.
55 changes: 55 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,58 @@
2001-05-20 Bruno Haible <haible@clisp.cons.org>

* iconvdata/cp1255.c: Completely rewritten.
* iconvdata/Makefile (gen-8bit-gap-modules): Remove cp1255.
* iconvdata/testdata/WINDOWS-1255: New file.
* iconvdata/testdata/WINDOWS-1255..UTF8: New file.
* iconvdata/TESTS: Add WINDOWS-1255 test.
* iconvdata/CP1255.irreversible: New file.

2001-05-20 Bruno Haible <haible@clisp.cons.org>

* iconvdata/cp1258.c: Completely rewritten.
* iconvdata/Makefile (gen-8bit-gap-modules): Remove cp1258.
* iconvdata/testdata/WINDOWS-1258: New file.
* iconvdata/testdata/WINDOWS-1258..UTF8: New file.
* iconvdata/TESTS: Add WINDOWS-1258 test.
* iconvdata/tst-table-from.c (try): Reset the iconv descriptor before
the main call, and flush it afterwards.
(utf8_decode): Return a string, possibly containing several Unicode
characters.
(main): Update all utf8_decode calls.
* iconvdata/CP1258.irreversible: New file.

2001-05-20 Bruno Haible <haible@clisp.cons.org>

* iconv/gconv.c (__gconv): For flush without output, pass do_flush = 2.
* iconv/skeleton.c: Distinguish do_flush = 1 and do_flush = 2. In the
first case, set outbuf, outstart, outend, and call PREPARE_LOOP before
EMIT_SHIFT_TO_INIT; then pass the output produced by this step down to
the next step. In the second case, clear the state without calling
EMIT_SHIFT_TO_INIT.
* iconvdata/ibm930.c (EMIT_SHIFT_TO_INIT): Use outbuf instead of
data->__outbuf, and outend instead of data->__outbufend.
* iconvdata/ibm933.c (EMIT_SHIFT_TO_INIT): Likewise.
* iconvdata/ibm935.c (EMIT_SHIFT_TO_INIT): Likewise.
* iconvdata/ibm937.c (EMIT_SHIFT_TO_INIT): Likewise.
* iconvdata/ibm939.c (EMIT_SHIFT_TO_INIT): Likewise.
* iconvdata/iso-2022-cn.c (EMIT_SHIFT_TO_INIT): Likewise.
* iconvdata/iso-2022-cn-ext.c (EMIT_SHIFT_TO_INIT): Likewise.
* iconvdata/iso-2022-jp.c (EMIT_SHIFT_TO_INIT): Likewise.
* iconvdata/iso-2022-kr.c (EMIT_SHIFT_TO_INIT): Likewise.
* iconvdata/utf-7.c (EMIT_SHIFT_TO_INIT): Likewise.

2001-05-21 Jakub Jelinek <jakub@redhat.com>

* elf/rtld.c (dl_main): Compute l_map_end for the main program.
* elf/dl-sym.c (_dl_sym): Don't check for l_addr == 0.
If match == _dl_loaded, caller can still come from the main program.
(_dl_vsym): Likewise.
* elf/dl-open.c (dl_open_worker): Don't check for l_addr == 0.
* elf/dl-error.c (_dl_signal_error): Change NULL objname into "".
* elf/restest2.c: New test.
* elf/Makefile (tests): Add restest2.
(restest2, LDFLAGS-restest2): Add rules.

2001-05-22 Ulrich Drepper <drepper@redhat.com>

* intl/Makefile: Add a few more dependencies to avoid races in the
Expand Down
6 changes: 5 additions & 1 deletion elf/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,8 @@ tests = loadtest restest1 preloadtest loadfail multiload origtest resolvfail \
constload1 order $(tests-vis-$(have-protected)) noload filter unload \
reldep reldep2 reldep3 next $(tests-nodelete-$(have-z-nodelete)) \
$(tests-nodlopen-$(have-z-nodlopen)) neededtest neededtest2 \
neededtest3 neededtest4 unload2 lateglobal initfirst global
neededtest3 neededtest4 unload2 lateglobal initfirst global \
restest2
test-srcs = tst-pathopt
tests-vis-yes = vismain
tests-nodelete-yes = nodelete
Expand Down Expand Up @@ -303,6 +304,9 @@ $(objpfx)neededtest4.out: $(objpfx)neededobj5.so $(objpfx)neededobj6.so
$(objpfx)restest1: $(objpfx)testobj1.so $(objpfx)testobj1_1.so $(libdl)
LDFLAGS-restest1 = -rdynamic

$(objpfx)restest2: $(libdl)
LDFLAGS-restest2 = -rdynamic

$(objpfx)restest1.out: $(test-modules)

preloadtest-preloads = testobj1 testobj2 testobj3 testobj4 testobj5
Expand Down
4 changes: 3 additions & 1 deletion elf/dl-error.c
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,8 @@ _dl_signal_error (int errcode, const char *objname, const char *errstring)
errstring = N_("DYNAMIC LINKER BUG!!!");

lcatch = tsd_getspecific ();
if (objname == NULL)
objname = "";
if (lcatch != NULL)
{
/* We are inside _dl_catch_error. Return to it. We have to
Expand Down Expand Up @@ -100,7 +102,7 @@ _dl_signal_error (int errcode, const char *objname, const char *errstring)
_dl_fatal_printf ("\
%s: error while loading shared libraries: %s%s%s%s%s\n",
_dl_argv[0] ?: "<program name unknown>",
objname ?: "", objname && *objname ? ": " : "",
objname, *objname ? ": " : "",
errstring, errcode ? ": " : "",
(errcode
? __strerror_r (errcode, buffer, sizeof buffer)
Expand Down
7 changes: 2 additions & 5 deletions elf/dl-open.c
Original file line number Diff line number Diff line change
Expand Up @@ -188,13 +188,10 @@ dl_open_worker (void *a)
_dl_signal_error (0, "dlopen",
N_("DST not allowed in SUID/SGID programs"));

/* We have to find out from which object the caller is calling.
Find the highest-addressed object that ADDRESS is not below. */
/* We have to find out from which object the caller is calling. */
call_map = NULL;
for (l = _dl_loaded; l; l = l->l_next)
if (l->l_addr != 0 /* Make sure we do not currently set this map up
in this moment. */
&& caller >= (const void *) l->l_map_start
if (caller >= (const void *) l->l_map_start
&& caller < (const void *) l->l_map_end)
{
/* There must be exactly one DSO for the range of the virtual
Expand Down
20 changes: 15 additions & 5 deletions elf/dl-sym.c
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ _dl_sym (void *handle, const char *name, void *who)

/* Find the highest-addressed object that CALLER is not below. */
for (l = _dl_loaded; l != NULL; l = l->l_next)
if (l->l_addr != 0 && caller >= l->l_map_start && caller < l->l_map_end)
if (caller >= l->l_map_start && caller < l->l_map_end)
{
/* There must be exactly one DSO for the range of the virtual
memory. Otherwise something is really broken. */
Expand All @@ -65,8 +65,13 @@ _dl_sym (void *handle, const char *name, void *who)
else
{
if (__builtin_expect (match == _dl_loaded, 0))
_dl_signal_error (0, NULL, N_("\
{
if (! _dl_loaded
|| caller < _dl_loaded->l_map_start
|| caller >= _dl_loaded->l_map_end)
_dl_signal_error (0, NULL, N_("\
RTLD_NEXT used in code not dynamically loaded"));
}

l = match;
while (l->l_loader != NULL)
Expand Down Expand Up @@ -107,7 +112,7 @@ _dl_vsym (void *handle, const char *name, const char *version, void *who)

/* Find the highest-addressed object that CALLER is not below. */
for (l = _dl_loaded; l != NULL; l = l->l_next)
if (l->l_addr != 0 && caller >= l->l_map_start && caller < l->l_map_end)
if (caller >= l->l_map_start && caller < l->l_map_end)
{
/* There must be exactly one DSO for the range of the virtual
memory. Otherwise something is really broken. */
Expand All @@ -121,9 +126,14 @@ _dl_vsym (void *handle, const char *name, const char *version, void *who)
&vers, 0, 0);
else if (handle == RTLD_NEXT)
{
if (match == _dl_loaded)
_dl_signal_error (0, NULL, N_("\
if (__builtin_expect (match == _dl_loaded, 0))
{
if (! _dl_loaded
|| caller < _dl_loaded->l_map_start
|| caller >= _dl_loaded->l_map_end)
_dl_signal_error (0, NULL, N_("\
RTLD_NEXT used in code not dynamically loaded"));
}

l = match;
while (l->l_loader != NULL)
Expand Down
33 changes: 33 additions & 0 deletions elf/restest2.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
#include <sys/types.h>
#include <dlfcn.h>
#include <error.h>
#include <mcheck.h>
#include <stdlib.h>
#include <unistd.h>

pid_t pid, pid2;

pid_t getpid(void)
{
pid_t (*f)(void);
f = (pid_t (*)(void)) dlsym (RTLD_NEXT, "getpid");
if (f == NULL)
error (EXIT_FAILURE, 0, "dlsym (RTLD_NEXT, \"getpid\"): %s", dlerror ());
return (pid2 = f()) + 26;
}

int
main (void)
{
pid_t (*f)(void);

mtrace ();

f = (pid_t (*)(void)) dlsym (RTLD_DEFAULT, "getpid");
if (f == NULL)
error (EXIT_FAILURE, 0, "dlsym (RTLD_DEFAULT, \"getpid\"): %s", dlerror ());
pid = f();
if (pid != pid2 + 26)
error (EXIT_FAILURE, 0, "main getpid() not called");
return 0;
}
14 changes: 11 additions & 3 deletions elf/rtld.c
Original file line number Diff line number Diff line change
Expand Up @@ -542,8 +542,7 @@ of this helper program; chances are you did not intend to run this program.\n\
information for the program. */
}

/* It is not safe to load stuff after the main program. */
_dl_loaded->l_map_end = ~0;
_dl_loaded->l_map_end = 0;
/* Perhaps the executable has no PT_LOAD header entries at all. */
_dl_loaded->l_map_start = ~0;

Expand Down Expand Up @@ -591,15 +590,24 @@ of this helper program; chances are you did not intend to run this program.\n\
has_interp = 1;
break;
case PT_LOAD:
/* Remember where the main program starts in memory. */
{
ElfW(Addr) mapstart;
ElfW(Addr) allocend;

/* Remember where the main program starts in memory. */
mapstart = _dl_loaded->l_addr + (ph->p_vaddr & ~(ph->p_align - 1));
if (_dl_loaded->l_map_start > mapstart)
_dl_loaded->l_map_start = mapstart;

/* Also where it ends. */
allocend = _dl_loaded->l_addr + ph->p_vaddr + ph->p_memsz;
if (_dl_loaded->l_map_end < allocend)
_dl_loaded->l_map_end = allocend;
}
break;
}
if (! _dl_loaded->l_map_end)
_dl_loaded->l_map_end = ~0;
if (! _dl_rtld_map.l_libname && _dl_rtld_map.l_name)
{
/* We were invoked directly, so the program might not have a
Expand Down
3 changes: 2 additions & 1 deletion iconv/gconv.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,8 @@ __gconv (__gconv_t cd, const unsigned char **inbuf,
/* We just flush. */
result = DL_CALL_FCT (cd->__steps->__fct,
(cd->__steps, cd->__data, NULL, NULL, NULL,
irreversible, 1, 0));
irreversible,
cd->__data[last_step].__outbuf == NULL ? 2 : 1, 0));
else
{
const unsigned char *last_start;
Expand Down
101 changes: 83 additions & 18 deletions iconv/skeleton.c
Original file line number Diff line number Diff line change
Expand Up @@ -298,28 +298,93 @@ FUNCTION_NAME (struct __gconv_step *step, struct __gconv_step_data *data,
dropped. */
if (__builtin_expect (do_flush, 0))
{
status = __GCONV_OK;

/* This should never happen during error handling. */
assert (outbufstart == NULL);

status = __GCONV_OK;

#ifdef EMIT_SHIFT_TO_INIT
/* Emit the escape sequence to reset the state. */
EMIT_SHIFT_TO_INIT;
#else
/* Clear the state object. There might be bytes in there from
previous calls with CONSUME_INCOMPLETE == 1. */
memset (data->__statep, '\0', sizeof (*data->__statep));
if (do_flush == 1)
{
/* We preserve the initial values of the pointer variables. */
unsigned char *outbuf = data->__outbuf;
unsigned char *outstart = outbuf;
unsigned char *outend = data->__outbufend;

# ifdef PREPARE_LOOP
PREPARE_LOOP
# endif

# ifdef SAVE_RESET_STATE
SAVE_RESET_STATE (1);
# endif

/* Emit the escape sequence to reset the state. */
EMIT_SHIFT_TO_INIT;

/* Call the steps down the chain if there are any but only if we
successfully emitted the escape sequence. This should only
fail if the output buffer is full. If the input is invalid
it should be discarded since the user wants to start from a
clean state. */
if (status == __GCONV_OK)
{
if (data->__flags & __GCONV_IS_LAST)
/* Store information about how many bytes are available. */
data->__outbuf = outbuf;
else
{
/* Write out all output which was produced. */
if (outbuf > outstart)
{
const unsigned char *outerr = outstart;
int result;

result = DL_CALL_FCT (fct, (next_step, next_data,
&outerr, outbuf, NULL,
irreversible, 0,
consume_incomplete));

if (result != __GCONV_EMPTY_INPUT)
{
if (__builtin_expect (outerr != outbuf, 0))
{
/* We have a problem. Undo the conversion. */
outbuf = outstart;

/* Restore the state. */
# ifdef SAVE_RESET_STATE
SAVE_RESET_STATE (0);
# endif
}

/* Change the status. */
status = result;
}
}

if (status == __GCONV_OK)
/* Now flush the remaining steps. */
status = DL_CALL_FCT (fct, (next_step, next_data, NULL,
NULL, NULL, irreversible, 1,
consume_incomplete));
}
}
}
else
#endif
/* Call the steps down the chain if there are any but only if we
successfully emitted the escape sequence. This should only
fail if the output buffer is full. If the input is invalid
it should be discarded since the user wants to start from a
clean slate. */
if (status == __GCONV_OK && ! (data->__flags & __GCONV_IS_LAST))
status = DL_CALL_FCT (fct, (next_step, next_data, NULL, NULL,
NULL, irreversible, 1,
consume_incomplete));
{
/* Clear the state object. There might be bytes in there from
previous calls with CONSUME_INCOMPLETE == 1. But don't emit
escape sequences. */
memset (data->__statep, '\0', sizeof (*data->__statep));

if (! (data->__flags & __GCONV_IS_LAST))
/* Now flush the remaining steps. */
status = DL_CALL_FCT (fct, (next_step, next_data, NULL, NULL,
NULL, irreversible, do_flush,
consume_incomplete));
}
}
else
{
Expand Down Expand Up @@ -499,7 +564,7 @@ FUNCTION_NAME (struct __gconv_step *step, struct __gconv_step_data *data,
*inptrp = inptr;
outbuf = outstart;

/* Reset the state. */
/* Restore the state. */
# ifdef SAVE_RESET_STATE
SAVE_RESET_STATE (0);
# endif
Expand Down
34 changes: 34 additions & 0 deletions iconvdata/CP1255.irreversible
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
0xD6C7 0xFB1F
0xE0C7 0xFB2E
0xE0C8 0xFB2F
0xE0CC 0xFB30
0xE1CC 0xFB31
0xE1CF 0xFB4C
0xE2CC 0xFB32
0xE3CC 0xFB33
0xE4CC 0xFB34
0xE5C9 0xFB4B
0xE5CC 0xFB35
0xE6CC 0xFB36
0xE8CC 0xFB38
0xE9C4 0xFB1D
0xE9CC 0xFB39
0xEACC 0xFB3A
0xEBCC 0xFB3B
0xEBCF 0xFB4D
0xECCC 0xFB3C
0xEECC 0xFB3E
0xF0CC 0xFB40
0xF1CC 0xFB41
0xF3CC 0xFB43
0xF4CC 0xFB44
0xF4CF 0xFB4E
0xF6CC 0xFB46
0xF7CC 0xFB47
0xF8CC 0xFB48
0xF9CC 0xFB49
0xF9CCD1 0xFB2C
0xF9CCD2 0xFB2D
0xF9D1 0xFB2A
0xF9D2 0xFB2B
0xFACC 0xFB4A
Loading

0 comments on commit 2373b30

Please sign in to comment.