@@ -177,7 +177,8 @@ void mbfl_filt_conv_html_dec_dtor(mbfl_convert_filter *filter)
177
177
178
178
int mbfl_filt_conv_html_dec (int c , mbfl_convert_filter * filter )
179
179
{
180
- int pos , ent = 0 ;
180
+ int pos ;
181
+ unsigned int ent = 0 ;
181
182
mbfl_html_entity_entry * entity ;
182
183
char * buffer = (char * )filter -> opaque ;
183
184
@@ -215,6 +216,10 @@ int mbfl_filt_conv_html_dec(int c, mbfl_convert_filter *filter)
215
216
/* numeric entity */
216
217
if (filter -> status > 2 ) {
217
218
for (pos = 2 ; pos < filter -> status ; pos ++ ) {
219
+ if (ent > 0x19999999 ) {
220
+ ent = -1 ;
221
+ break ;
222
+ }
218
223
int v = buffer [pos ];
219
224
if (v >= '0' && v <= '9' ) {
220
225
v = v - '0' ;
@@ -228,7 +233,7 @@ int mbfl_filt_conv_html_dec(int c, mbfl_convert_filter *filter)
228
233
ent = -1 ;
229
234
}
230
235
}
231
- if (ent >= 0 && ent < 0x110000 ) {
236
+ if (ent < 0x110000 ) {
232
237
CK ((* filter -> output_function )(ent , filter -> data ));
233
238
} else {
234
239
for (pos = 0 ; pos < filter -> status ; pos ++ ) {
@@ -253,13 +258,20 @@ int mbfl_filt_conv_html_dec(int c, mbfl_convert_filter *filter)
253
258
/* decoded */
254
259
CK ((* filter -> output_function )(ent , filter -> data ));
255
260
filter -> status = 0 ;
256
- /*php_error_docref("ref.mbstring", E_NOTICE,"mbstring decoded '%s'=%d", buffer, ent);*/
261
+
257
262
} else {
258
263
/* failure */
259
264
buffer [filter -> status ++ ] = ';' ;
260
265
buffer [filter -> status ] = 0 ;
261
- /* php_error_docref("ref.mbstring", E_WARNING, "mbstring cannot decode '%s'", buffer); */
262
- mbfl_filt_conv_html_dec_flush (filter );
266
+
267
+ /* flush fragments */
268
+ pos = 0 ;
269
+ while (filter -> status -- ) {
270
+ int e = (* filter -> output_function )(buffer [pos ++ ], filter -> data );
271
+ if (e != 0 )
272
+ return e ;
273
+ }
274
+ filter -> status = 0 ;
263
275
}
264
276
}
265
277
} else {
@@ -272,8 +284,15 @@ int mbfl_filt_conv_html_dec(int c, mbfl_convert_filter *filter)
272
284
if (c == '&' )
273
285
filter -> status -- ;
274
286
buffer [filter -> status ] = 0 ;
275
- /* php_error_docref("ref.mbstring", E_WARNING, "mbstring cannot decode '%s'", buffer)l */
276
- mbfl_filt_conv_html_dec_flush (filter );
287
+
288
+ pos = 0 ;
289
+ while (filter -> status -- ) {
290
+ int e = (* filter -> output_function )(buffer [pos ++ ], filter -> data );
291
+ if (e != 0 )
292
+ return e ;
293
+ }
294
+ filter -> status = 0 ;
295
+
277
296
if (c == '&' )
278
297
{
279
298
buffer [filter -> status ++ ] = '&' ;
0 commit comments