From 13eb93fcb6a03afd8fc05fa2b4c60046473e8507 Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Wed, 8 Jul 2009 01:11:16 +0200 Subject: add a segfault handler to MMap to show the Cache-Limit message, which can be deactivated with MMap::SegfaultHandler=false (Closes: 535218) --- apt-pkg/contrib/mmap.cc | 24 ++++++++++++++++++++++++ debian/changelog | 2 ++ 2 files changed, 26 insertions(+) diff --git a/apt-pkg/contrib/mmap.cc b/apt-pkg/contrib/mmap.cc index 073bc9eb3..5f56178f4 100644 --- a/apt-pkg/contrib/mmap.cc +++ b/apt-pkg/contrib/mmap.cc @@ -19,6 +19,7 @@ #define _BSD_SOURCE #include #include +#include #include @@ -26,6 +27,8 @@ #include #include #include +#include +#include #include /*}}}*/ @@ -136,6 +139,20 @@ bool MMap::Sync(unsigned long Start,unsigned long Stop) } /*}}}*/ +// DynamicMMapSegfaultHandler /*{{{*/ +// --------------------------------------------------------------------- +/* In theory, the mmap should never segfault because we check the available + size of our mmap before we use it, but there are a few reports out there + which state that the mmap segfaults without further notice. So this handler + will take care of all these segfaults which should never happen... */ +void DynamicMMapSegfaultHandler(int) +{ + _error->Error(_("Dynamic MMap segfaults, most likely because it ran out of room. " + "Please increase the size of APT::Cache-Limit. (man 5 apt.conf)")); + _error->DumpErrors(); + exit(EXIT_FAILURE); +} + /*}}}*/ // DynamicMMap::DynamicMMap - Constructor /*{{{*/ // --------------------------------------------------------------------- /* */ @@ -170,6 +187,13 @@ DynamicMMap::DynamicMMap(unsigned long Flags,unsigned long WorkSpace) : if (_error->PendingError() == true) return; + if (_config->FindB("MMap::SegfaultHandler",true) == true) + { + struct sigaction sa; + sa.sa_handler = DynamicMMapSegfaultHandler; + sigaction(SIGSEGV, &sa, NULL); + } + #ifdef _POSIX_MAPPED_FILES // use anonymous mmap() to get the memory Base = (unsigned char*) mmap(0, WorkSpace, PROT_READ|PROT_WRITE, diff --git a/debian/changelog b/debian/changelog index 27b798fe5..aba5e4cf4 100644 --- a/debian/changelog +++ b/debian/changelog @@ -36,6 +36,8 @@ apt (0.7.22) UNRELEASED; urgency=low * versions with a pin of -1 shouldn't be a candidate (Closes: #355237) * prefer mmap as memory allocator in MMap instead of a static char array which can (at least in theory) grow dynamic + * add a segfault handler to MMap to show the Cache-Limit message, which + can be deactivated with MMap::SegfaultHandler=false (Closes: 535218) [ Michael Vogt ] * honor the dpkg hold state in new Marker hooks (closes: #64141) -- cgit v1.2.3