<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>test/rexml/test_document.rb</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -1,3 +1,19 @@
+Fri Jan 23 11:49:45 2009  Shugo Maeda  &lt;shugo@ruby-lang.org&gt;
+
+	* NEWS: added an entry for REXML.
+
+	* lib/rexml/document.rb: fixed typo.
+
+Fri Jan 23 11:49:45 2009  Shugo Maeda  &lt;shugo@ruby-lang.org&gt;
+
+	* lib/rexml/document.rb: limit entity expansion.  Thanks, Luka
+	  Treiber, Mitja Kolsek, and Michael Koziarski.  backported from
+	  trunk r19033, r19317, r19318.
+
+	* lib/rexml/entity.rb: ditto.
+
+	* test/rexml/test_document.rb: ditto.
+
 Thu Jan 22 15:19:39 2009  Nobuyoshi Nakada  &lt;nobu@ruby-lang.org&gt;
 
 	* marshal.c (marshal_load): arg.data is no longer a VALUE but a</diff>
      <filename>ChangeLog</filename>
    </modified>
    <modified>
      <diff>@@ -7,6 +7,15 @@ Note that each entry is kept so brief that no reason behind or
 reference information is supplied with.  For a full list of changes
 with all sufficient information, see the ChangeLog file.
 
+* REXML
+
+  * REXML::Document.entity_expansion_limit=
+
+    New method to set the entity expansion limit. By default the limit is
+    set to 10000.  See the following URL for details.
+
+    http://www.ruby-lang.org/en/news/2008/08/23/dos-vulnerability-in-rexml/
+
 == Changes since the 1.8.6 release
 
 === Configuration changes</diff>
      <filename>NEWS</filename>
    </modified>
    <modified>
      <diff>@@ -32,6 +32,7 @@ module REXML
 	  # @param context if supplied, contains the context of the document;
 	  # this should be a Hash.
 		def initialize( source = nil, context = {} )
+      @entity_expansion_count = 0
 			super()
 			@context = context
 			return if source.nil?
@@ -200,6 +201,27 @@ module REXML
 			Parsers::StreamParser.new( source, listener ).parse
 		end
 
+    @@entity_expansion_limit = 10_000
+
+    # Set the entity expansion limit. By default the limit is set to 10000.
+    def Document::entity_expansion_limit=( val )
+      @@entity_expansion_limit = val
+    end
+
+    # Get the entity expansion limit. By default the limit is set to 10000.
+    def Document::entity_expansion_limit
+      return @@entity_expansion_limit
+    end
+
+    attr_reader :entity_expansion_count
+    
+    def record_entity_expansion
+      @entity_expansion_count += 1
+      if @entity_expansion_count &gt; @@entity_expansion_limit
+        raise &quot;number of entity expansions exceeded, processing aborted.&quot;
+      end
+    end
+
 		private
 		def build( source )
       Parsers::TreeParser.new( source, self ).parse</diff>
      <filename>lib/rexml/document.rb</filename>
    </modified>
    <modified>
      <diff>@@ -73,6 +73,7 @@ module REXML
 		# all entities -- both %ent; and &amp;ent; entities.  This differs from
 		# +value()+ in that +value+ only replaces %ent; entities.
 		def unnormalized
+      document.record_entity_expansion
 			v = value()
 			return nil if v.nil?
 			@unnormalized = Text::unnormalize(v, parent)</diff>
      <filename>lib/rexml/entity.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,15 +1,15 @@
 #define RUBY_VERSION &quot;1.8.7&quot;
-#define RUBY_RELEASE_DATE &quot;2009-01-22&quot;
+#define RUBY_RELEASE_DATE &quot;2009-01-23&quot;
 #define RUBY_VERSION_CODE 187
-#define RUBY_RELEASE_CODE 20090122
-#define RUBY_PATCHLEVEL 92
+#define RUBY_RELEASE_CODE 20090123
+#define RUBY_PATCHLEVEL 93
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
 #define RUBY_VERSION_TEENY 7
 #define RUBY_RELEASE_YEAR 2009
 #define RUBY_RELEASE_MONTH 1
-#define RUBY_RELEASE_DAY 22
+#define RUBY_RELEASE_DAY 23
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];</diff>
      <filename>version.h</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>4fdc60a6474c44301b42b2b402c9aebb5fd92c5e</id>
    </parent>
  </parents>
  <author>
    <name>shyouhei</name>
    <email>shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e</email>
  </author>
  <url>http://github.com/ice799/matzruby/commit/5ceedb08ac385bb14b056c6f3bef90d41b2ed9c9</url>
  <id>5ceedb08ac385bb14b056c6f3bef90d41b2ed9c9</id>
  <committed-date>2009-01-22T18:50:43-08:00</committed-date>
  <authored-date>2009-01-22T18:50:43-08:00</authored-date>
  <message>merge revision(s) 19320,19322:
	* lib/rexml/document.rb: limit entity expansion.  Thanks, Luka
	  Treiber, Mitja Kolsek, and Michael Koziarski.  backported from
	  trunk r19033, r19317, r19318.
	* lib/rexml/entity.rb: ditto.
	* test/rexml/test_document.rb: ditto.
	* NEWS: added an entry for REXML.
	* lib/rexml/document.rb: fixed typo.


git-svn-id: http://svn.ruby-lang.org/repos/ruby/branches/ruby_1_8_7@21744 b2dd03c8-39d4-4d8f-98ff-823fe69b080e</message>
  <tree>38de7039da1df7e286c065437ce485e09c89b32c</tree>
  <committer>
    <name>shyouhei</name>
    <email>shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e</email>
  </committer>
</commit>
