@@ -3400,13 +3400,16 @@ htmlParseCharRef(htmlParserCtxtPtr ctxt) {
3400
3400
((NXT (2 ) == 'x' ) || NXT (2 ) == 'X' )) {
3401
3401
SKIP (3 );
3402
3402
while (CUR != ';' ) {
3403
- if ((CUR >= '0' ) && (CUR <= '9' ))
3404
- val = val * 16 + (CUR - '0' );
3405
- else if ((CUR >= 'a' ) && (CUR <= 'f' ))
3406
- val = val * 16 + (CUR - 'a' ) + 10 ;
3407
- else if ((CUR >= 'A' ) && (CUR <= 'F' ))
3408
- val = val * 16 + (CUR - 'A' ) + 10 ;
3409
- else {
3403
+ if ((CUR >= '0' ) && (CUR <= '9' )) {
3404
+ if (val < 0x110000 )
3405
+ val = val * 16 + (CUR - '0' );
3406
+ } else if ((CUR >= 'a' ) && (CUR <= 'f' )) {
3407
+ if (val < 0x110000 )
3408
+ val = val * 16 + (CUR - 'a' ) + 10 ;
3409
+ } else if ((CUR >= 'A' ) && (CUR <= 'F' )) {
3410
+ if (val < 0x110000 )
3411
+ val = val * 16 + (CUR - 'A' ) + 10 ;
3412
+ } else {
3410
3413
htmlParseErr (ctxt , XML_ERR_INVALID_HEX_CHARREF ,
3411
3414
"htmlParseCharRef: missing semicolon\n" ,
3412
3415
NULL , NULL );
@@ -3419,9 +3422,10 @@ htmlParseCharRef(htmlParserCtxtPtr ctxt) {
3419
3422
} else if ((CUR == '&' ) && (NXT (1 ) == '#' )) {
3420
3423
SKIP (2 );
3421
3424
while (CUR != ';' ) {
3422
- if ((CUR >= '0' ) && (CUR <= '9' ))
3423
- val = val * 10 + (CUR - '0' );
3424
- else {
3425
+ if ((CUR >= '0' ) && (CUR <= '9' )) {
3426
+ if (val < 0x110000 )
3427
+ val = val * 10 + (CUR - '0' );
3428
+ } else {
3425
3429
htmlParseErr (ctxt , XML_ERR_INVALID_DEC_CHARREF ,
3426
3430
"htmlParseCharRef: missing semicolon\n" ,
3427
3431
NULL , NULL );
@@ -3440,6 +3444,9 @@ htmlParseCharRef(htmlParserCtxtPtr ctxt) {
3440
3444
*/
3441
3445
if (IS_CHAR (val )) {
3442
3446
return (val );
3447
+ } else if (val >= 0x110000 ) {
3448
+ htmlParseErr (ctxt , XML_ERR_INVALID_CHAR ,
3449
+ "htmlParseCharRef: value too large\n" , NULL , NULL );
3443
3450
} else {
3444
3451
htmlParseErrInt (ctxt , XML_ERR_INVALID_CHAR ,
3445
3452
"htmlParseCharRef: invalid xmlChar value %d\n" ,
@@ -5332,7 +5339,7 @@ static int
5332
5339
htmlParseTryOrFinish (htmlParserCtxtPtr ctxt , int terminate ) {
5333
5340
int ret = 0 ;
5334
5341
htmlParserInputPtr in ;
5335
- int avail = 0 ;
5342
+ ptrdiff_t avail = 0 ;
5336
5343
xmlChar cur , next ;
5337
5344
5338
5345
htmlParserNodeInfo node_info ;
@@ -5397,7 +5404,8 @@ htmlParseTryOrFinish(htmlParserCtxtPtr ctxt, int terminate) {
5397
5404
if (in -> buf == NULL )
5398
5405
avail = in -> length - (in -> cur - in -> base );
5399
5406
else
5400
- avail = xmlBufUse (in -> buf -> buffer ) - (in -> cur - in -> base );
5407
+ avail = (ptrdiff_t )xmlBufUse (in -> buf -> buffer ) -
5408
+ (in -> cur - in -> base );
5401
5409
if ((avail == 0 ) && (terminate )) {
5402
5410
htmlAutoCloseOnEnd (ctxt );
5403
5411
if ((ctxt -> nameNr == 0 ) && (ctxt -> instate != XML_PARSER_EOF )) {
@@ -5433,7 +5441,8 @@ htmlParseTryOrFinish(htmlParserCtxtPtr ctxt, int terminate) {
5433
5441
if (in -> buf == NULL )
5434
5442
avail = in -> length - (in -> cur - in -> base );
5435
5443
else
5436
- avail = xmlBufUse (in -> buf -> buffer ) - (in -> cur - in -> base );
5444
+ avail = (ptrdiff_t )xmlBufUse (in -> buf -> buffer ) -
5445
+ (in -> cur - in -> base );
5437
5446
}
5438
5447
if ((ctxt -> sax ) && (ctxt -> sax -> setDocumentLocator ))
5439
5448
ctxt -> sax -> setDocumentLocator (ctxt -> userData ,
@@ -5475,7 +5484,8 @@ htmlParseTryOrFinish(htmlParserCtxtPtr ctxt, int terminate) {
5475
5484
if (in -> buf == NULL )
5476
5485
avail = in -> length - (in -> cur - in -> base );
5477
5486
else
5478
- avail = xmlBufUse (in -> buf -> buffer ) - (in -> cur - in -> base );
5487
+ avail = (ptrdiff_t )xmlBufUse (in -> buf -> buffer ) -
5488
+ (in -> cur - in -> base );
5479
5489
/*
5480
5490
* no chars in buffer
5481
5491
*/
@@ -5548,7 +5558,8 @@ htmlParseTryOrFinish(htmlParserCtxtPtr ctxt, int terminate) {
5548
5558
if (in -> buf == NULL )
5549
5559
avail = in -> length - (in -> cur - in -> base );
5550
5560
else
5551
- avail = xmlBufUse (in -> buf -> buffer ) - (in -> cur - in -> base );
5561
+ avail = (ptrdiff_t )xmlBufUse (in -> buf -> buffer ) -
5562
+ (in -> cur - in -> base );
5552
5563
if (avail < 2 )
5553
5564
goto done ;
5554
5565
cur = in -> cur [0 ];
@@ -5589,7 +5600,8 @@ htmlParseTryOrFinish(htmlParserCtxtPtr ctxt, int terminate) {
5589
5600
if (in -> buf == NULL )
5590
5601
avail = in -> length - (in -> cur - in -> base );
5591
5602
else
5592
- avail = xmlBufUse (in -> buf -> buffer ) - (in -> cur - in -> base );
5603
+ avail = (ptrdiff_t )xmlBufUse (in -> buf -> buffer ) -
5604
+ (in -> cur - in -> base );
5593
5605
if (avail < 1 )
5594
5606
goto done ;
5595
5607
cur = in -> cur [0 ];
@@ -6124,12 +6136,12 @@ htmlParseChunk(htmlParserCtxtPtr ctxt, const char *chunk, int size,
6124
6136
int res ;
6125
6137
6126
6138
res = xmlParserInputBufferPush (ctxt -> input -> buf , size , chunk );
6139
+ xmlBufSetInputBaseCur (ctxt -> input -> buf -> buffer , ctxt -> input , base , cur );
6127
6140
if (res < 0 ) {
6128
6141
ctxt -> errNo = XML_PARSER_EOF ;
6129
6142
ctxt -> disableSAX = 1 ;
6130
6143
return (XML_PARSER_EOF );
6131
6144
}
6132
- xmlBufSetInputBaseCur (ctxt -> input -> buf -> buffer , ctxt -> input , base , cur );
6133
6145
#ifdef DEBUG_PUSH
6134
6146
xmlGenericError (xmlGenericErrorContext , "HPP: pushed %d\n" , size );
6135
6147
#endif
@@ -6148,12 +6160,12 @@ htmlParseChunk(htmlParserCtxtPtr ctxt, const char *chunk, int size,
6148
6160
size_t current = ctxt -> input -> cur - ctxt -> input -> base ;
6149
6161
6150
6162
nbchars = xmlCharEncInput (in , terminate );
6163
+ xmlBufSetInputBaseCur (in -> buffer , ctxt -> input , base , current );
6151
6164
if (nbchars < 0 ) {
6152
6165
htmlParseErr (ctxt , XML_ERR_INVALID_ENCODING ,
6153
6166
"encoder error\n" , NULL , NULL );
6154
6167
return (XML_ERR_INVALID_ENCODING );
6155
6168
}
6156
- xmlBufSetInputBaseCur (in -> buffer , ctxt -> input , base , current );
6157
6169
}
6158
6170
}
6159
6171
}
0 commit comments