httpd-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From dave b <db.pub.m...@gmail.com>
Subject rational behind not checking the return value of apr_palloc and apr_pcalloc
Date Wed, 01 Sep 2010 04:07:25 GMT
What is the rational behind not checking the return value of
apr_palloc and apr_pcalloc?


code memory/unix/apr_pools.c from apr-1.4.2
APR_DECLARE(void *) apr_pcalloc(apr_pool_t *pool, apr_size_t size);
APR_DECLARE(void *) apr_pcalloc(apr_pool_t *pool, apr_size_t size)
{
    void *mem;

    if ((mem = apr_palloc(pool, size)) != NULL) {
        memset(mem, 0, size);
    }

    return mem;
}

and
apr_palloc can return NULL.
So I modified the code and the testdir test failed in one place ->

"    node = active->next;
    if (size <= node_free_space(node)) {
        list_remove(node);
    }
    else {
        if ((node = allocator_alloc(pool->allocator, size)) == NULL) {
            if (pool->abort_fn)
                pool->abort_fn(APR_ENOMEM); /* HERE */

            return NULL;
        }
    }

When you run the testdir (test). If you change the above to be:


.....
        if ((node = allocator_alloc(pool->allocator, size)) == NULL) {
            if (!   pool->abort_fn) /* note the ! added */
                pool->abort_fn(APR_ENOMEM);

            return NULL; /* you end up here */
        }
    }
and you will fail one of the tests. This to me suggests that this scenario is
possible if the pool is like that one failed test *but* pool->abort_fn is not
true :)
"

So what is the rational behind most users of these method *not*
checking the return code - because from what I have seen / know it is
possible return NULL.

Also see:  https://issues.apache.org/bugzilla/show_bug.cgi?id=49847

Mime
View raw message