@@ -276,6 +276,14 @@ static const mbfl_encoding *php_mb_get_encoding_or_pass(const char *encoding_nam
276
276
return mbfl_name2encoding (encoding_name );
277
277
}
278
278
279
+ static const mbfl_encoding * php_mb_get_encoding_or_pass_ex (const char * encoding_name , size_t encoding_name_len ) {
280
+ if (strncmp (encoding_name , "pass" , encoding_name_len ) == 0 ) {
281
+ return & mbfl_encoding_pass ;
282
+ }
283
+
284
+ return mbfl_name2encoding_ex (encoding_name , encoding_name_len );
285
+ }
286
+
279
287
static size_t count_commas (const char * p , const char * end ) {
280
288
size_t count = 0 ;
281
289
while ((p = memchr (p , ',' , end - p ))) {
@@ -300,15 +308,14 @@ static zend_result php_mb_parse_encoding_list(const char *value, size_t value_le
300
308
} else {
301
309
bool included_auto ;
302
310
size_t n , size ;
303
- char * p1 , * endp , * tmpstr ;
311
+ const char * p1 , * endp , * tmpstr ;
304
312
const mbfl_encoding * * entry , * * list ;
305
313
306
- /* copy the value string for work */
307
314
if (value [0 ]== '"' && value [value_length - 1 ]== '"' && value_length > 2 ) {
308
- tmpstr = ( char * ) estrndup ( value + 1 , value_length - 2 ) ;
315
+ tmpstr = value + 1 ;
309
316
value_length -= 2 ;
310
317
} else {
311
- tmpstr = ( char * ) estrndup ( value , value_length ) ;
318
+ tmpstr = value ;
312
319
}
313
320
314
321
endp = tmpstr + value_length ;
@@ -319,20 +326,19 @@ static zend_result php_mb_parse_encoding_list(const char *value, size_t value_le
319
326
included_auto = 0 ;
320
327
p1 = tmpstr ;
321
328
while (1 ) {
322
- char * comma = memchr (p1 , ',' , endp - p1 );
323
- char * p = comma ? comma : endp ;
324
- * p = '\0' ;
329
+ const char * comma = memchr (p1 , ',' , endp - p1 );
330
+ const char * p = comma ? comma : endp ;
325
331
/* trim spaces */
326
332
while (p1 < p && (* p1 == ' ' || * p1 == '\t' )) {
327
333
p1 ++ ;
328
334
}
329
335
p -- ;
330
336
while (p > p1 && (* p == ' ' || * p == '\t' )) {
331
- * p = '\0' ;
332
337
p -- ;
333
338
}
339
+ size_t p1_length = p - p1 + 1 ;
334
340
/* convert to the encoding number and check encoding */
335
- if (strcasecmp (p1 , "auto" ) == 0 ) {
341
+ if (strncasecmp (p1 , "auto" , p1_length ) == 0 ) {
336
342
if (!included_auto ) {
337
343
const enum mbfl_no_encoding * src = MBSTRG (default_detect_order_list );
338
344
const size_t identify_list_size = MBSTRG (default_detect_order_list_size );
@@ -345,15 +351,14 @@ static zend_result php_mb_parse_encoding_list(const char *value, size_t value_le
345
351
}
346
352
} else {
347
353
const mbfl_encoding * encoding =
348
- allow_pass_encoding ? php_mb_get_encoding_or_pass (p1 ) : mbfl_name2encoding (p1 );
354
+ allow_pass_encoding ? php_mb_get_encoding_or_pass_ex (p1 , p1_length ) : mbfl_name2encoding_ex (p1 , p1_length );
349
355
if (!encoding ) {
350
356
/* Called from an INI setting modification */
351
357
if (arg_num == 0 ) {
352
- php_error_docref ("ref.mbstring" , E_WARNING , "INI setting contains invalid encoding \"%s\"" , p1 );
358
+ php_error_docref ("ref.mbstring" , E_WARNING , "INI setting contains invalid encoding \"%.* s\"" , ( int ) p1_length , p1 );
353
359
} else {
354
- zend_argument_value_error (arg_num , "contains invalid encoding \"%s\"" , p1 );
360
+ zend_argument_value_error (arg_num , "contains invalid encoding \"%.* s\"" , ( int ) p1_length , p1 );
355
361
}
356
- efree (tmpstr );
357
362
pefree (ZEND_VOIDP (list ), persistent );
358
363
return FAILURE ;
359
364
}
@@ -368,7 +373,6 @@ static zend_result php_mb_parse_encoding_list(const char *value, size_t value_le
368
373
}
369
374
* return_list = list ;
370
375
* return_size = n ;
371
- efree (tmpstr );
372
376
}
373
377
374
378
return SUCCESS ;
0 commit comments