Index: libcfa/src/heap.cfa
===================================================================
--- libcfa/src/heap.cfa	(revision e5256bd79044db0f54f2e025c35dfa7f574683fc)
+++ libcfa/src/heap.cfa	(revision 7671c6d930de5dc5a2cb9067ee379aca834be4d3)
@@ -10,6 +10,6 @@
 // Created On       : Tue Dec 19 21:58:35 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Oct 11 15:08:33 2022
-// Update Count     : 1525
+// Last Modified On : Wed Oct 12 18:06:01 2022
+// Update Count     : 1528
 //
 
@@ -453,5 +453,5 @@
 
 
-#define NO_MEMORY_MSG "insufficient heap memory available to allocate %zd new bytes."
+#define NO_MEMORY_MSG "**** Error **** insufficient heap memory available to allocate %zd new bytes."
 
 Heap * getHeap() with( heapMaster ) {
@@ -477,5 +477,5 @@
 				if ( errno == ENOMEM ) abort( NO_MEMORY_MSG, size ); // no memory
 				// Do not call strerror( errno ) as it may call malloc.
-				abort( "attempt to allocate block of heaps of size %zu bytes and mmap failed with errno %d.", size, errno );
+				abort( "**** Error **** attempt to allocate block of heaps of size %zu bytes and mmap failed with errno %d.", size, errno );
 			} // if
 			heapManagersStorageEnd = &heapManagersStorage[HeapDim]; // outside array
@@ -835,7 +835,13 @@
 		if ( unlikely( sbrk( increase ) == (void *)-1 ) ) {	// failed, no memory ?
 			unlock( extLock );
-			__cfaabi_bits_print_nolock( STDERR_FILENO, NO_MEMORY_MSG, size );
-			_exit( EXIT_FAILURE );						// give up
-		} // if
+			abort( NO_MEMORY_MSG, size );				// no memory
+		} // if
+
+		// Make storage executable for thunks.
+		if ( mprotect( (char *)heapEnd + heapRemaining, increase, __map_prot ) ) {
+			unlock( extLock );
+			abort( "**** Error **** attempt to make heap storage executable for thunks and mprotect failed with errno %d.", errno );
+		} // if
+
 		rem = heapRemaining + increase - size;
 
