@@ -134,6 +134,81 @@ def teardown
134
134
REXML ::Security . entity_expansion_text_limit = @default_entity_expansion_text_limit
135
135
end
136
136
137
+ def test_have_value
138
+ source = <<-XML
139
+ <?xml version="1.0" encoding="UTF-8"?>
140
+ <!DOCTYPE member [
141
+ <!ENTITY a "&b;&b;&b;&b;&b;&b;&b;&b;&b;&b;">
142
+ <!ENTITY b "&c;&c;&c;&c;&c;&c;&c;&c;&c;&c;">
143
+ <!ENTITY c "&d;&d;&d;&d;&d;&d;&d;&d;&d;&d;">
144
+ <!ENTITY d "&e;&e;&e;&e;&e;&e;&e;&e;&e;&e;">
145
+ <!ENTITY e "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx">
146
+ ]>
147
+ <member>
148
+ &a;
149
+ </member>
150
+ XML
151
+
152
+ assert_raise ( RuntimeError . new ( "entity expansion has grown too large" ) ) do
153
+ REXML ::Document . parse_stream ( source , MyListener . new )
154
+ end
155
+ end
156
+
157
+ def test_empty_value
158
+ source = <<-XML
159
+ <?xml version="1.0" encoding="UTF-8"?>
160
+ <!DOCTYPE member [
161
+ <!ENTITY a "&b;&b;&b;&b;&b;&b;&b;&b;&b;&b;">
162
+ <!ENTITY b "&c;&c;&c;&c;&c;&c;&c;&c;&c;&c;">
163
+ <!ENTITY c "&d;&d;&d;&d;&d;&d;&d;&d;&d;&d;">
164
+ <!ENTITY d "&e;&e;&e;&e;&e;&e;&e;&e;&e;&e;">
165
+ <!ENTITY e "">
166
+ ]>
167
+ <member>
168
+ &a;
169
+ </member>
170
+ XML
171
+
172
+ listener = MyListener . new
173
+ REXML ::Security . entity_expansion_limit = 100000
174
+ parser = REXML ::Parsers ::StreamParser . new ( source , listener )
175
+ parser . parse
176
+ assert_equal ( 11111 , parser . entity_expansion_count )
177
+
178
+ REXML ::Security . entity_expansion_limit = @default_entity_expansion_limit
179
+ parser = REXML ::Parsers ::StreamParser . new ( source , listener )
180
+ assert_raise ( RuntimeError . new ( "number of entity expansions exceeded, processing aborted." ) ) do
181
+ parser . parse
182
+ end
183
+ assert do
184
+ parser . entity_expansion_count > @default_entity_expansion_limit
185
+ end
186
+ end
187
+
188
+ def test_with_default_entity
189
+ source = <<-XML
190
+ <?xml version="1.0" encoding="UTF-8"?>
191
+ <!DOCTYPE member [
192
+ <!ENTITY a "a">
193
+ <!ENTITY a2 "&a; &a;">
194
+ ]>
195
+ <member>
196
+ &a;
197
+ &a2;
198
+ <
199
+ </member>
200
+ XML
201
+
202
+ listener = MyListener . new
203
+ REXML ::Security . entity_expansion_limit = 4
204
+ REXML ::Document . parse_stream ( source , listener )
205
+
206
+ REXML ::Security . entity_expansion_limit = 3
207
+ assert_raise ( RuntimeError . new ( "number of entity expansions exceeded, processing aborted." ) ) do
208
+ REXML ::Document . parse_stream ( source , listener )
209
+ end
210
+ end
211
+
137
212
def test_with_only_default_entities
138
213
member_value = "<p>#{ 'A' * @default_entity_expansion_text_limit } </p>"
139
214
source = <<-XML
@@ -159,6 +234,32 @@ def text(text)
159
234
listener . text_value . bytesize > @default_entity_expansion_text_limit
160
235
end
161
236
end
237
+
238
+ def test_entity_expansion_text_limit
239
+ source = <<-XML
240
+ <!DOCTYPE member [
241
+ <!ENTITY a "&b;&b;&b;">
242
+ <!ENTITY b "&c;&d;&e;">
243
+ <!ENTITY c "xxxxxxxxxx">
244
+ <!ENTITY d "yyyyyyyyyy">
245
+ <!ENTITY e "zzzzzzzzzz">
246
+ ]>
247
+ <member>&a;</member>
248
+ XML
249
+
250
+ listener = MyListener . new
251
+ class << listener
252
+ attr_accessor :text_value
253
+ def text ( text )
254
+ @text_value << text
255
+ end
256
+ end
257
+ listener . text_value = ""
258
+ REXML ::Security . entity_expansion_text_limit = 90
259
+ REXML ::Document . parse_stream ( source , listener )
260
+
261
+ assert_equal ( 90 , listener . text_value . size )
262
+ end
162
263
end
163
264
164
265
# For test_listener
0 commit comments