summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhboehm <hboehm>2008-03-10 16:16:40 +0000
committerIvan Maidanski <ivmai@mail.ru>2011-07-26 21:06:42 +0400
commit1aca140c127cf0c8b1199eb0149437e61c4b390c (patch)
treee72c4923d754061815f647a9b1861e2fcc7d9861
parent8a3f5b962695e29451e96265f1c2bd572d992f16 (diff)
downloadbdwgc-1aca140c127cf0c8b1199eb0149437e61c4b390c.tar.gz
2008-03-10 Hans Boehm <Hans.Boehm@hp.com>
* allchblk.c (GC_allochblk): Check for overflow during size rounding. * tests/huge_test.c: New. * Makefile.direct, tests/tests.am: Add huge_test.c * Makefile.in: Regenerate.
-rw-r--r--ChangeLog8
-rw-r--r--Makefile.direct3
-rw-r--r--Makefile.in29
-rw-r--r--allchblk.c3
-rw-r--r--tests/huge_test.c45
-rw-r--r--tests/tests.am7
6 files changed, 86 insertions, 9 deletions
diff --git a/ChangeLog b/ChangeLog
index 67592f25..ef78b1df 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2008-03-10 Hans Boehm <Hans.Boehm@hp.com>
+
+ * allchblk.c (GC_allochblk): Check for overflow during size
+ rounding.
+ * tests/huge_test.c: New.
+ * Makefile.direct, tests/tests.am: Add huge_test.c
+ * Makefile.in: Regenerate.
+
2008-02-29 Hans Boehm <Hans.Boehm@hp.com>
* pthread_support.c: Fix typo in comment.
diff --git a/Makefile.direct b/Makefile.direct
index 765217f8..23b0ab36 100644
--- a/Makefile.direct
+++ b/Makefile.direct
@@ -379,7 +379,8 @@ DOC_FILES= README.QUICK doc/README.Mac doc/README.MacOSX doc/README.OS2 \
doc/simple_example.html doc/README.win64
TESTS= tests/test.c tests/test_cpp.cc tests/trace_test.c \
- tests/leak_test.c tests/thread_leak_test.c tests/middle.c
+ tests/leak_test.c tests/thread_leak_test.c tests/middle.c \
+ tests/smash_test.c tests/huge_test.c
GNU_BUILD_FILES= configure.ac Makefile.am configure acinclude.m4 \
libtool.m4 install-sh configure.host Makefile.in \
diff --git a/Makefile.in b/Makefile.in
index 087ecaa1..1fd6164e 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -96,7 +96,8 @@ build_triplet = @build@
host_triplet = @host@
target_triplet = @target@
check_PROGRAMS = gctest$(EXEEXT) leaktest$(EXEEXT) middletest$(EXEEXT) \
- smashtest$(EXEEXT) $(am__EXEEXT_1) $(am__EXEEXT_2)
+ smashtest$(EXEEXT) hugetest$(EXEEXT) $(am__EXEEXT_1) \
+ $(am__EXEEXT_2)
# C Library: Architecture Dependent
# ---------------------------------
@@ -185,6 +186,9 @@ libgccpp_la_OBJECTS = $(am_libgccpp_la_OBJECTS)
am_gctest_OBJECTS = tests/test.$(OBJEXT)
gctest_OBJECTS = $(am_gctest_OBJECTS)
am__DEPENDENCIES_2 = $(top_builddir)/libgc.la $(am__DEPENDENCIES_1)
+am_hugetest_OBJECTS = tests/huge_test.$(OBJEXT)
+hugetest_OBJECTS = $(am_hugetest_OBJECTS)
+hugetest_DEPENDENCIES = $(am__DEPENDENCIES_2)
am_leaktest_OBJECTS = tests/leak_test.$(OBJEXT)
leaktest_OBJECTS = $(am_leaktest_OBJECTS)
leaktest_DEPENDENCIES = $(am__DEPENDENCIES_2)
@@ -232,13 +236,14 @@ CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \
$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
SOURCES = $(libcord_la_SOURCES) $(libgc_la_SOURCES) \
$(EXTRA_libgc_la_SOURCES) $(nodist_libgc_la_SOURCES) \
- $(libgccpp_la_SOURCES) $(gctest_SOURCES) $(leaktest_SOURCES) \
- $(middletest_SOURCES) $(smashtest_SOURCES) $(test_cpp_SOURCES) \
- $(threadleaktest_SOURCES)
+ $(libgccpp_la_SOURCES) $(gctest_SOURCES) $(hugetest_SOURCES) \
+ $(leaktest_SOURCES) $(middletest_SOURCES) $(smashtest_SOURCES) \
+ $(test_cpp_SOURCES) $(threadleaktest_SOURCES)
DIST_SOURCES = $(libcord_la_SOURCES) $(am__libgc_la_SOURCES_DIST) \
$(EXTRA_libgc_la_SOURCES) $(am__libgccpp_la_SOURCES_DIST) \
- $(gctest_SOURCES) $(leaktest_SOURCES) $(middletest_SOURCES) \
- $(smashtest_SOURCES) $(am__test_cpp_SOURCES_DIST) \
+ $(gctest_SOURCES) $(hugetest_SOURCES) $(leaktest_SOURCES) \
+ $(middletest_SOURCES) $(smashtest_SOURCES) \
+ $(am__test_cpp_SOURCES_DIST) \
$(am__threadleaktest_SOURCES_DIST)
RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
html-recursive info-recursive install-data-recursive \
@@ -502,7 +507,8 @@ dist_noinst_HEADERS = include/private/gc_hdrs.h \
include/private/thread_local_alloc.h include/cord.h \
include/ec.h include/javaxfc.h
TESTS = gctest$(EXEEXT) leaktest$(EXEEXT) middletest$(EXEEXT) \
- smashtest$(EXEEXT) $(am__append_6) $(am__append_8)
+ smashtest$(EXEEXT) hugetest$(EXEEXT) $(am__append_6) \
+ $(am__append_8)
pkgconfigdir = $(libdir)/pkgconfig
dist_pkgconfig_DATA = bdw-gc.pc
libgc_la_SOURCES = allchblk.c alloc.c blacklst.c checksums.c dbg_mlc.c \
@@ -568,6 +574,8 @@ middletest_SOURCES = tests/middle.c
middletest_LDADD = $(test_ldadd)
smashtest_SOURCES = tests/smash_test.c
smashtest_LDADD = $(test_ldadd)
+hugetest_SOURCES = tests/huge_test.c
+hugetest_LDADD = $(test_ldadd)
@THREADS_TRUE@threadleaktest_SOURCES = tests/thread_leak_test.c
@THREADS_TRUE@threadleaktest_LDADD = $(test_ldadd)
@CPLUSPLUS_TRUE@test_cpp_SOURCES = tests/test_cpp.cc
@@ -721,6 +729,11 @@ tests/test.$(OBJEXT): tests/$(am__dirstamp) \
gctest$(EXEEXT): $(gctest_OBJECTS) $(gctest_DEPENDENCIES)
@rm -f gctest$(EXEEXT)
$(LINK) $(gctest_LDFLAGS) $(gctest_OBJECTS) $(gctest_LDADD) $(LIBS)
+tests/huge_test.$(OBJEXT): tests/$(am__dirstamp) \
+ tests/$(DEPDIR)/$(am__dirstamp)
+hugetest$(EXEEXT): $(hugetest_OBJECTS) $(hugetest_DEPENDENCIES)
+ @rm -f hugetest$(EXEEXT)
+ $(LINK) $(hugetest_LDFLAGS) $(hugetest_OBJECTS) $(hugetest_LDADD) $(LIBS)
tests/leak_test.$(OBJEXT): tests/$(am__dirstamp) \
tests/$(DEPDIR)/$(am__dirstamp)
leaktest$(EXEEXT): $(leaktest_OBJECTS) $(leaktest_DEPENDENCIES)
@@ -761,6 +774,7 @@ mostlyclean-compile:
-rm -f cord/cordtest.lo
-rm -f cord/cordxtra.$(OBJEXT)
-rm -f cord/cordxtra.lo
+ -rm -f tests/huge_test.$(OBJEXT)
-rm -f tests/leak_test.$(OBJEXT)
-rm -f tests/middle.$(OBJEXT)
-rm -f tests/smash_test.$(OBJEXT)
@@ -808,6 +822,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@cord/$(DEPDIR)/cordprnt.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@cord/$(DEPDIR)/cordtest.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@cord/$(DEPDIR)/cordxtra.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/huge_test.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/leak_test.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/middle.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/smash_test.Po@am__quote@
diff --git a/allchblk.c b/allchblk.c
index 8d326e53..9347b675 100644
--- a/allchblk.c
+++ b/allchblk.c
@@ -587,6 +587,9 @@ GC_allochblk(size_t sz, int kind, unsigned flags/* IGNORE_OFF_PAGE or 0 */)
GC_ASSERT((sz & (GRANULE_BYTES - 1)) == 0);
blocks = OBJ_SZ_TO_BLOCKS(sz);
+ if ((signed_word)(blocks * HBLKSIZE) < 0) {
+ return 0;
+ }
start_list = GC_hblk_fl_from_blocks(blocks);
/* Try for an exact match first. */
result = GC_allochblk_nth(sz, kind, flags, start_list, FALSE);
diff --git a/tests/huge_test.c b/tests/huge_test.c
new file mode 100644
index 00000000..248b1d71
--- /dev/null
+++ b/tests/huge_test.c
@@ -0,0 +1,45 @@
+#include <stdlib.h>
+#include <limits.h>
+#include <stdio.h>
+#include <gc.h>
+
+/*
+ * Check that very large allocation requests fail. "Success" would usually
+ * indicate that the the size was somehow converted to a negative
+ * number. Clients shouldn't do this, but we should fail in the
+ * expected manner.
+ */
+
+
+main()
+{
+ GC_INIT();
+
+ GC_set_max_heap_size(100*1024*1024);
+ /* Otherwise heap expansion aborts when deallocating large block. */
+ /* That's OK. We test this corner case mostly to make sure that */
+ /* it fails predictably. */
+ GC_expand_hp(1024*1024*5);
+ if (sizeof(long) == sizeof(void *)) {
+ void *r = GC_MALLOC(LONG_MAX-1024);
+ if (0 != r) {
+ fprintf(stderr,
+ "Size LONG_MAX-1024 allocation unexpectedly succeeded\n");
+ exit(1);
+ }
+ r = GC_MALLOC(LONG_MAX);
+ if (0 != r) {
+ fprintf(stderr,
+ "Size LONG_MAX allocation unexpectedly succeeded\n");
+ exit(1);
+ }
+ r = GC_MALLOC((size_t)LONG_MAX + 1024);
+ if (0 != r) {
+ fprintf(stderr,
+ "Size LONG_MAX+1024 allocation unexpectedly succeeded\n");
+ exit(1);
+ }
+ }
+ return 0;
+}
+
diff --git a/tests/tests.am b/tests/tests.am
index 28593770..a9c0e73f 100644
--- a/tests/tests.am
+++ b/tests/tests.am
@@ -10,7 +10,7 @@
# modified is included with the above copyright notice.
-## FIXME: trace_test don't works on macosx 10.3
+## FIXME: trace_test doesn't work on macosx 10.3
## gcc -g -O2 -o .libs/tracetest trace_test.o ../.libs/libgc.dylib -lpthread
## ld: Undefined symbols:
## _GC_generate_random_backtrace
@@ -41,6 +41,11 @@ check_PROGRAMS += smashtest
smashtest_SOURCES = tests/smash_test.c
smashtest_LDADD = $(test_ldadd)
+TESTS += hugetest$(EXEEXT)
+check_PROGRAMS += hugetest
+hugetest_SOURCES = tests/huge_test.c
+hugetest_LDADD = $(test_ldadd)
+
#TESTS += tracetest$(EXEEXT)
#check_PROGRAMS += tracetest
#tracetest_SOURCES = tests/trace_test.c