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, s...@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; > +} > >