summaryrefslogtreecommitdiff
path: root/pjlib/src/pj/pool_policy_new.cpp
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2007-06-01 07:26:21 +0000
committerBenny Prijono <bennylp@teluu.com>2007-06-01 07:26:21 +0000
commit411ab3b5701824a5e2806117049952f5ad2654aa (patch)
tree490a69dafe78baf27a8878a4a986d95804298f05 /pjlib/src/pj/pool_policy_new.cpp
parent01ab9abb169648315c02118e3b6cc3747f639e2e (diff)
Implement ticket #314: Added PJ_SAFE_POOL configuration in PJLIB to track down memory corruptions
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@1333 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjlib/src/pj/pool_policy_new.cpp')
-rw-r--r--pjlib/src/pj/pool_policy_new.cpp24
1 files changed, 23 insertions, 1 deletions
diff --git a/pjlib/src/pj/pool_policy_new.cpp b/pjlib/src/pj/pool_policy_new.cpp
index 367be0f3..82374adc 100644
--- a/pjlib/src/pj/pool_policy_new.cpp
+++ b/pjlib/src/pj/pool_policy_new.cpp
@@ -25,15 +25,28 @@
/*
* This file contains pool default policy definition and implementation.
*/
+#include "pool_signature.h"
static void *operator_new(pj_pool_factory *factory, pj_size_t size)
{
+ void *mem;
+
PJ_CHECK_STACK();
PJ_UNUSED_ARG(factory);
PJ_UNUSED_ARG(size);
- return new char[size];
+ mem = (void*) new char[size+(SIG_SIZE << 1)];
+
+ /* Exception for new operator may be disabled, so.. */
+ if (mem) {
+ /* Apply signature when PJ_SAFE_POOL is set. It will move
+ * "mem" pointer forward.
+ */
+ APPLY_SIG(mem, size);
+ }
+
+ return mem;
}
static void operator_delete(pj_pool_factory *factory, void *mem, pj_size_t size)
@@ -42,6 +55,15 @@ static void operator_delete(pj_pool_factory *factory, void *mem, pj_size_t size)
PJ_UNUSED_ARG(factory);
PJ_UNUSED_ARG(size);
+ /* Check and remove signature when PJ_SAFE_POOL is set. It will
+ * move "mem" pointer backward.
+ */
+ REMOVE_SIG(mem, size);
+
+ /* Note that when PJ_SAFE_POOL is set, the actual size of the block
+ * is size + SIG_SIZE*2.
+ */
+
char *p = (char*)mem;
delete [] p;
}