summaryrefslogtreecommitdiff
path: root/memory
diff options
context:
space:
mode:
authorStefan Fritsch <sf@apache.org>2013-01-26 18:44:29 +0000
committerStefan Fritsch <sf@apache.org>2013-01-26 18:44:29 +0000
commit9257d6c7a193f152b17448304ef2de9ae6db5a3f (patch)
tree078ed2f727b2b0f53c4abb2156f993310bd2e59b /memory
parentcb233523f9bad453c7437950aa5bade3efb019bd (diff)
downloadapr-9257d6c7a193f152b17448304ef2de9ae6db5a3f.tar.gz
Don't leak memnodes in apr_pvsprintf() if out of memory and no pool abort
function is set. git-svn-id: https://svn.apache.org/repos/asf/apr/apr/trunk@1438940 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'memory')
-rw-r--r--memory/unix/apr_pools.c26
1 files changed, 13 insertions, 13 deletions
diff --git a/memory/unix/apr_pools.c b/memory/unix/apr_pools.c
index da8b21225..d6af9b210 100644
--- a/memory/unix/apr_pools.c
+++ b/memory/unix/apr_pools.c
@@ -1147,21 +1147,12 @@ APR_DECLARE(char *) apr_pvsprintf(apr_pool_t *pool, const char *fmt, va_list ap)
* room to hold the NUL terminator.
*/
if (ps.node->first_avail == ps.node->endp) {
- if (psprintf_flush(&ps.vbuff) == -1) {
- if (pool->abort_fn) {
- pool->abort_fn(APR_ENOMEM);
- }
-
- return NULL;
- }
+ if (psprintf_flush(&ps.vbuff) == -1)
+ goto error;
}
- if (apr_vformatter(psprintf_flush, &ps.vbuff, fmt, ap) == -1) {
- if (pool->abort_fn)
- pool->abort_fn(APR_ENOMEM);
-
- return NULL;
- }
+ if (apr_vformatter(psprintf_flush, &ps.vbuff, fmt, ap) == -1)
+ goto error;
strp = ps.vbuff.curpos;
*strp++ = '\0';
@@ -1207,6 +1198,15 @@ APR_DECLARE(char *) apr_pvsprintf(apr_pool_t *pool, const char *fmt, va_list ap)
list_insert(active, node);
return strp;
+
+error:
+ if (pool->abort_fn)
+ pool->abort_fn(APR_ENOMEM);
+ if (ps.got_a_new_node) {
+ ps.node->next = ps.free;
+ allocator_free(pool->allocator, ps.node);
+ }
+ return NULL;
}