You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by sf...@apache.org on 2011/09/19 18:25:43 UTC

svn commit: r1172686 - in /httpd/httpd/trunk: ./ include/ modules/cache/ modules/examples/ modules/proxy/ modules/ssl/ server/ server/mpm/event/ server/mpm/worker/

Author: sf
Date: Mon Sep 19 16:25:42 2011
New Revision: 1172686

URL: http://svn.apache.org/viewvc?rev=1172686&view=rev
Log:
Add wrappers for malloc, calloc, realloc that check for out of memory
situations.  Use them in most places where malloc, and friends are used.
This results in clean error messages in an out of memory situation instead of
segfaulting or silently malfunctioning. In some places, it just allows to
remove some logging code.

PR 51568, PR 51569, PR 51571.

Modified:
    httpd/httpd/trunk/CHANGES
    httpd/httpd/trunk/include/ap_config.h
    httpd/httpd/trunk/include/ap_mmn.h
    httpd/httpd/trunk/include/httpd.h
    httpd/httpd/trunk/modules/cache/cache_cache.c
    httpd/httpd/trunk/modules/cache/cache_hash.c
    httpd/httpd/trunk/modules/cache/cache_pqueue.c
    httpd/httpd/trunk/modules/cache/mod_socache_dbm.c
    httpd/httpd/trunk/modules/examples/mod_case_filter_in.c
    httpd/httpd/trunk/modules/proxy/proxy_util.c
    httpd/httpd/trunk/modules/ssl/ssl_util.c
    httpd/httpd/trunk/server/config.c
    httpd/httpd/trunk/server/main.c
    httpd/httpd/trunk/server/mpm/event/event.c
    httpd/httpd/trunk/server/mpm/worker/worker.c
    httpd/httpd/trunk/server/mpm_unix.c
    httpd/httpd/trunk/server/scoreboard.c
    httpd/httpd/trunk/server/util.c

Modified: httpd/httpd/trunk/CHANGES
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/CHANGES?rev=1172686&r1=1172685&r2=1172686&view=diff
==============================================================================
--- httpd/httpd/trunk/CHANGES [utf-8] (original)
+++ httpd/httpd/trunk/CHANGES [utf-8] Mon Sep 19 16:25:42 2011
@@ -12,6 +12,10 @@ Changes with Apache 2.3.15
      PR 51714. [Stefan Fritsch, Jim Jagielski, Ruediger Pluem, Eric Covener,
      <lowprio20 gmail.com>]
 
+  *) Add wrappers for malloc, calloc, realloc that check for out of memory
+     situations and use them in many places. PR 51568, PR 51569, PR 51571.
+     [Stefan Fritsch]
+
   *) Fix cross-compilation of mod_cgi/mod_cgid when APR_HAVE_STRUCT_RLIMIT is 
      false but RLIMIT_* are defined.  PR51371. [Eric Covener]
 

Modified: httpd/httpd/trunk/include/ap_config.h
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/include/ap_config.h?rev=1172686&r1=1172685&r2=1172686&view=diff
==============================================================================
--- httpd/httpd/trunk/include/ap_config.h (original)
+++ httpd/httpd/trunk/include/ap_config.h Mon Sep 19 16:25:42 2011
@@ -182,4 +182,12 @@
 #define ap_func_attr_sentinel
 #endif
 
+#if ( defined(__GNUC__) &&                                        \
+      (__GNUC__ >= 4 || ( __GNUC__ == 3 && __GNUC_MINOR__ >= 4))) \
+    || __has_attribute(warn_unused_result)
+#define ap_func_attr_warn_unused_result   __attribute__((warn_unused_result))
+#else
+#define ap_func_attr_warn_unused_result
+#endif
+
 #endif /* AP_CONFIG_H */

Modified: httpd/httpd/trunk/include/ap_mmn.h
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/include/ap_mmn.h?rev=1172686&r1=1172685&r2=1172686&view=diff
==============================================================================
--- httpd/httpd/trunk/include/ap_mmn.h (original)
+++ httpd/httpd/trunk/include/ap_mmn.h Mon Sep 19 16:25:42 2011
@@ -352,6 +352,8 @@
  * 20110724.5 (2.3.15-dev) add ap_set_accept_ranges()
  * 20110724.6 (2.3.15-dev) add max_overlaps and max_reversals to core_dir_config
  * 20110724.7 (2.3.15-dev) add ap_random_insecure_bytes(), ap_random_pick()
+ * 20110724.8 (2.3.15-dev) add ap_abort_on_oom(), ap_malloc(), ap_calloc(),
+ *                         ap_realloc()
  */
 
 #define MODULE_MAGIC_COOKIE 0x41503234UL /* "AP24" */
@@ -359,7 +361,7 @@
 #ifndef MODULE_MAGIC_NUMBER_MAJOR
 #define MODULE_MAGIC_NUMBER_MAJOR 20110724
 #endif
-#define MODULE_MAGIC_NUMBER_MINOR 7                    /* 0...n */
+#define MODULE_MAGIC_NUMBER_MINOR 8                    /* 0...n */
 
 /**
  * Determine if the server's current MODULE_MAGIC_NUMBER is at least a

Modified: httpd/httpd/trunk/include/httpd.h
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/include/httpd.h?rev=1172686&r1=1172685&r2=1172686&view=diff
==============================================================================
--- httpd/httpd/trunk/include/httpd.h (original)
+++ httpd/httpd/trunk/include/httpd.h Mon Sep 19 16:25:42 2011
@@ -2086,6 +2086,38 @@ AP_DECLARE(void) ap_random_insecure_byte
  */
 AP_DECLARE(apr_uint32_t) ap_random_pick(apr_uint32_t min, apr_uint32_t max);
 
+/**
+ * Abort with a error message signifying out of memory
+ */
+AP_DECLARE(void) ap_abort_on_oom(void) __attribute__((noreturn));
+
+/**
+ * Wrapper for malloc() that calls ap_abort_on_oom() if out of memory
+ * @param size size of the memory block
+ * @return pointer to the allocated memory
+ * @note ap_malloc may be implemented as a macro
+ */
+AP_DECLARE(void *) ap_malloc(size_t size) __attribute__((malloc));
+
+/**
+ * Wrapper for calloc() that calls ap_abort_on_oom() if out of memory
+ * @param nelem number of elements to allocate memory for
+ * @param size size of a single element
+ * @return pointer to the allocated memory
+ * @note ap_calloc may be implemented as a macro
+ */
+AP_DECLARE(void *) ap_calloc(size_t nelem, size_t size) __attribute__((malloc));
+
+/**
+ * Wrapper for realloc() that calls ap_abort_on_oom() if out of memory
+ * @param ptr pointer to the old memory block (or NULL)
+ * @param size new size of the memory block
+ * @return pointer to the reallocated memory
+ * @note ap_realloc may be implemented as a macro
+ */
+AP_DECLARE(void *) ap_realloc(void *ptr, size_t size)
+                   ap_func_attr_warn_unused_result;
+
 
 #define AP_NORESTART APR_OS_START_USEERR + 1
 

