}
}
+static const mbfl_encoding *php_mb_get_encoding_or_pass(const char *encoding_name) {
+ if (strcmp(encoding_name, "pass") == 0) {
+ return &mbfl_encoding_pass;
+ }
+
+ return mbfl_name2encoding(encoding_name);
+}
+
/* {{{ static int php_mb_parse_encoding_list()
* Return FAILURE if input contains any illegal encoding, otherwise SUCCESS.
* Emits a ValueError in function context and a warning in INI context, in INI context arg_num must be 0.
*/
static int php_mb_parse_encoding_list(const char *value, size_t value_length,
- const mbfl_encoding ***return_list, size_t *return_size, int persistent, uint32_t arg_num)
+ const mbfl_encoding ***return_list, size_t *return_size, int persistent, uint32_t arg_num,
+ zend_bool allow_pass_encoding)
{
if (value == NULL || value_length == 0) {
*return_list = NULL;
}
}
} else {
- const mbfl_encoding *encoding = mbfl_name2encoding(p1);
+ const mbfl_encoding *encoding =
+ allow_pass_encoding ? php_mb_get_encoding_or_pass(p1) : mbfl_name2encoding(p1);
if (!encoding) {
/* Called from an INI setting modification */
if (arg_num == 0) {
static int php_mb_zend_encoding_list_parser(const char *encoding_list, size_t encoding_list_len, const zend_encoding ***return_list, size_t *return_size, int persistent)
{
- return php_mb_parse_encoding_list(encoding_list, encoding_list_len, (const mbfl_encoding ***)return_list, return_size, persistent, 0);
+ return php_mb_parse_encoding_list(
+ encoding_list, encoding_list_len,
+ (const mbfl_encoding ***)return_list, return_size,
+ persistent, /* arg_num */ 0, /* allow_pass_encoding */ 1);
}
static const zend_encoding *php_mb_zend_internal_encoding_getter(void)
return SUCCESS;
}
- if (FAILURE == php_mb_parse_encoding_list(ZSTR_VAL(new_value), ZSTR_LEN(new_value), &list, &size, 1, 0) || size == 0) {
+ if (FAILURE == php_mb_parse_encoding_list(ZSTR_VAL(new_value), ZSTR_LEN(new_value), &list, &size, /* persistent */ 1, /* arg_num */ 0, /* allow_pass_encoding */ 0) || size == 0) {
return FAILURE;
}
static int _php_mb_ini_mbstring_http_input_set(const char *new_value, size_t new_value_length) {
const mbfl_encoding **list;
size_t size;
- if (FAILURE == php_mb_parse_encoding_list(new_value, new_value_length, &list, &size, 1, 0) || size == 0) {
+ if (FAILURE == php_mb_parse_encoding_list(new_value, new_value_length, &list, &size, /* persistent */ 1, /* arg_num */ 0, /* allow_pass_encoding */ 1) || size == 0) {
return FAILURE;
}
if (MBSTRG(http_input_list)) {
/* }}} */
static int _php_mb_ini_mbstring_http_output_set(const char *new_value) {
- const mbfl_encoding *encoding = mbfl_name2encoding(new_value);
+ const mbfl_encoding *encoding = php_mb_get_encoding_or_pass(new_value);
if (!encoding) {
return FAILURE;
}
ZEND_ASSERT(MBSTRG(current_http_output_encoding));
RETURN_STRING(MBSTRG(current_http_output_encoding)->name);
} else {
- encoding = mbfl_name2encoding(name);
+ encoding = php_mb_get_encoding_or_pass(name);
if (!encoding) {
zend_argument_value_error(1, "must be a valid encoding, \"%s\" given", name);
RETURN_THROWS();
RETURN_THROWS();
}
} else {
- if (FAILURE == php_mb_parse_encoding_list(ZSTR_VAL(order_str), ZSTR_LEN(order_str), &list, &size, 0, 1)) {
+ if (FAILURE == php_mb_parse_encoding_list(ZSTR_VAL(order_str), ZSTR_LEN(order_str), &list, &size, /* persistent */ 0, /* arg_num */ 1, /* allow_pass_encoding */ 0)) {
RETURN_THROWS();
}
}
free_from_encodings = 1;
} else if (from_encodings_str) {
if (php_mb_parse_encoding_list(ZSTR_VAL(from_encodings_str), ZSTR_LEN(from_encodings_str),
- &from_encodings, &num_from_encodings, 0, 3) == FAILURE) {
+ &from_encodings, &num_from_encodings,
+ /* persistent */ 0, /* arg_num */ 3, /* allow_pass_encoding */ 0) == FAILURE) {
RETURN_THROWS();
}
free_from_encodings = 1;
}
free_elist = 1;
} else if (encoding_str) {
- if (FAILURE == php_mb_parse_encoding_list(ZSTR_VAL(encoding_str), ZSTR_LEN(encoding_str), &elist, &size, 0, 2)) {
+ if (FAILURE == php_mb_parse_encoding_list(ZSTR_VAL(encoding_str), ZSTR_LEN(encoding_str), &elist, &size, /* persistent */ 0, /* arg_num */ 2, /* allow_pass_encoding */ 0)) {
RETURN_THROWS();
}
free_elist = 1;
RETURN_THROWS();
}
} else {
- if (php_mb_parse_encoding_list(ZSTR_VAL(from_enc_str), ZSTR_LEN(from_enc_str), &elist, &elistsz, 0, 2) == FAILURE) {
+ if (php_mb_parse_encoding_list(ZSTR_VAL(from_enc_str), ZSTR_LEN(from_enc_str), &elist, &elistsz, /* persistent */ 0, /* arg_num */ 2, /* allow_pass_encoding */ 0) == FAILURE) {
RETURN_THROWS();
}
}
if (!encoding) {
RETURN_THROWS();
}
- if (encoding == &mbfl_encoding_pass) {
- zend_value_error("mb_check_encoding() does not support the \"pass\" encoding");
- RETURN_THROWS();
- }
if (input_ht) {
if (!php_mb_check_encoding_recursive(input_ht, encoding)) {