You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by iv...@apache.org on 2016/10/17 08:07:30 UTC

svn commit: r1765219 - /subversion/trunk/subversion/libsvn_subr/xml.c

Author: ivan
Date: Mon Oct 17 08:07:30 2016
New Revision: 1765219

URL: http://svn.apache.org/viewvc?rev=1765219&view=rev
Log:
Fix potential error leak in svn_xml_parser_t wrapper for XML parser discovered
by xml-test.exe#4 test added in r1765214.

* subversion/libsvn_subr/xml.c
  (svn_xml_parse): Prefer API user error provided from callback via
   svn_xml_signal_bailout(), instead of syntax XML error from Expat if we have
   both.

Modified:
    subversion/trunk/subversion/libsvn_subr/xml.c

Modified: subversion/trunk/subversion/libsvn_subr/xml.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_subr/xml.c?rev=1765219&r1=1765218&r2=1765219&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_subr/xml.c (original)
+++ subversion/trunk/subversion/libsvn_subr/xml.c Mon Oct 17 08:07:30 2016
@@ -428,6 +428,14 @@ svn_xml_parse(svn_xml_parser_t *svn_pars
   /* Parse some xml data */
   success = XML_Parse(svn_parser->parser, buf, (int) len, is_final);
 
+  /* Did an error occur somewhere *inside* the expat callbacks? */
+  if (svn_parser->error)
+    {
+      /* Kill all parsers and return the error */
+      svn_xml_free_parser(svn_parser);
+      return svn_parser->error;
+    }
+
   /* If expat choked internally, return its error. */
   if (! success)
     {
@@ -443,14 +451,6 @@ svn_xml_parse(svn_xml_parser_t *svn_pars
       svn_xml_free_parser(svn_parser);
       return err;
     }
-
-  /* Did an error occur somewhere *inside* the expat callbacks? */
-  if (svn_parser->error)
-    {
-      err = svn_parser->error;
-      svn_xml_free_parser(svn_parser);
-      return err;
-    }
 
   return SVN_NO_ERROR;
 }