* stdlib/cxa_atexit.c (__new_exitfn): Rewrite to preserve order in
	which the functions were registered.
	* dlfcn/Makefile: Add rules to build and run bug-atexit1 and
	bug-atexit2.
	* dlfcn/bug-atext1.c: New file.
	* dlfcn/bug-atext1-lib.c: New file.
	* dlfcn/bug-atext2.c: New file.
	* dlfcn/bug-atext2-lib.c: New file.
This commit is contained in:
Ulrich Drepper 2005-09-28 00:14:50 +00:00
parent b6caa3a615
commit 7237d70417
6 changed files with 490 additions and 4 deletions

View File

@ -7,6 +7,16 @@
2005-09-27 Ulrich Drepper <drepper@redhat.com> 2005-09-27 Ulrich Drepper <drepper@redhat.com>
[BZ #1158]
* stdlib/cxa_atexit.c (__new_exitfn): Rewrite to preserve order in
which the functions were registered.
* dlfcn/Makefile: Add rules to build and run bug-atexit1 and
bug-atexit2.
* dlfcn/bug-atext1.c: New file.
* dlfcn/bug-atext1-lib.c: New file.
* dlfcn/bug-atext2.c: New file.
* dlfcn/bug-atext2-lib.c: New file.
[BZ #1078] [BZ #1078]
* libio/fileops.c (_IO_new_file_xsputn): Determine amount of * libio/fileops.c (_IO_new_file_xsputn): Determine amount of
available space in non-line-buffered buffer correctly. available space in non-line-buffered buffer correctly.

View File

@ -1,4 +1,4 @@
# Copyright (C) 1995-2002, 2003, 2004 Free Software Foundation, Inc. # Copyright (C) 1995-2002, 2003, 2004, 2005 Free Software Foundation, Inc.
# This file is part of the GNU C Library. # This file is part of the GNU C Library.
# The GNU C Library is free software; you can redistribute it and/or # The GNU C Library is free software; you can redistribute it and/or
@ -26,7 +26,8 @@ elide-routines.os := $(routines)
distribute := dlopenold.c glreflib1.c glreflib2.c failtestmod.c \ distribute := dlopenold.c glreflib1.c glreflib2.c failtestmod.c \
defaultmod1.c defaultmod2.c errmsg1mod.c modatexit.c \ defaultmod1.c defaultmod2.c errmsg1mod.c modatexit.c \
modcxaatexit.c modstatic.c modstatic2.c \ modcxaatexit.c modstatic.c modstatic2.c \
bug-dlsym1-lib1.c bug-dlsym1-lib2.c bug-dlsym1-lib1.c bug-dlsym1-lib2.c bug-atexit1-lib.c \
bug-atexit2-lib.c
extra-libs-others := libdl extra-libs-others := libdl
@ -39,14 +40,15 @@ endif
ifeq (yes,$(build-shared)) ifeq (yes,$(build-shared))
tests = glrefmain failtest tst-dladdr default errmsg1 tstcxaatexit \ tests = glrefmain failtest tst-dladdr default errmsg1 tstcxaatexit \
bug-dlopen1 bug-dlsym1 tst-dlinfo bug-dlopen1 bug-dlsym1 tst-dlinfo bug-atexit1 bug-atexit2
ifeq (yes,$(have-protected)) ifeq (yes,$(have-protected))
tests += tstatexit tests += tstatexit
endif endif
endif endif
modules-names = glreflib1 glreflib2 failtestmod defaultmod1 defaultmod2 \ modules-names = glreflib1 glreflib2 failtestmod defaultmod1 defaultmod2 \
errmsg1mod modatexit modcxaatexit \ errmsg1mod modatexit modcxaatexit \
bug-dlsym1-lib1 bug-dlsym1-lib2 bug-dlsym1-lib1 bug-dlsym1-lib2 bug-atexit1-lib \
bug-atexit2-lib
failtestmod.so-no-z-defs = yes failtestmod.so-no-z-defs = yes
glreflib2.so-no-z-defs = yes glreflib2.so-no-z-defs = yes
@ -125,6 +127,15 @@ $(objpfx)bug-dlsym1-lib1.so: $(objpfx)bug-dlsym1-lib2.so \
$(objpfx)bug-dlsym1-lib2.so: $(common-objpfx)libc.so \ $(objpfx)bug-dlsym1-lib2.so: $(common-objpfx)libc.so \
$(common-objpfx)libc_nonshared.a $(common-objpfx)libc_nonshared.a
$(objpfx)bug-atexit1: $(libdl)
$(objpfx)bug-atexit1.out: $(objpfx)bug-atexit1-lib.so
$(objpfx)bug-atexit1-lib.so: $(common-objpfx)libc.so \
$(common-objpfx)libc_nonshared.a
$(objpfx)bug-atexit2: $(libdl)
$(objpfx)bug-atexit2.out: $(objpfx)bug-atexit2-lib.so
$(objpfx)bug-atexit2-lib.so: $(common-objpfx)libc.so \
$(common-objpfx)libc_nonshared.a
# Depend on libc.so so a DT_NEEDED is generated in the shared objects. # Depend on libc.so so a DT_NEEDED is generated in the shared objects.

375
dlfcn/bug-atexit1-lib.c Normal file
View File

@ -0,0 +1,375 @@
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
static int next;
void
f00 (void)
{
puts ("f00");
if (next-- != 0)
_exit (1);
}
void
f01 (void)
{
puts ("f01");
if (next-- != 1)
_exit (1);
}
void
f02 (void)
{
puts ("f02");
if (next-- != 2)
_exit (1);
}
void
f03 (void)
{
puts ("f03");
if (next-- != 3)
_exit (1);
}
void
f04 (void)
{
puts ("f04");
if (next-- != 4)
_exit (1);
}
void
f05 (void)
{
puts ("f05");
if (next-- != 5)
_exit (1);
}
void
f06 (void)
{
puts ("f06");
if (next-- != 6)
_exit (1);
}
void
f07 (void)
{
puts ("f07");
if (next-- != 7)
_exit (1);
}
void
f08 (void)
{
puts ("f08");
if (next-- != 8)
_exit (1);
}
void
f09 (void)
{
puts ("f09");
if (next-- != 9)
_exit (1);
}
void
f10 (void)
{
puts ("f10");
if (next-- != 10)
_exit (1);
}
void
f11 (void)
{
puts ("f11");
if (next-- != 11)
_exit (1);
}
void
f12 (void)
{
puts ("f12");
if (next-- != 12)
_exit (1);
}
void
f13 (void)
{
puts ("f13");
if (next-- != 13)
_exit (1);
}
void
f14 (void)
{
puts ("f14");
if (next-- != 14)
_exit (1);
}
void
f15 (void)
{
puts ("f15");
if (next-- != 15)
_exit (1);
}
void
f16 (void)
{
puts ("f16");
if (next-- != 16)
_exit (1);
}
void
f17 (void)
{
puts ("f17");
if (next-- != 17)
_exit (1);
}
void
f18 (void)
{
puts ("f18");
if (next-- != 18)
_exit (1);
}
void
f19 (void)
{
puts ("f19");
if (next-- != 19)
_exit (1);
}
void
f20 (void)
{
puts ("f20");
if (next-- != 20)
_exit (1);
}
void
f21 (void)
{
puts ("f21");
if (next-- != 21)
_exit (1);
}
void
f22 (void)
{
puts ("f22");
if (next-- != 22)
_exit (1);
}
void
f23 (void)
{
puts ("f23");
if (next-- != 23)
_exit (1);
}
void
f24 (void)
{
puts ("f24");
if (next-- != 24)
_exit (1);
}
void
f25 (void)
{
puts ("f25");
if (next-- != 25)
_exit (1);
}
void
f26 (void)
{
puts ("f26");
if (next-- != 26)
_exit (1);
}
void
f27 (void)
{
puts ("f27");
if (next-- != 27)
_exit (1);
}
void
f28 (void)
{
puts ("f28");
if (next-- != 28)
_exit (1);
}
void
f29 (void)
{
puts ("f29");
if (next-- != 29)
_exit (1);
}
void
f30 (void)
{
puts ("f30");
if (next-- != 30)
_exit (1);
}
void
f31 (void)
{
puts ("f31");
if (next-- != 31)
_exit (1);
}
void
f32 (void)
{
puts ("f32");
if (next-- != 32)
_exit (1);
}
void
f33 (void)
{
puts ("f33");
if (next-- != 33)
_exit (1);
}
void
f34 (void)
{
puts ("f34");
if (next-- != 34)
_exit (1);
}
void
f35 (void)
{
puts ("f35");
if (next-- != 35)
_exit (1);
}
void
f36 (void)
{
puts ("f36");
if (next-- != 36)
_exit (1);
}
void
f37 (void)
{
puts ("f37");
if (next-- != 37)
_exit (1);
}
void
f38 (void)
{
puts ("f38");
if (next-- != 38)
_exit (1);
}
void
f39 (void)
{
puts ("f39");
if (next-- != 39)
_exit (1);
}
void
foo (void)
{
atexit (f00);
atexit (f01);
atexit (f02);
atexit (f03);
atexit (f04);
atexit (f05);
atexit (f06);
atexit (f07);
atexit (f08);
atexit (f09);
atexit (f10);
atexit (f11);
atexit (f12);
atexit (f13);
atexit (f14);
atexit (f15);
atexit (f16);
atexit (f17);
atexit (f18);
atexit (f19);
atexit (f20);
atexit (f21);
atexit (f22);
atexit (f23);
atexit (f24);
atexit (f25);
atexit (f26);
atexit (f27);
atexit (f28);
atexit (f29);
atexit (f30);
atexit (f31);
atexit (f32);
atexit (f33);
atexit (f34);
atexit (f35);
atexit (f36);
atexit (f37);
atexit (f38);
atexit (f39);
next = 39;
}

23
dlfcn/bug-atexit1.c Normal file
View File

@ -0,0 +1,23 @@
/* Derived from a test case in
http://sourceware.org/bugzilla/show_bug.cgi?id=1158. */
#include <dlfcn.h>
#include <stdio.h>
#include <stdlib.h>
static int
do_test (void)
{
for (int i = 0; i < 2; ++i)
{
void *dso = dlopen ("$ORIGIN/bug-atexit1-lib.so", RTLD_NOW);
void (*fn) (void) = (void (*)()) dlsym (dso, "foo");
fn ();
dlclose (dso);
puts ("round done");
}
return 0;
}
#define TEST_FUNCTION do_test ()
#include "../test-skeleton.c"

14
dlfcn/bug-atexit2-lib.c Normal file
View File

@ -0,0 +1,14 @@
#include <stdio.h>
#include <stdlib.h>
void
fx (void)
{
puts ("At exit fx");
}
void
foo (void)
{
atexit (fx);
}

53
dlfcn/bug-atexit2.c Normal file
View File

@ -0,0 +1,53 @@
/* Derived from a test case in
http://sourceware.org/bugzilla/show_bug.cgi?id=1158. */
#include <dlfcn.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
static int next = 3;
static void
f1 (void)
{
puts ("f1");
if (next-- != 1)
_exit (1);
}
static void
f2 (void)
{
puts ("f2");
if (next-- != 2)
_exit (1);
}
static void
f3 (void)
{
puts ("f3");
if (next-- != 3)
_exit (1);
}
static int
do_test (void)
{
atexit (f1);
void *dso = dlopen ("$ORIGIN/bug-atexit2-lib.so", RTLD_NOW);
void (*fn) (void) = (void (*) (void)) dlsym (dso, "foo");
fn ();
atexit (f2);
dlclose (dso);
atexit (f3);
return 0;
}
#define TEST_FUNCTION do_test ()
#include "../test-skeleton.c"