Index: CREDITS.TXT
===================================================================
--- CREDITS.TXT	(revision 216677)
+++ CREDITS.TXT	(working copy)
@@ -8,6 +8,10 @@
 (W), PGP key ID and fingerprint (P), description (D), and snail-mail address
 (S).
 
+N: Aaron Ballman
+E: aaron@aaronballman.com
+D: Minor patches
+
 N: Logan Chien
 E: logan.chien@mediatek.com
 D: ARM EHABI Unwind & Exception Handling
Index: include/cxxabi.h
===================================================================
--- include/cxxabi.h	(revision 216677)
+++ include/cxxabi.h	(working copy)
@@ -66,6 +66,7 @@
 // 2.6 Auxiliary Runtime APIs
 extern LIBCXXABI_NORETURN void __cxa_bad_cast(void);
 extern LIBCXXABI_NORETURN void __cxa_bad_typeid(void);
+extern LIBCXXABI_NORETURN void __cxa_bad_array_new_length(void);
 
 
 
Index: src/cxa_aux_runtime.cpp
===================================================================
--- src/cxa_aux_runtime.cpp	(revision 216677)
+++ src/cxa_aux_runtime.cpp	(working copy)
@@ -29,6 +29,10 @@
     throw std::bad_typeid();
 }
 
+LIBCXXABI_NORETURN
+void __cxa_bad_array_new_length(void) {
+    throw std::bad_array_new_length();
+}
 }  // extern "C"
 
 }  // abi
Index: test/test_aux_runtime.cpp
===================================================================
--- test/test_aux_runtime.cpp	(revision 216677)
+++ test/test_aux_runtime.cpp	(working copy)
@@ -9,6 +9,7 @@
 
 #include <typeinfo>
 #include <iostream>
+#include <limits>
 
 //  Test taken from 5.2.8.2
 //  When typeid is applied to a glvalue expression whose type is a polymorphic 
@@ -46,7 +47,16 @@
     catch ( const std::bad_cast &bc ) { return true; }
     return false;
     }
-    
+
+//  If the expression passed to operator new[] would result in an overflow, the
+//  allocation function is not called, and a std::bad_array_new_length exception
+//  is thrown instead (5.3.4p7).
+bool bad_array_new_length_test () {
+	try { int *I = new int[std::numeric_limits<size_t>::max()]; }
+	catch ( const std::bad_array_new_length &banl ) { return true; }
+	return false;
+    }
+
 int main ( int argc, char *argv [] ) {
     int ret_val = 0;
     
@@ -59,6 +69,11 @@
         std::cerr << "Bad cast test failed!" << std::endl;
         ret_val = 1;
     }
-    
+
+    if ( !bad_array_new_length_test ()) {
+        std::cerr << "Bad array new length test failed!" << std::endl;
+        ret_val = 1;
+    }
+
     return ret_val;
     }
