27
27
#include "main/php_output.h"
28
28
#include "ext/standard/info.h"
29
29
30
- #include "php_variables.h"
31
30
#include "php_globals.h"
32
31
#include "rfc1867.h"
33
32
#include "php_content_types.h"
@@ -173,33 +172,23 @@ MBSTRING_API SAPI_TREAT_DATA_FUNC(mbstr_treat_data)
173
172
/* }}} */
174
173
175
174
/* {{{ mbfl_no_encoding _php_mb_encoding_handler_ex() */
176
- const mbfl_encoding * _php_mb_encoding_handler_ex (const php_mb_encoding_handler_info_t * info , zval * arg , char * res )
175
+ const mbfl_encoding * _php_mb_encoding_handler_ex (const php_mb_encoding_handler_info_t * info , zval * array_ptr , char * res )
177
176
{
178
177
char * var , * val ;
179
- const char * s1 , * s2 ;
180
178
char * strtok_buf = NULL , * * val_list = NULL ;
181
- zval * array_ptr = (zval * ) arg ;
182
- size_t n , num , * len_list = NULL ;
183
- size_t val_len , new_val_len ;
184
- mbfl_string string , resvar , resval ;
179
+ size_t n , num = 1 , * len_list = NULL ;
180
+ size_t new_val_len ;
185
181
const mbfl_encoding * from_encoding = NULL ;
186
182
mbfl_encoding_detector * identd = NULL ;
187
- mbfl_buffer_converter * convd = NULL ;
188
-
189
- mbfl_string_init_set (& string , info -> to_encoding );
190
- mbfl_string_init_set (& resvar , info -> to_encoding );
191
- mbfl_string_init_set (& resval , info -> to_encoding );
192
183
193
184
if (!res || * res == '\0' ) {
194
185
goto out ;
195
186
}
196
187
197
- /* count the variables(separators) contained in the "res".
198
- * separator may contain multiple separator chars.
199
- */
200
- num = 1 ;
201
- for (s1 = res ; * s1 != '\0' ; s1 ++ ) {
202
- for (s2 = info -> separator ; * s2 != '\0' ; s2 ++ ) {
188
+ /* count variables contained in `res`.
189
+ * separator may contain multiple separator chars; ANY of them demarcate variables */
190
+ for (char * s1 = res ; * s1 ; s1 ++ ) {
191
+ for (const char * s2 = info -> separator ; * s2 ; s2 ++ ) {
203
192
if (* s1 == * s2 ) {
204
193
num ++ ;
205
194
}
@@ -212,7 +201,6 @@ const mbfl_encoding *_php_mb_encoding_handler_ex(const php_mb_encoding_handler_i
212
201
213
202
/* split and decode the query */
214
203
n = 0 ;
215
- strtok_buf = NULL ;
216
204
var = php_strtok_r (res , info -> separator , & strtok_buf );
217
205
while (var ) {
218
206
val = strchr (var , '=' );
@@ -255,6 +243,7 @@ const mbfl_encoding *_php_mb_encoding_handler_ex(const php_mb_encoding_handler_i
255
243
if (identd != NULL ) {
256
244
n = 0 ;
257
245
while (n < num ) {
246
+ mbfl_string string ;
258
247
string .val = (unsigned char * )val_list [n ];
259
248
string .len = len_list [n ];
260
249
if (mbfl_encoding_detector_feed (identd , & string )) {
@@ -273,62 +262,40 @@ const mbfl_encoding *_php_mb_encoding_handler_ex(const php_mb_encoding_handler_i
273
262
}
274
263
}
275
264
276
- convd = NULL ;
277
- if (from_encoding != & mbfl_encoding_pass ) {
278
- convd = mbfl_buffer_converter_new (from_encoding , info -> to_encoding , 0 );
279
- if (convd != NULL ) {
280
- mbfl_buffer_converter_illegal_mode (convd , MBSTRG (current_filter_illegal_mode ));
281
- mbfl_buffer_converter_illegal_substchar (convd , MBSTRG (current_filter_illegal_substchar ));
282
- } else {
283
- if (info -> report_errors ) {
284
- php_error_docref (NULL , E_WARNING , "Unable to create converter" );
285
- }
286
- goto out ;
287
- }
288
- }
289
-
290
265
/* convert encoding */
291
- string .encoding = from_encoding ;
292
-
293
266
n = 0 ;
294
267
while (n < num ) {
295
- string .val = (unsigned char * )val_list [n ];
296
- string .len = len_list [n ];
297
- if (convd != NULL && mbfl_buffer_converter_feed_result (convd , & string , & resvar ) != NULL ) {
298
- var = (char * )resvar .val ;
299
- } else {
300
- var = val_list [n ];
301
- }
302
- n ++ ;
303
- string .val = (unsigned char * )val_list [n ];
304
- string .len = len_list [n ];
305
- if (convd != NULL && mbfl_buffer_converter_feed_result (convd , & string , & resval ) != NULL ) {
306
- val = (char * )resval .val ;
307
- val_len = resval .len ;
268
+ if (from_encoding != & mbfl_encoding_pass && info -> to_encoding != & mbfl_encoding_pass ) {
269
+ unsigned int num_errors = 0 ;
270
+ zend_string * converted_var = mb_fast_convert ((unsigned char * )val_list [n ], len_list [n ], from_encoding , info -> to_encoding , MBSTRG (current_filter_illegal_substchar ), MBSTRG (current_filter_illegal_mode ), & num_errors );
271
+ MBSTRG (illegalchars ) += num_errors ;
272
+ n ++ ;
273
+
274
+ num_errors = 0 ;
275
+ zend_string * converted_val = mb_fast_convert ((unsigned char * )val_list [n ], len_list [n ], from_encoding , info -> to_encoding , MBSTRG (current_filter_illegal_substchar ), MBSTRG (current_filter_illegal_mode ), & num_errors );
276
+ MBSTRG (illegalchars ) += num_errors ;
277
+ n ++ ;
278
+
279
+ /* `val` must be a pointer returned by `emalloc` */
280
+ val = estrndup (ZSTR_VAL (converted_val ), ZSTR_LEN (converted_val ));
281
+ if (sapi_module .input_filter (info -> data_type , ZSTR_VAL (converted_var ), & val , ZSTR_LEN (converted_val ), & new_val_len )) {
282
+ /* add variable to symbol table */
283
+ php_register_variable_safe (ZSTR_VAL (converted_var ), val , new_val_len , array_ptr );
284
+ }
285
+ zend_string_free (converted_var );
286
+ zend_string_free (converted_val );
308
287
} else {
309
- val = val_list [n ];
310
- val_len = len_list [n ];
311
- }
312
- n ++ ;
313
- /* we need val to be emalloc()ed */
314
- val = estrndup (val , val_len );
315
- if (sapi_module .input_filter (info -> data_type , var , & val , val_len , & new_val_len )) {
316
- /* add variable to symbol table */
317
- php_register_variable_safe (var , val , new_val_len , array_ptr );
288
+ var = val_list [n ++ ];
289
+ val = estrndup (val_list [n ], len_list [n ]);
290
+ if (sapi_module .input_filter (info -> data_type , var , & val , len_list [n ], & new_val_len )) {
291
+ php_register_variable_safe (var , val , new_val_len , array_ptr );
292
+ }
293
+ n ++ ;
318
294
}
319
295
efree (val );
320
-
321
- if (convd != NULL ){
322
- mbfl_string_clear (& resvar );
323
- mbfl_string_clear (& resval );
324
- }
325
296
}
326
297
327
298
out :
328
- if (convd != NULL ) {
329
- MBSTRG (illegalchars ) += mbfl_buffer_illegalchars (convd );
330
- mbfl_buffer_converter_delete (convd );
331
- }
332
299
if (val_list != NULL ) {
333
300
efree ((void * )val_list );
334
301
}
0 commit comments