You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by rh...@apache.org on 2011/08/09 00:36:16 UTC
svn commit: r1155131 - /subversion/trunk/subversion/libsvn_ra_serf/util.c
Author: rhuijben
Date: Mon Aug 8 22:36:16 2011
New Revision: 1155131
URL: http://svn.apache.org/viewvc?rev=1155131&view=rev
Log:
In ra_serf: cleanup the xml parser via pool cleanup to avoid leaking the memory
used by the parser on errors and when cancelling the operation.
* subversion/libsvn_ra_serf/util.c
(xml_parser_cleanup): New function.
(svn_ra_serf__process_pending): Cleanup the parser via the pool cleanup.
(svn_ra_serf__handle_xml_parser): Register pool cleanup handler when creating
the parser. If done cleanup the parser via pool cleanup.
Modified:
subversion/trunk/subversion/libsvn_ra_serf/util.c
Modified: subversion/trunk/subversion/libsvn_ra_serf/util.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_ra_serf/util.c?rev=1155131&r1=1155130&r2=1155131&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_ra_serf/util.c (original)
+++ subversion/trunk/subversion/libsvn_ra_serf/util.c Mon Aug 8 22:36:16 2011
@@ -1497,6 +1497,21 @@ inject_to_parser(svn_ra_serf__xml_parser
return SVN_NO_ERROR;
}
+/* Apr pool cleanup handler to release an XML_Parser in success and error
+ conditions */
+static apr_status_t
+xml_parser_cleanup(void *baton)
+{
+ XML_Parser *xmlp = baton;
+
+ if (*xmlp)
+ {
+ XML_ParserFree(*xmlp);
+ *xmlp = NULL;
+ }
+
+ return APR_SUCCESS;
+}
svn_error_t *
svn_ra_serf__process_pending(svn_ra_serf__xml_parser_t *parser,
@@ -1633,7 +1648,7 @@ svn_ra_serf__process_pending(svn_ra_serf
return status. We just don't care. */
(void) XML_Parse(parser->xmlp, NULL, 0, 1);
- XML_ParserFree(parser->xmlp);
+ apr_pool_cleanup_run(parser->pool, &parser->xmlp, xml_parser_cleanup);
parser->xmlp = NULL;
add_done_item(parser);
}
@@ -1693,6 +1708,8 @@ svn_ra_serf__handle_xml_parser(serf_requ
if (!ctx->xmlp)
{
ctx->xmlp = XML_ParserCreate(NULL);
+ apr_pool_cleanup_register(ctx->pool, &ctx->xmlp, xml_parser_cleanup,
+ apr_pool_cleanup_null);
XML_SetUserData(ctx->xmlp, ctx);
XML_SetElementHandler(ctx->xmlp, start_xml, end_xml);
if (ctx->cdata)
@@ -1783,8 +1800,7 @@ svn_ra_serf__handle_xml_parser(serf_requ
{
SVN_ERR_ASSERT(ctx->xmlp != NULL);
- XML_ParserFree(ctx->xmlp);
- ctx->xmlp = NULL;
+ apr_pool_cleanup_run(ctx->pool, &ctx->xmlp, xml_parser_cleanup);
add_done_item(ctx);
return svn_error_trace(err);
}
@@ -1818,8 +1834,7 @@ svn_ra_serf__handle_xml_parser(serf_requ
/* Ignore the return status. We just don't care. */
(void) XML_Parse(ctx->xmlp, NULL, 0, 1);
- XML_ParserFree(ctx->xmlp);
- ctx->xmlp = NULL;
+ apr_pool_cleanup_run(ctx->pool, &ctx->xmlp, xml_parser_cleanup);
add_done_item(ctx);
}