On Wed, Jun 10, 2009 at 7:22 PM,  <bo...@apache.org> wrote:
> Author: bojan
> Date: Thu Jun 11 00:22:09 2009
> New Revision: 783589
>
> URL: http://svn.apache.org/viewvc?rev=783589&view=rev
> Log:
> Backport r781403 from the trunk.
> Prevent "billion laughs" attack against expat:
>
> * xml/apr_xml.c (entity_declaration, default_handler): Add new handlers
>  for expat 2.x and 1.x respectively.
>  (apr_xml_parser_create): Install handler to prevent expansion of
>  internal entities with expat 1.x, and to fail on an entity
>  declaration with expat 2.x.
>
> * test/testxml.c (create_dummy_file, dump_xml): Test that predefined
>  entities are expanded.
>  (test_billion_laughs): New test case.
>
> Added:
>    apr/apr-util/branches/1.4.x/test/data/billion-laughs.xml
>      - copied unchanged from r781403, 
> apr/apr/trunk/test/data/billion-laughs.xml
> Modified:
>    apr/apr-util/branches/1.4.x/   (props changed)
>    apr/apr-util/branches/1.4.x/CHANGES
>    apr/apr-util/branches/1.4.x/buckets/apr_brigade.c   (props changed)
>    apr/apr-util/branches/1.4.x/test/testxml.c
>    apr/apr-util/branches/1.4.x/xml/apr_xml.c

> Modified: apr/apr-util/branches/1.4.x/test/testxml.c
> URL: 
> http://svn.apache.org/viewvc/apr/apr-util/branches/1.4.x/test/testxml.c?rev=783589&r1=783588&r2=783589&view=diff
> ==============================================================================
> --- apr/apr-util/branches/1.4.x/test/testxml.c (original)
> +++ apr/apr-util/branches/1.4.x/test/testxml.c Thu Jun 11 00:22:09 2009
...
> @@ -149,11 +148,29 @@
>     ABTS_TRUE(tc, rv != APR_SUCCESS);
>  }
>
> +static void test_billion_laughs(abts_case *tc, void *data)
> +{
> +    apr_file_t *fd;
> +    apr_xml_parser *parser;
> +    apr_xml_doc *doc;
> +    apr_status_t rv;
> +
> +    rv = apr_file_open(&fd, "billion-laughs.xml",
> +                       APR_FOPEN_READ, 0, p);
> +    apr_assert_success(tc, "open billion-laughs.xml", rv);
> +
> +    rv = apr_xml_parse_file(p, &parser, &doc, fd, 2000);
> +    ABTS_TRUE(tc, rv != APR_SUCCESS);

if I understand correctly:

with expat >= 2.x, we are able to force a parse failure, so rv
shouldn't be APR_SUCCESS
with expat 1.x, we aren't able to force a parse failure but we prevent
expansion, and rv will be APR_SUCCESS

apr-util 1.4.x bundles expat 1.x (which perhaps few people use?), and
running this test fails since rv is APR_SUCCESS

Is it reasonable to leave the apr-util 1.4.x test like 1.3's and
ignore the return code?

    /* Don't test for return value; if it returns, chances are the bug
     * is fixed or the machine has insane amounts of RAM. */
    apr_xml_parse_file(p, &parser, &doc, fd, 2000);

Reply via email to