Modified: httpd/httpd/trunk/modules/cache/cache_cache.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/cache/cache_cache.c?rev=1172686&r1=1172685&r2=1172686&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/cache/cache_cache.c (original)
+++ httpd/httpd/trunk/modules/cache/cache_cache.c Mon Sep 19 16:25:42 2011
@@ -58,7 +58,7 @@ cache_cache_t* cache_init(int max_entrie
                                          cache_cache_free *free_entry)
 {
     cache_cache_t *tmp;
-    tmp = malloc(sizeof(cache_cache_t));
+    tmp = ap_malloc(sizeof(cache_cache_t));
     tmp->max_entries = max_entries;
     tmp->max_size = max_size;
     tmp->current_size = 0;

Modified: httpd/httpd/trunk/modules/cache/cache_hash.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/cache/cache_hash.c?rev=1172686&r1=1172685&r2=1172686&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/cache/cache_hash.c (original)
+++ httpd/httpd/trunk/modules/cache/cache_hash.c Mon Sep 19 16:25:42 2011
@@ -77,23 +77,16 @@ struct cache_hash_t {
  */
 static cache_hash_entry_t **alloc_array(cache_hash_t *ht, int max)
 {
-   return calloc(1, sizeof(*ht->array) * (max + 1));
+   return ap_calloc(1, sizeof(*ht->array) * (max + 1));
 }
 
 cache_hash_t* cache_hash_make(apr_size_t size)
 {
     cache_hash_t *ht;
-    ht = malloc(sizeof(cache_hash_t));
-    if (!ht) {
-        return NULL;
-    }
+    ht = ap_malloc(sizeof(cache_hash_t));
     ht->count = 0;
     ht->max = size;
     ht->array = alloc_array(ht, ht->max);
-    if (!ht->array) {
-        free(ht);
-        return NULL;
-    }
     return ht;
 }
 
@@ -226,10 +219,7 @@ static cache_hash_entry_t **find_entry(c
     if (he || !val)
         return hep;
     /* add a new entry for non-NULL values */
-    he = malloc(sizeof(*he));
-    if (!he) {
-        return NULL;
-    }
+    he = ap_malloc(sizeof(*he));
     he->next = NULL;
     he->hash = hash;
     he->key  = key;
@@ -260,8 +250,7 @@ void* cache_hash_set(cache_hash_t *ht,
     cache_hash_entry_t **hep, *tmp;
     const void *tval;
     hep = find_entry(ht, key, klen, val);
-    /* If hep == NULL, then the malloc() in find_entry failed */
-    if (hep && *hep) {
+    if (*hep) {
         if (!val) {
             /* delete entry */
             tval = (*hep)->val;

Modified: httpd/httpd/trunk/modules/cache/cache_pqueue.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/cache/cache_pqueue.c?rev=1172686&r1=1172685&r2=1172686&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/cache/cache_pqueue.c (original)
+++ httpd/httpd/trunk/modules/cache/cache_pqueue.c Mon Sep 19 16:25:42 2011
@@ -50,17 +50,9 @@ cache_pqueue_t *cache_pq_init(apr_ssize_
                               cache_pqueue_getpos get,
                               cache_pqueue_setpos set)
 {
-    cache_pqueue_t *q;
-
-    if (!(q = malloc(sizeof(cache_pqueue_t)))) {
-        return NULL;
-    }
-
+    cache_pqueue_t *q = ap_malloc(sizeof(cache_pqueue_t));
     /* Need to allocate n+1 elements since element 0 isn't used. */
-    if (!(q->d = malloc(sizeof(void*) * (n+1)))) {
-        free(q);
-        return NULL;
-    }
+    q->d = ap_malloc(sizeof(void*) * (n+1));
     q->avail = q->step = (n+1);  /* see comment above about n+1 */
     q->pri = pri;
     q->size = 1;
@@ -148,7 +140,7 @@ apr_status_t cache_pq_insert(cache_pqueu
     /* allocate more memory if necessary */
     if (q->size >= q->avail) {
         newsize = q->size + q->step;
-        if (!(tmp = realloc(q->d, sizeof(void*) * newsize))) {
+        if (!(tmp = ap_realloc(q->d, sizeof(void*) * newsize))) {
             return APR_EGENERAL;
         };
         q->d = tmp;

Modified: httpd/httpd/trunk/modules/cache/mod_socache_dbm.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/cache/mod_socache_dbm.c?rev=1172686&r1=1172685&r2=1172686&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/cache/mod_socache_dbm.c (original)
+++ httpd/httpd/trunk/modules/cache/mod_socache_dbm.c Mon Sep 19 16:25:42 2011
@@ -210,12 +210,7 @@ static apr_status_t socache_dbm_store(ap
 
     /* create DBM value */
     dbmval.dsize = sizeof(apr_time_t) + nData;
-    dbmval.dptr  = (char *)malloc(dbmval.dsize);
-    if (dbmval.dptr == NULL) {
-        ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s,
-                 "malloc error creating DBM value");
-        return APR_ENOMEM;
-    }
+    dbmval.dptr  = (char *)ap_malloc(dbmval.dsize);
     memcpy((char *)dbmval.dptr, &expiry, sizeof(apr_time_t));
     memcpy((char *)dbmval.dptr+sizeof(apr_time_t), ucaData, nData);
 

Modified: httpd/httpd/trunk/modules/examples/mod_case_filter_in.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/examples/mod_case_filter_in.c?rev=1172686&r1=1172685&r2=1172686&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/examples/mod_case_filter_in.c (original)
+++ httpd/httpd/trunk/modules/examples/mod_case_filter_in.c Mon Sep 19 16:25:42 2011
@@ -109,7 +109,7 @@ static apr_status_t CaseFilterInFilter(a
         if(ret != APR_SUCCESS)
             return ret;
 
-        buf = malloc(len);
+        buf = ap_malloc(len);
         for(n=0 ; n < len ; ++n)
             buf[n] = apr_toupper(data[n]);
 

Modified: httpd/httpd/trunk/modules/proxy/proxy_util.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/proxy/proxy_util.c?rev=1172686&r1=1172685&r2=1172686&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/proxy/proxy_util.c (original)
+++ httpd/httpd/trunk/modules/proxy/proxy_util.c Mon Sep 19 16:25:42 2011
@@ -1384,7 +1384,7 @@ PROXY_DECLARE(char *) ap_proxy_define_ba
     (*balancer)->lbmethod = lbmethod;
 
     if (do_malloc)
-        bshared = malloc(sizeof(proxy_balancer_shared));
+        bshared = ap_malloc(sizeof(proxy_balancer_shared));
     else
         bshared = apr_palloc(p, sizeof(proxy_balancer_shared));
 
@@ -1798,7 +1798,7 @@ PROXY_DECLARE(char *) ap_proxy_define_wo
      * if called during config, we don't have shm setup yet,
      * so just note the info for later. */
     if (do_malloc)
-        wshared = malloc(sizeof(proxy_worker_shared));  /* will be freed ap_proxy_share_worker */
+        wshared = ap_malloc(sizeof(proxy_worker_shared));  /* will be freed ap_proxy_share_worker */
     else
         wshared = apr_palloc(p, sizeof(proxy_worker_shared));
 

Modified: httpd/httpd/trunk/modules/ssl/ssl_util.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/ssl/ssl_util.c?rev=1172686&r1=1172685&r2=1172686&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/ssl/ssl_util.c (original)
+++ httpd/httpd/trunk/modules/ssl/ssl_util.c Mon Sep 19 16:25:42 2011
@@ -213,14 +213,14 @@ unsigned char *ssl_asn1_table_set(apr_ha
         }
     }
     else {
-        asn1 = malloc(sizeof(*asn1));
+        asn1 = ap_malloc(sizeof(*asn1));
         asn1->source_mtime = 0; /* used as a note for encrypted private keys */
         asn1->cpData = NULL;
     }
 
     asn1->nData = length;
     if (!asn1->cpData) {
-        asn1->cpData = malloc(length);
+        asn1->cpData = ap_malloc(length);
     }
 
     apr_hash_set(table, key, klen, asn1);

Modified: httpd/httpd/trunk/server/config.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/server/config.c?rev=1172686&r1=1172685&r2=1172686&view=diff
==============================================================================
--- httpd/httpd/trunk/server/config.c (original)
+++ httpd/httpd/trunk/server/config.c Mon Sep 19 16:25:42 2011
@@ -772,10 +772,10 @@ AP_DECLARE(const char *) ap_setup_prelin
     ap_loaded_modules = (module **)apr_palloc(process->pool,
         sizeof(module *) * conf_vector_length);
     if (!ap_module_short_names)
-        ap_module_short_names = calloc(sizeof(char *), conf_vector_length);
+        ap_module_short_names = ap_calloc(sizeof(char *), conf_vector_length);
 
     if (!merger_func_cache)
-        merger_func_cache = calloc(sizeof(merger_func), conf_vector_length);
+        merger_func_cache = ap_calloc(sizeof(merger_func), conf_vector_length);
 
     if (ap_loaded_modules == NULL || ap_module_short_names == NULL
         || merger_func_cache == NULL)

Modified: httpd/httpd/trunk/server/main.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/server/main.c?rev=1172686&r1=1172685&r2=1172686&view=diff
==============================================================================
--- httpd/httpd/trunk/server/main.c (original)
+++ httpd/httpd/trunk/server/main.c Mon Sep 19 16:25:42 2011
@@ -265,14 +265,10 @@ static void destroy_and_exit_process(pro
     exit(process_exit_value);
 }
 
-#define OOM_MESSAGE "[crit] Memory allocation failed, " \
-    "aborting process." APR_EOL_STR
-
 /* APR callback invoked if allocation fails. */
 static int abort_on_oom(int retcode)
 {
-    write(STDERR_FILENO, OOM_MESSAGE, strlen(OOM_MESSAGE));
-    abort();
+    ap_abort_on_oom();
     return retcode; /* unreachable, hopefully. */
 }
 

Modified: httpd/httpd/trunk/server/mpm/event/event.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/server/mpm/event/event.c?rev=1172686&r1=1172685&r2=1172686&view=diff
==============================================================================
--- httpd/httpd/trunk/server/mpm/event/event.c (original)
+++ httpd/httpd/trunk/server/mpm/event/event.c Mon Sep 19 16:25:42 2011
@@ -1007,7 +1007,7 @@ static apr_status_t s_socket_add(void *u
 {
     s_baton_t *s = (s_baton_t*)user_baton;
     /* XXXXX: recycle listener_poll_types */
-    listener_poll_type *pt = malloc(sizeof(*pt));
+    listener_poll_type *pt = ap_malloc(sizeof(*pt));
     pt->type = PT_SERF;
     pt->baton = serf_baton;
     pfd->client_data = pt;
@@ -1187,7 +1187,7 @@ static apr_status_t event_register_timed
     }
     else {
         /* XXXXX: lol, pool allocation without a context from any thread.Yeah. Right. MPMs Suck. */
-        te = malloc(sizeof(timer_event_t));
+        te = ap_malloc(sizeof(timer_event_t));
         APR_RING_ELEM_INIT(te, link);
     }
 
@@ -1766,7 +1766,7 @@ static void create_listener_thread(threa
     proc_info *my_info;
     apr_status_t rv;
 
-    my_info = (proc_info *) malloc(sizeof(proc_info));
+    my_info = (proc_info *) ap_malloc(sizeof(proc_info));
     my_info->pid = my_child_num;
     my_info->tid = -1;          /* listener thread doesn't have a thread slot */
     my_info->sd = 0;
@@ -1865,12 +1865,7 @@ static void *APR_THREAD_FUNC start_threa
                 continue;
             }
 
-            my_info = (proc_info *) malloc(sizeof(proc_info));
-            if (my_info == NULL) {
-                ap_log_error(APLOG_MARK, APLOG_ALERT, errno, ap_server_conf,
-                             "malloc: out of memory");
-                clean_child_exit(APEXIT_CHILDFATAL);
-            }
+            my_info = (proc_info *) ap_malloc(sizeof(proc_info));
             my_info->pid = my_child_num;
             my_info->tid = i;
             my_info->sd = 0;
@@ -2047,16 +2042,8 @@ static void child_main(int child_num_arg
     /* clear the storage; we may not create all our threads immediately,
      * and we want a 0 entry to indicate a thread which was not created
      */
-    threads = (apr_thread_t **) calloc(1,
-                                       sizeof(apr_thread_t *) *
-                                       threads_per_child);
-    if (threads == NULL) {
-        ap_log_error(APLOG_MARK, APLOG_ALERT, errno, ap_server_conf,
-                     "malloc: out of memory");
-        clean_child_exit(APEXIT_CHILDFATAL);
-    }
-
-    ts = (thread_starter *) apr_palloc(pchild, sizeof(*ts));
+    threads = ap_calloc(threads_per_child, sizeof(apr_thread_t *));
+    ts = apr_palloc(pchild, sizeof(*ts));
 
     apr_threadattr_create(&thread_attr, pchild);
     /* 0 means PTHREAD_CREATE_JOINABLE */

Modified: httpd/httpd/trunk/server/mpm/worker/worker.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/server/mpm/worker/worker.c?rev=1172686&r1=1172685&r2=1172686&view=diff
==============================================================================
--- httpd/httpd/trunk/server/mpm/worker/worker.c (original)
+++ httpd/httpd/trunk/server/mpm/worker/worker.c Mon Sep 19 16:25:42 2011
@@ -1006,7 +1006,7 @@ static void create_listener_thread(threa
     proc_info *my_info;
     apr_status_t rv;
 
-    my_info = (proc_info *)malloc(sizeof(proc_info));
+    my_info = (proc_info *)ap_malloc(sizeof(proc_info));
     my_info->pid = my_child_num;
     my_info->tid = -1; /* listener thread doesn't have a thread slot */
     my_info->sd = 0;
@@ -1072,12 +1072,7 @@ static void * APR_THREAD_FUNC start_thre
                 continue;
             }
 
-            my_info = (proc_info *)malloc(sizeof(proc_info));
-            if (my_info == NULL) {
-                ap_log_error(APLOG_MARK, APLOG_ALERT, errno, ap_server_conf,
-                             "malloc: out of memory");
-                clean_child_exit(APEXIT_CHILDFATAL);
-            }
+            my_info = (proc_info *)ap_malloc(sizeof(proc_info));
             my_info->pid = my_child_num;
             my_info->tid = i;
             my_info->sd = 0;
@@ -1271,14 +1266,8 @@ static void child_main(int child_num_arg
     /* clear the storage; we may not create all our threads immediately,
      * and we want a 0 entry to indicate a thread which was not created
      */
-    threads = (apr_thread_t **)calloc(1,
-                                sizeof(apr_thread_t *) * threads_per_child);
-    if (threads == NULL) {
-        ap_log_error(APLOG_MARK, APLOG_ALERT, errno, ap_server_conf,
-                     "malloc: out of memory");
-        clean_child_exit(APEXIT_CHILDFATAL);
-    }
-
+    threads = (apr_thread_t **)ap_calloc(1,
+                                  sizeof(apr_thread_t *) * threads_per_child);
     ts = (thread_starter *)apr_palloc(pchild, sizeof(*ts));
 
     apr_threadattr_create(&thread_attr, pchild);

Modified: httpd/httpd/trunk/server/mpm_unix.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/server/mpm_unix.c?rev=1172686&r1=1172685&r2=1172686&view=diff
==============================================================================
--- httpd/httpd/trunk/server/mpm_unix.c (original)
+++ httpd/httpd/trunk/server/mpm_unix.c Mon Sep 19 16:25:42 2011
@@ -75,7 +75,7 @@ static extra_process_t *extras;
 
 void ap_register_extra_mpm_process(pid_t pid, ap_generation_t gen)
 {
-    extra_process_t *p = (extra_process_t *)malloc(sizeof(extra_process_t));
+    extra_process_t *p = (extra_process_t *)ap_malloc(sizeof(extra_process_t));
 
     p->next = extras;
     p->pid = pid;

Modified: httpd/httpd/trunk/server/scoreboard.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/server/scoreboard.c?rev=1172686&r1=1172685&r2=1172686&view=diff
==============================================================================
--- httpd/httpd/trunk/server/scoreboard.c (original)
+++ httpd/httpd/trunk/server/scoreboard.c Mon Sep 19 16:25:42 2011
@@ -149,7 +149,7 @@ void ap_init_scoreboard(void *shared_sco
 
     ap_calc_scoreboard_size();
     ap_scoreboard_image =
-        calloc(1, sizeof(scoreboard) + server_limit * sizeof(worker_score *));
+        ap_calloc(1, sizeof(scoreboard) + server_limit * sizeof(worker_score *));
     more_storage = shared_score;
     ap_scoreboard_image->global = (global_score *)more_storage;
     more_storage += sizeof(global_score);
@@ -325,13 +325,7 @@ int ap_create_scoreboard(apr_pool_t *p, 
 #endif
     {
         /* A simple malloc will suffice */
-        void *sb_mem = calloc(1, scoreboard_size);
-        if (sb_mem == NULL) {
-            ap_log_error(APLOG_MARK, APLOG_CRIT, 0, ap_server_conf,
-                         "(%d)%s: cannot allocate scoreboard",
-                         errno, strerror(errno));
-            return HTTP_INTERNAL_SERVER_ERROR;
-        }
+        void *sb_mem = ap_calloc(1, scoreboard_size);
         ap_init_scoreboard(sb_mem);
     }
 

Modified: httpd/httpd/trunk/server/util.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/server/util.c?rev=1172686&r1=1172685&r2=1172686&view=diff
==============================================================================
--- httpd/httpd/trunk/server/util.c (original)
+++ httpd/httpd/trunk/server/util.c Mon Sep 19 16:25:42 2011
@@ -2583,3 +2583,36 @@ AP_DECLARE(void) ap_varbuf_free(struct a
     }
     vb->buf = NULL;
 }
+
+#define OOM_MESSAGE "[crit] Memory allocation failed, " \
+        "aborting process." APR_EOL_STR
+
+AP_DECLARE(void) ap_abort_on_oom()
+{
+    write(STDERR_FILENO, OOM_MESSAGE, strlen(OOM_MESSAGE));
+    abort();
+}
+
+AP_DECLARE(void *) ap_malloc(size_t size)
+{
+    void *p = malloc(size);
+    if (p == NULL && size != 0)
+        ap_abort_on_oom();
+    return p;
+}
+
+AP_DECLARE(void *) ap_calloc(size_t nelem, size_t size)
+{
+    void *p = calloc(nelem, size);
+    if (p == NULL && nelem != 0 && size != 0)
+        ap_abort_on_oom();
+    return p;
+}
+
+AP_DECLARE(void *) ap_realloc(void *ptr, size_t size)
+{
+    void *p = realloc(ptr, size);
+    if (p == NULL && size != 0)
+        ap_abort_on_oom();
+    return p;
+}



Re: svn commit: r1172686 - in /httpd/httpd/trunk: ./ include/ modules/cache/ modules/examples/ modules/proxy/ modules/ssl/ server/ server/mpm/event/ server/mpm/worker/

Posted by Stefan Fritsch <sf...@sfritsch.de>.
On Monday 19 September 2011, Stefan Fritsch wrote:
> On Monday 19 September 2011, William A. Rowe Jr. wrote:
> > On 9/19/2011 1:20 PM, Stefan Fritsch wrote:
> > > Besides, aborting with an error message is exactly what we do
> > > if an allocation from a pool fails (via the pool abort
> > > function). So why handle malloc differently?
> > 
> > We install a pool abort function in httpd?
> 
> Yes, in main.c. But only in trunk, not in 2.2.x.

Found some discussion:

http://mail-archives.apache.org/mod_mbox/httpd-
dev/200605.mbox/%3C20060510120403.GB13454@redhat.com%3E


Re: svn commit: r1172686 - in /httpd/httpd/trunk: ./ include/ modules/cache/ modules/examples/ modules/proxy/ modules/ssl/ server/ server/mpm/event/ server/mpm/worker/

Posted by Stefan Fritsch <sf...@sfritsch.de>.
On Monday 19 September 2011, William A. Rowe Jr. wrote:
> On 9/19/2011 1:20 PM, Stefan Fritsch wrote:
> > Besides, aborting with an error message is exactly what we do if
> > an allocation from a pool fails (via the pool abort function).
> > So why handle malloc differently?
> 
> We install a pool abort function in httpd?

Yes, in main.c. But only in trunk, not in 2.2.x.


Re: svn commit: r1172686 - in /httpd/httpd/trunk: ./ include/ modules/cache/ modules/examples/ modules/proxy/ modules/ssl/ server/ server/mpm/event/ server/mpm/worker/

Posted by "William A. Rowe Jr." <wr...@rowe-clan.net>.
On 9/19/2011 1:20 PM, Stefan Fritsch wrote:
> 
> Besides, aborting with an error message is exactly what we do if an 
> allocation from a pool fails (via the pool abort function). So why 
> handle malloc differently?

We install a pool abort function in httpd?

Re: svn commit: r1172686 - in /httpd/httpd/trunk: ./ include/ modules/cache/ modules/examples/ modules/proxy/ modules/ssl/ server/ server/mpm/event/ server/mpm/worker/

Posted by Stefan Fritsch <sf...@sfritsch.de>.
On Monday 19 September 2011, Roy T. Fielding wrote:
> I am pretty sure that this kind of change has been vetoed numerous
> times in the past.  What has changed?

Probably nothing, except maybe the involved people. But I couldn't 
find any discussion about this (just about handling oom in APR, which 
is unrelated).

The reasons for this change are stated in the commit message. Either 
we add logging/handling code to every call of malloc and friends, or 
we make a wrapper. Just continuing is usually wrong. Even such 
seemingly innocuous things as not adding an entry to a cache in an out 
of mem situation can cause much time to be wasted for debugging. We 
had that with the LDAP cache in the past.

Besides, aborting with an error message is exactly what we do if an 
allocation from a pool fails (via the pool abort function). So why 
handle malloc differently?

> 
> ....Roy
> 
> On Sep 19, 2011, at 9:25 AM, sf@apache.org wrote:
> > Author: sf
> > Date: Mon Sep 19 16:25:42 2011
> > New Revision: 1172686
> > 
> > URL: http://svn.apache.org/viewvc?rev=1172686&view=rev
> > Log:
> > Add wrappers for malloc, calloc, realloc that check for out of
> > memory situations.  Use them in most places where malloc, and
> > friends are used. This results in clean error messages in an out
> > of memory situation instead of segfaulting or silently
> > malfunctioning. In some places, it just allows to remove some
> > logging code.
> > 
> > PR 51568, PR 51569, PR 51571.

Re: svn commit: r1172686 - in /httpd/httpd/trunk: ./ include/ modules/cache/ modules/examples/ modules/proxy/ modules/ssl/ server/ server/mpm/event/ server/mpm/worker/

Posted by "Roy T. Fielding" <fi...@gbiv.com>.
I am pretty sure that this kind of change has been vetoed numerous
times in the past.  What has changed?

....Roy

On Sep 19, 2011, at 9:25 AM, sf@apache.org wrote:

> Author: sf
> Date: Mon Sep 19 16:25:42 2011
> New Revision: 1172686
> 
> URL: http://svn.apache.org/viewvc?rev=1172686&view=rev
> Log:
> Add wrappers for malloc, calloc, realloc that check for out of memory
> situations.  Use them in most places where malloc, and friends are used.
> This results in clean error messages in an out of memory situation instead of
> segfaulting or silently malfunctioning. In some places, it just allows to
> remove some logging code.
> 
> PR 51568, PR 51569, PR 51571.
> 
> Modified:
>    httpd/httpd/trunk/CHANGES
>    httpd/httpd/trunk/include/ap_config.h
>    httpd/httpd/trunk/include/ap_mmn.h
>    httpd/httpd/trunk/include/httpd.h
>    httpd/httpd/trunk/modules/cache/cache_cache.c
>    httpd/httpd/trunk/modules/cache/cache_hash.c
>    httpd/httpd/trunk/modules/cache/cache_pqueue.c
>    httpd/httpd/trunk/modules/cache/mod_socache_dbm.c
>    httpd/httpd/trunk/modules/examples/mod_case_filter_in.c
>    httpd/httpd/trunk/modules/proxy/proxy_util.c
>    httpd/httpd/trunk/modules/ssl/ssl_util.c
>    httpd/httpd/trunk/server/config.c
>    httpd/httpd/trunk/server/main.c
>    httpd/httpd/trunk/server/mpm/event/event.c
>    httpd/httpd/trunk/server/mpm/worker/worker.c
>    httpd/httpd/trunk/server/mpm_unix.c
>    httpd/httpd/trunk/server/scoreboard.c
>    httpd/httpd/trunk/server/util.c
> 
> Modified: httpd/httpd/trunk/CHANGES
> URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/CHANGES?rev=1172686&r1=1172685&r2=1172686&view=diff
> ==============================================================================
> --- httpd/httpd/trunk/CHANGES [utf-8] (original)
> +++ httpd/httpd/trunk/CHANGES [utf-8] Mon Sep 19 16:25:42 2011
> @@ -12,6 +12,10 @@ Changes with Apache 2.3.15
>      PR 51714. [Stefan Fritsch, Jim Jagielski, Ruediger Pluem, Eric Covener,
>      <lowprio20 gmail.com>]
> 
> +  *) Add wrappers for malloc, calloc, realloc that check for out of memory
> +     situations and use them in many places. PR 51568, PR 51569, PR 51571.
> +     [Stefan Fritsch]
> +
>   *) Fix cross-compilation of mod_cgi/mod_cgid when APR_HAVE_STRUCT_RLIMIT is 
>      false but RLIMIT_* are defined.  PR51371. [Eric Covener]
> 
> 
> Modified: httpd/httpd/trunk/include/ap_config.h
> URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/include/ap_config.h?rev=1172686&r1=1172685&r2=1172686&view=diff
> ==============================================================================
> --- httpd/httpd/trunk/include/ap_config.h (original)
> +++ httpd/httpd/trunk/include/ap_config.h Mon Sep 19 16:25:42 2011
> @@ -182,4 +182,12 @@
> #define ap_func_attr_sentinel
> #endif
> 
> +#if ( defined(__GNUC__) &&                                        \
> +      (__GNUC__ >= 4 || ( __GNUC__ == 3 && __GNUC_MINOR__ >= 4))) \
> +    || __has_attribute(warn_unused_result)
> +#define ap_func_attr_warn_unused_result   __attribute__((warn_unused_result))
> +#else
> +#define ap_func_attr_warn_unused_result
> +#endif
> +
> #endif /* AP_CONFIG_H */
> 
> Modified: httpd/httpd/trunk/include/ap_mmn.h
> URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/include/ap_mmn.h?rev=1172686&r1=1172685&r2=1172686&view=diff
> ==============================================================================
> --- httpd/httpd/trunk/include/ap_mmn.h (original)
> +++ httpd/httpd/trunk/include/ap_mmn.h Mon Sep 19 16:25:42 2011
> @@ -352,6 +352,8 @@
>  * 20110724.5 (2.3.15-dev) add ap_set_accept_ranges()
>  * 20110724.6 (2.3.15-dev) add max_overlaps and max_reversals to core_dir_config
>  * 20110724.7 (2.3.15-dev) add ap_random_insecure_bytes(), ap_random_pick()
> + * 20110724.8 (2.3.15-dev) add ap_abort_on_oom(), ap_malloc(), ap_calloc(),
> + *                         ap_realloc()
>  */
> 
> #define MODULE_MAGIC_COOKIE 0x41503234UL /* "AP24" */
> @@ -359,7 +361,7 @@
> #ifndef MODULE_MAGIC_NUMBER_MAJOR
> #define MODULE_MAGIC_NUMBER_MAJOR 20110724
> #endif
> -#define MODULE_MAGIC_NUMBER_MINOR 7                    /* 0...n */
> +#define MODULE_MAGIC_NUMBER_MINOR 8                    /* 0...n */
> 
> /**
>  * Determine if the server's current MODULE_MAGIC_NUMBER is at least a
> 
> Modified: httpd/httpd/trunk/include/httpd.h
> URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/include/httpd.h?rev=1172686&r1=1172685&r2=1172686&view=diff
> ==============================================================================
> --- httpd/httpd/trunk/include/httpd.h (original)
> +++ httpd/httpd/trunk/include/httpd.h Mon Sep 19 16:25:42 2011
> @@ -2086,6 +2086,38 @@ AP_DECLARE(void) ap_random_insecure_byte
>  */
> AP_DECLARE(apr_uint32_t) ap_random_pick(apr_uint32_t min, apr_uint32_t max);
> 
> +/**
> + * Abort with a error message signifying out of memory
> + */
> +AP_DECLARE(void) ap_abort_on_oom(void) __attribute__((noreturn));
> +
> +/**
> + * Wrapper for malloc() that calls ap_abort_on_oom() if out of memory
> + * @param size size of the memory block
> + * @return pointer to the allocated memory
> + * @note ap_malloc may be implemented as a macro
> + */
> +AP_DECLARE(void *) ap_malloc(size_t size) __attribute__((malloc));
> +
> +/**
> + * Wrapper for calloc() that calls ap_abort_on_oom() if out of memory
> + * @param nelem number of elements to allocate memory for
> + * @param size size of a single element
> + * @return pointer to the allocated memory
> + * @note ap_calloc may be implemented as a macro
> + */
> +AP_DECLARE(void *) ap_calloc(size_t nelem, size_t size) __attribute__((malloc));
> +
> +/**
> + * Wrapper for realloc() that calls ap_abort_on_oom() if out of memory
> + * @param ptr pointer to the old memory block (or NULL)
> + * @param size new size of the memory block
> + * @return pointer to the reallocated memory
> + * @note ap_realloc may be implemented as a macro
> + */
> +AP_DECLARE(void *) ap_realloc(void *ptr, size_t size)
> +                   ap_func_attr_warn_unused_result;
> +
> 
> #define AP_NORESTART APR_OS_START_USEERR + 1
> 
> 
> Modified: httpd/httpd/trunk/modules/cache/cache_cache.c
> URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/cache/cache_cache.c?rev=1172686&r1=1172685&r2=1172686&view=diff
> ==============================================================================
> --- httpd/httpd/trunk/modules/cache/cache_cache.c (original)
> +++ httpd/httpd/trunk/modules/cache/cache_cache.c Mon Sep 19 16:25:42 2011
> @@ -58,7 +58,7 @@ cache_cache_t* cache_init(int max_entrie
>                                          cache_cache_free *free_entry)
> {
>     cache_cache_t *tmp;
> -    tmp = malloc(sizeof(cache_cache_t));
> +    tmp = ap_malloc(sizeof(cache_cache_t));
>     tmp->max_entries = max_entries;
>     tmp->max_size = max_size;
>     tmp->current_size = 0;
> 
> Modified: httpd/httpd/trunk/modules/cache/cache_hash.c
> URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/cache/cache_hash.c?rev=1172686&r1=1172685&r2=1172686&view=diff
> ==============================================================================
> --- httpd/httpd/trunk/modules/cache/cache_hash.c (original)
> +++ httpd/httpd/trunk/modules/cache/cache_hash.c Mon Sep 19 16:25:42 2011
> @@ -77,23 +77,16 @@ struct cache_hash_t {
>  */
> static cache_hash_entry_t **alloc_array(cache_hash_t *ht, int max)
> {
> -   return calloc(1, sizeof(*ht->array) * (max + 1));
> +   return ap_calloc(1, sizeof(*ht->array) * (max + 1));
> }
> 
> cache_hash_t* cache_hash_make(apr_size_t size)
> {
>     cache_hash_t *ht;
> -    ht = malloc(sizeof(cache_hash_t));
> -    if (!ht) {
> -        return NULL;
> -    }
> +    ht = ap_malloc(sizeof(cache_hash_t));
>     ht->count = 0;
>     ht->max = size;
>     ht->array = alloc_array(ht, ht->max);
> -    if (!ht->array) {
> -        free(ht);
> -        return NULL;
> -    }
>     return ht;
> }
> 
> @@ -226,10 +219,7 @@ static cache_hash_entry_t **find_entry(c
>     if (he || !val)
>         return hep;
>     /* add a new entry for non-NULL values */
> -    he = malloc(sizeof(*he));
> -    if (!he) {
> -        return NULL;
> -    }
> +    he = ap_malloc(sizeof(*he));
>     he->next = NULL;
>     he->hash = hash;
>     he->key  = key;
> @@ -260,8 +250,7 @@ void* cache_hash_set(cache_hash_t *ht,
>     cache_hash_entry_t **hep, *tmp;
>     const void *tval;
>     hep = find_entry(ht, key, klen, val);
> -    /* If hep == NULL, then the malloc() in find_entry failed */
> -    if (hep && *hep) {
> +    if (*hep) {
>         if (!val) {
>             /* delete entry */
>             tval = (*hep)->val;
> 
> Modified: httpd/httpd/trunk/modules/cache/cache_pqueue.c
> URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/cache/cache_pqueue.c?rev=1172686&r1=1172685&r2=1172686&view=diff
> ==============================================================================
> --- httpd/httpd/trunk/modules/cache/cache_pqueue.c (original)
> +++ httpd/httpd/trunk/modules/cache/cache_pqueue.c Mon Sep 19 16:25:42 2011
> @@ -50,17 +50,9 @@ cache_pqueue_t *cache_pq_init(apr_ssize_
>                               cache_pqueue_getpos get,
>                               cache_pqueue_setpos set)
> {
> -    cache_pqueue_t *q;
> -
> -    if (!(q = malloc(sizeof(cache_pqueue_t)))) {
> -        return NULL;
> -    }
> -
> +    cache_pqueue_t *q = ap_malloc(sizeof(cache_pqueue_t));
>     /* Need to allocate n+1 elements since element 0 isn't used. */
> -    if (!(q->d = malloc(sizeof(void*) * (n+1)))) {
> -        free(q);
> -        return NULL;
> -    }
> +    q->d = ap_malloc(sizeof(void*) * (n+1));
>     q->avail = q->step = (n+1);  /* see comment above about n+1 */
>     q->pri = pri;
>     q->size = 1;
> @@ -148,7 +140,7 @@ apr_status_t cache_pq_insert(cache_pqueu
>     /* allocate more memory if necessary */
>     if (q->size >= q->avail) {
>         newsize = q->size + q->step;
> -        if (!(tmp = realloc(q->d, sizeof(void*) * newsize))) {
> +        if (!(tmp = ap_realloc(q->d, sizeof(void*) * newsize))) {
>             return APR_EGENERAL;
>         };
>         q->d = tmp;
> 
> Modified: httpd/httpd/trunk/modules/cache/mod_socache_dbm.c
> URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/cache/mod_socache_dbm.c?rev=1172686&r1=1172685&r2=1172686&view=diff
> ==============================================================================
> --- httpd/httpd/trunk/modules/cache/mod_socache_dbm.c (original)
> +++ httpd/httpd/trunk/modules/cache/mod_socache_dbm.c Mon Sep 19 16:25:42 2011
> @@ -210,12 +210,7 @@ static apr_status_t socache_dbm_store(ap
> 
>     /* create DBM value */
>     dbmval.dsize = sizeof(apr_time_t) + nData;
> -    dbmval.dptr  = (char *)malloc(dbmval.dsize);
> -    if (dbmval.dptr == NULL) {
> -        ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s,
> -                 "malloc error creating DBM value");
> -        return APR_ENOMEM;
> -    }
> +    dbmval.dptr  = (char *)ap_malloc(dbmval.dsize);
>     memcpy((char *)dbmval.dptr, &expiry, sizeof(apr_time_t));
>     memcpy((char *)dbmval.dptr+sizeof(apr_time_t), ucaData, nData);
> 
> 
> Modified: httpd/httpd/trunk/modules/examples/mod_case_filter_in.c
> URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/examples/mod_case_filter_in.c?rev=1172686&r1=1172685&r2=1172686&view=diff
> ==============================================================================
> --- httpd/httpd/trunk/modules/examples/mod_case_filter_in.c (original)
> +++ httpd/httpd/trunk/modules/examples/mod_case_filter_in.c Mon Sep 19 16:25:42 2011
> @@ -109,7 +109,7 @@ static apr_status_t CaseFilterInFilter(a
>         if(ret != APR_SUCCESS)
>             return ret;
> 
> -        buf = malloc(len);
> +        buf = ap_malloc(len);
>         for(n=0 ; n < len ; ++n)
>             buf[n] = apr_toupper(data[n]);
> 
> 
> Modified: httpd/httpd/trunk/modules/proxy/proxy_util.c
> URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/proxy/proxy_util.c?rev=1172686&r1=1172685&r2=1172686&view=diff
> ==============================================================================
> --- httpd/httpd/trunk/modules/proxy/proxy_util.c (original)
> +++ httpd/httpd/trunk/modules/proxy/proxy_util.c Mon Sep 19 16:25:42 2011
> @@ -1384,7 +1384,7 @@ PROXY_DECLARE(char *) ap_proxy_define_ba
>     (*balancer)->lbmethod = lbmethod;
> 
>     if (do_malloc)
> -        bshared = malloc(sizeof(proxy_balancer_shared));
> +        bshared = ap_malloc(sizeof(proxy_balancer_shared));
>     else
>         bshared = apr_palloc(p, sizeof(proxy_balancer_shared));
> 
> @@ -1798,7 +1798,7 @@ PROXY_DECLARE(char *) ap_proxy_define_wo
>      * if called during config, we don't have shm setup yet,
>      * so just note the info for later. */
>     if (do_malloc)
> -        wshared = malloc(sizeof(proxy_worker_shared));  /* will be freed ap_proxy_share_worker */
> +        wshared = ap_malloc(sizeof(proxy_worker_shared));  /* will be freed ap_proxy_share_worker */
>     else
>         wshared = apr_palloc(p, sizeof(proxy_worker_shared));
> 
> 
> Modified: httpd/httpd/trunk/modules/ssl/ssl_util.c
> URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/ssl/ssl_util.c?rev=1172686&r1=1172685&r2=1172686&view=diff
> ==============================================================================
> --- httpd/httpd/trunk/modules/ssl/ssl_util.c (original)
> +++ httpd/httpd/trunk/modules/ssl/ssl_util.c Mon Sep 19 16:25:42 2011
> @@ -213,14 +213,14 @@ unsigned char *ssl_asn1_table_set(apr_ha
>         }
>     }
>     else {
> -        asn1 = malloc(sizeof(*asn1));
> +        asn1 = ap_malloc(sizeof(*asn1));
>         asn1->source_mtime = 0; /* used as a note for encrypted private keys */
>         asn1->cpData = NULL;
>     }
> 
>     asn1->nData = length;
>     if (!asn1->cpData) {
> -        asn1->cpData = malloc(length);
> +        asn1->cpData = ap_malloc(length);
>     }
> 
>     apr_hash_set(table, key, klen, asn1);
> 
> Modified: httpd/httpd/trunk/server/config.c
> URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/server/config.c?rev=1172686&r1=1172685&r2=1172686&view=diff
> ==============================================================================
> --- httpd/httpd/trunk/server/config.c (original)
> +++ httpd/httpd/trunk/server/config.c Mon Sep 19 16:25:42 2011
> @@ -772,10 +772,10 @@ AP_DECLARE(const char *) ap_setup_prelin
>     ap_loaded_modules = (module **)apr_palloc(process->pool,
>         sizeof(module *) * conf_vector_length);
>     if (!ap_module_short_names)
> -        ap_module_short_names = calloc(sizeof(char *), conf_vector_length);
> +        ap_module_short_names = ap_calloc(sizeof(char *), conf_vector_length);
> 
>     if (!merger_func_cache)
> -        merger_func_cache = calloc(sizeof(merger_func), conf_vector_length);
> +        merger_func_cache = ap_calloc(sizeof(merger_func), conf_vector_length);
> 
>     if (ap_loaded_modules == NULL || ap_module_short_names == NULL
>         || merger_func_cache == NULL)
> 
> Modified: httpd/httpd/trunk/server/main.c
> URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/server/main.c?rev=1172686&r1=1172685&r2=1172686&view=diff
> ==============================================================================
> --- httpd/httpd/trunk/server/main.c (original)
> +++ httpd/httpd/trunk/server/main.c Mon Sep 19 16:25:42 2011
> @@ -265,14 +265,10 @@ static void destroy_and_exit_process(pro
>     exit(process_exit_value);
> }
> 
> -#define OOM_MESSAGE "[crit] Memory allocation failed, " \
> -    "aborting process." APR_EOL_STR
> -
> /* APR callback invoked if allocation fails. */
> static int abort_on_oom(int retcode)
> {
> -    write(STDERR_FILENO, OOM_MESSAGE, strlen(OOM_MESSAGE));
> -    abort();
> +    ap_abort_on_oom();
>     return retcode; /* unreachable, hopefully. */
> }
> 
> 
> Modified: httpd/httpd/trunk/server/mpm/event/event.c
> URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/server/mpm/event/event.c?rev=1172686&r1=1172685&r2=1172686&view=diff
> ==============================================================================
> --- httpd/httpd/trunk/server/mpm/event/event.c (original)
> +++ httpd/httpd/trunk/server/mpm/event/event.c Mon Sep 19 16:25:42 2011
> @@ -1007,7 +1007,7 @@ static apr_status_t s_socket_add(void *u
> {
>     s_baton_t *s = (s_baton_t*)user_baton;
>     /* XXXXX: recycle listener_poll_types */
> -    listener_poll_type *pt = malloc(sizeof(*pt));
> +    listener_poll_type *pt = ap_malloc(sizeof(*pt));
>     pt->type = PT_SERF;
>     pt->baton = serf_baton;
>     pfd->client_data = pt;
> @@ -1187,7 +1187,7 @@ static apr_status_t event_register_timed
>     }
>     else {
>         /* XXXXX: lol, pool allocation without a context from any thread.Yeah. Right. MPMs Suck. */
> -        te = malloc(sizeof(timer_event_t));
> +        te = ap_malloc(sizeof(timer_event_t));
>         APR_RING_ELEM_INIT(te, link);
>     }
> 
> @@ -1766,7 +1766,7 @@ static void create_listener_thread(threa
>     proc_info *my_info;
>     apr_status_t rv;
> 
> -    my_info = (proc_info *) malloc(sizeof(proc_info));
> +    my_info = (proc_info *) ap_malloc(sizeof(proc_info));
>     my_info->pid = my_child_num;
>     my_info->tid = -1;          /* listener thread doesn't have a thread slot */
>     my_info->sd = 0;
> @@ -1865,12 +1865,7 @@ static void *APR_THREAD_FUNC start_threa
>                 continue;
>             }
> 
> -            my_info = (proc_info *) malloc(sizeof(proc_info));
> -            if (my_info == NULL) {
> -                ap_log_error(APLOG_MARK, APLOG_ALERT, errno, ap_server_conf,
> -                             "malloc: out of memory");
> -                clean_child_exit(APEXIT_CHILDFATAL);
> -            }
> +            my_info = (proc_info *) ap_malloc(sizeof(proc_info));
>             my_info->pid = my_child_num;
>             my_info->tid = i;
>             my_info->sd = 0;
> @@ -2047,16 +2042,8 @@ static void child_main(int child_num_arg
>     /* clear the storage; we may not create all our threads immediately,
>      * and we want a 0 entry to indicate a thread which was not created
>      */
> -    threads = (apr_thread_t **) calloc(1,
> -                                       sizeof(apr_thread_t *) *
> -                                       threads_per_child);
> -    if (threads == NULL) {
> -        ap_log_error(APLOG_MARK, APLOG_ALERT, errno, ap_server_conf,
> -                     "malloc: out of memory");
> -        clean_child_exit(APEXIT_CHILDFATAL);
> -    }
> -
> -    ts = (thread_starter *) apr_palloc(pchild, sizeof(*ts));
> +    threads = ap_calloc(threads_per_child, sizeof(apr_thread_t *));
> +    ts = apr_palloc(pchild, sizeof(*ts));
> 
>     apr_threadattr_create(&thread_attr, pchild);
>     /* 0 means PTHREAD_CREATE_JOINABLE */
> 
> Modified: httpd/httpd/trunk/server/mpm/worker/worker.c
> URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/server/mpm/worker/worker.c?rev=1172686&r1=1172685&r2=1172686&view=diff
> ==============================================================================
> --- httpd/httpd/trunk/server/mpm/worker/worker.c (original)
> +++ httpd/httpd/trunk/server/mpm/worker/worker.c Mon Sep 19 16:25:42 2011
> @@ -1006,7 +1006,7 @@ static void create_listener_thread(threa
>     proc_info *my_info;
>     apr_status_t rv;
> 
> -    my_info = (proc_info *)malloc(sizeof(proc_info));
> +    my_info = (proc_info *)ap_malloc(sizeof(proc_info));
>     my_info->pid = my_child_num;
>     my_info->tid = -1; /* listener thread doesn't have a thread slot */
>     my_info->sd = 0;
> @@ -1072,12 +1072,7 @@ static void * APR_THREAD_FUNC start_thre
>                 continue;
>             }
> 
> -            my_info = (proc_info *)malloc(sizeof(proc_info));
> -            if (my_info == NULL) {
> -                ap_log_error(APLOG_MARK, APLOG_ALERT, errno, ap_server_conf,
> -                             "malloc: out of memory");
> -                clean_child_exit(APEXIT_CHILDFATAL);
> -            }
> +            my_info = (proc_info *)ap_malloc(sizeof(proc_info));
>             my_info->pid = my_child_num;
>             my_info->tid = i;
>             my_info->sd = 0;
> @@ -1271,14 +1266,8 @@ static void child_main(int child_num_arg
>     /* clear the storage; we may not create all our threads immediately,
>      * and we want a 0 entry to indicate a thread which was not created
>      */
> -    threads = (apr_thread_t **)calloc(1,
> -                                sizeof(apr_thread_t *) * threads_per_child);
> -    if (threads == NULL) {
> -        ap_log_error(APLOG_MARK, APLOG_ALERT, errno, ap_server_conf,
> -                     "malloc: out of memory");
> -        clean_child_exit(APEXIT_CHILDFATAL);
> -    }
> -
> +    threads = (apr_thread_t **)ap_calloc(1,
> +                                  sizeof(apr_thread_t *) * threads_per_child);
>     ts = (thread_starter *)apr_palloc(pchild, sizeof(*ts));
> 
>     apr_threadattr_create(&thread_attr, pchild);
> 
> Modified: httpd/httpd/trunk/server/mpm_unix.c
> URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/server/mpm_unix.c?rev=1172686&r1=1172685&r2=1172686&view=diff
> ==============================================================================
> --- httpd/httpd/trunk/server/mpm_unix.c (original)
> +++ httpd/httpd/trunk/server/mpm_unix.c Mon Sep 19 16:25:42 2011
> @@ -75,7 +75,7 @@ static extra_process_t *extras;
> 
> void ap_register_extra_mpm_process(pid_t pid, ap_generation_t gen)
> {
> -    extra_process_t *p = (extra_process_t *)malloc(sizeof(extra_process_t));
> +    extra_process_t *p = (extra_process_t *)ap_malloc(sizeof(extra_process_t));
> 
>     p->next = extras;
>     p->pid = pid;
> 
> Modified: httpd/httpd/trunk/server/scoreboard.c
> URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/server/scoreboard.c?rev=1172686&r1=1172685&r2=1172686&view=diff
> ==============================================================================
> --- httpd/httpd/trunk/server/scoreboard.c (original)
> +++ httpd/httpd/trunk/server/scoreboard.c Mon Sep 19 16:25:42 2011
> @@ -149,7 +149,7 @@ void ap_init_scoreboard(void *shared_sco
> 
>     ap_calc_scoreboard_size();
>     ap_scoreboard_image =
> -        calloc(1, sizeof(scoreboard) + server_limit * sizeof(worker_score *));
> +        ap_calloc(1, sizeof(scoreboard) + server_limit * sizeof(worker_score *));
>     more_storage = shared_score;
>     ap_scoreboard_image->global = (global_score *)more_storage;
>     more_storage += sizeof(global_score);
> @@ -325,13 +325,7 @@ int ap_create_scoreboard(apr_pool_t *p, 
> #endif
>     {
>         /* A simple malloc will suffice */
> -        void *sb_mem = calloc(1, scoreboard_size);
> -        if (sb_mem == NULL) {
> -            ap_log_error(APLOG_MARK, APLOG_CRIT, 0, ap_server_conf,
> -                         "(%d)%s: cannot allocate scoreboard",
> -                         errno, strerror(errno));
> -            return HTTP_INTERNAL_SERVER_ERROR;
> -        }
> +        void *sb_mem = ap_calloc(1, scoreboard_size);
>         ap_init_scoreboard(sb_mem);
>     }
> 
> 
> Modified: httpd/httpd/trunk/server/util.c
> URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/server/util.c?rev=1172686&r1=1172685&r2=1172686&view=diff
> ==============================================================================
> --- httpd/httpd/trunk/server/util.c (original)
> +++ httpd/httpd/trunk/server/util.c Mon Sep 19 16:25:42 2011
> @@ -2583,3 +2583,36 @@ AP_DECLARE(void) ap_varbuf_free(struct a
>     }
>     vb->buf = NULL;
> }
> +
> +#define OOM_MESSAGE "[crit] Memory allocation failed, " \
> +        "aborting process." APR_EOL_STR
> +
> +AP_DECLARE(void) ap_abort_on_oom()
> +{
> +    write(STDERR_FILENO, OOM_MESSAGE, strlen(OOM_MESSAGE));
> +    abort();
> +}
> +
> +AP_DECLARE(void *) ap_malloc(size_t size)
> +{
> +    void *p = malloc(size);
> +    if (p == NULL && size != 0)
> +        ap_abort_on_oom();
> +    return p;
> +}
> +
> +AP_DECLARE(void *) ap_calloc(size_t nelem, size_t size)
> +{
> +    void *p = calloc(nelem, size);
> +    if (p == NULL && nelem != 0 && size != 0)
> +        ap_abort_on_oom();
> +    return p;
> +}
> +
> +AP_DECLARE(void *) ap_realloc(void *ptr, size_t size)
> +{
> +    void *p = realloc(ptr, size);
> +    if (p == NULL && size != 0)
> +        ap_abort_on_oom();
> +    return p;
> +}
> 
>