summaryrefslogtreecommitdiff
path: root/pjlib
diff options
context:
space:
mode:
authorNanang Izzuddin <nanang@teluu.com>2012-11-22 05:00:01 +0000
committerNanang Izzuddin <nanang@teluu.com>2012-11-22 05:00:01 +0000
commitaa8a3b9e20ce37f09abfe1336b335a5f93d713c2 (patch)
treee47edabd8ea97aabfb994172c0cead2be296803d /pjlib
parent59950a526565b533cd1bd7e7216843f3cb2cc483 (diff)
Fix #1593: avoid wrap around in caching pool capacity value.
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@4298 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjlib')
-rw-r--r--pjlib/include/pj/pool.h2
-rw-r--r--pjlib/include/pj/pool_i.h2
-rw-r--r--pjlib/src/pj/pool.c4
-rw-r--r--pjlib/src/pj/pool_caching.c8
4 files changed, 10 insertions, 6 deletions
diff --git a/pjlib/include/pj/pool.h b/pjlib/include/pj/pool.h
index 96c6de3b..3e9c76d5 100644
--- a/pjlib/include/pj/pool.h
+++ b/pjlib/include/pj/pool.h
@@ -509,7 +509,7 @@ PJ_INLINE(void*) pj_pool_zalloc(pj_pool_t *pool, pj_size_t size)
* Internal functions
*/
PJ_IDECL(void*) pj_pool_alloc_from_block(pj_pool_block *block, pj_size_t size);
-PJ_DECL(void*) pj_pool_allocate_find(pj_pool_t *pool, unsigned size);
+PJ_DECL(void*) pj_pool_allocate_find(pj_pool_t *pool, pj_size_t size);
diff --git a/pjlib/include/pj/pool_i.h b/pjlib/include/pj/pool_i.h
index 54621969..2f5d407c 100644
--- a/pjlib/include/pj/pool_i.h
+++ b/pjlib/include/pj/pool_i.h
@@ -47,7 +47,7 @@ PJ_IDEF(void*) pj_pool_alloc_from_block( pj_pool_block *block, pj_size_t size )
if (size & (PJ_POOL_ALIGNMENT-1)) {
size = (size + PJ_POOL_ALIGNMENT) & ~(PJ_POOL_ALIGNMENT-1);
}
- if ((unsigned)(block->end - block->cur) >= size) {
+ if ((pj_size_t)(block->end - block->cur) >= size) {
void *ptr = block->cur;
block->cur += size;
return ptr;
diff --git a/pjlib/src/pj/pool.c b/pjlib/src/pj/pool.c
index ff2aa1a6..623acd9c 100644
--- a/pjlib/src/pj/pool.c
+++ b/pjlib/src/pj/pool.c
@@ -88,7 +88,7 @@ static pj_pool_block *pj_pool_create_block( pj_pool_t *pool, pj_size_t size)
* If no space is available in all the blocks, a new block might be created
* (depending on whether the pool is allowed to resize).
*/
-PJ_DEF(void*) pj_pool_allocate_find(pj_pool_t *pool, unsigned size)
+PJ_DEF(void*) pj_pool_allocate_find(pj_pool_t *pool, pj_size_t size)
{
pj_pool_block *block = pool->block_list.next;
void *p;
@@ -121,7 +121,7 @@ PJ_DEF(void*) pj_pool_allocate_find(pj_pool_t *pool, unsigned size)
if (pool->increment_size <
size + sizeof(pj_pool_block) + PJ_POOL_ALIGNMENT)
{
- unsigned count;
+ pj_size_t count;
count = (size + pool->increment_size + sizeof(pj_pool_block) +
PJ_POOL_ALIGNMENT) /
pool->increment_size;
diff --git a/pjlib/src/pj/pool_caching.c b/pjlib/src/pj/pool_caching.c
index 1e753025..763e9b04 100644
--- a/pjlib/src/pj/pool_caching.c
+++ b/pjlib/src/pj/pool_caching.c
@@ -178,7 +178,11 @@ static pj_pool_t* cpool_create_pool(pj_pool_factory *pf,
pj_pool_init_int(pool, name, increment_sz, callback);
/* Update pool manager's free capacity. */
- cp->capacity -= pj_pool_get_capacity(pool);
+ if (cp->capacity > pj_pool_get_capacity(pool)) {
+ cp->capacity -= pj_pool_get_capacity(pool);
+ } else {
+ cp->capacity = 0;
+ }
PJ_LOG(6, (pool->obj_name, "pool reused, size=%u", pool->capacity));
}
@@ -199,7 +203,7 @@ static pj_pool_t* cpool_create_pool(pj_pool_factory *pf,
static void cpool_release_pool( pj_pool_factory *pf, pj_pool_t *pool)
{
pj_caching_pool *cp = (pj_caching_pool*)pf;
- unsigned pool_capacity;
+ pj_size_t pool_capacity;
unsigned i;
PJ_CHECK_STACK();