Annotation of embedaddon/php/ext/mbstring/mb_gpc.c, revision 1.1
1.1 ! misho 1: /*
! 2: +----------------------------------------------------------------------+
! 3: | PHP Version 5 |
! 4: +----------------------------------------------------------------------+
! 5: | Copyright (c) 1997-2012 The PHP Group |
! 6: +----------------------------------------------------------------------+
! 7: | This source file is subject to version 3.01 of the PHP license, |
! 8: | that is bundled with this package in the file LICENSE, and is |
! 9: | available through the world-wide-web at the following url: |
! 10: | http://www.php.net/license/3_01.txt |
! 11: | If you did not receive a copy of the PHP license and are unable to |
! 12: | obtain it through the world-wide-web, please send a note to |
! 13: | license@php.net so we can mail you a copy immediately. |
! 14: +----------------------------------------------------------------------+
! 15: | Author: Rui Hirokawa <hirokawa@php.net> |
! 16: | Moriyoshi Koizumi <moriyoshi@php.net> |
! 17: +----------------------------------------------------------------------+
! 18: */
! 19:
! 20: /* $Id: mb_gpc.c 321634 2012-01-01 13:15:04Z felipe $ */
! 21:
! 22: /* {{{ includes */
! 23: #ifdef HAVE_CONFIG_H
! 24: #include "config.h"
! 25: #endif
! 26:
! 27: #include "php.h"
! 28: #include "php_ini.h"
! 29: #include "php_variables.h"
! 30: #include "mbstring.h"
! 31: #include "ext/standard/php_string.h"
! 32: #include "ext/standard/php_mail.h"
! 33: #include "ext/standard/url.h"
! 34: #include "main/php_output.h"
! 35: #include "ext/standard/info.h"
! 36:
! 37: #include "php_variables.h"
! 38: #include "php_globals.h"
! 39: #include "rfc1867.h"
! 40: #include "php_content_types.h"
! 41: #include "SAPI.h"
! 42: #include "TSRM.h"
! 43:
! 44: #include "mb_gpc.h"
! 45: /* }}} */
! 46:
! 47: #if HAVE_MBSTRING
! 48:
! 49: ZEND_EXTERN_MODULE_GLOBALS(mbstring)
! 50:
! 51: /* {{{ MBSTRING_API SAPI_TREAT_DATA_FUNC(mbstr_treat_data)
! 52: * http input processing */
! 53: MBSTRING_API SAPI_TREAT_DATA_FUNC(mbstr_treat_data)
! 54: {
! 55: char *res = NULL, *separator=NULL;
! 56: const char *c_var;
! 57: zval *array_ptr;
! 58: int free_buffer=0;
! 59: enum mbfl_no_encoding detected;
! 60: php_mb_encoding_handler_info_t info;
! 61:
! 62: if (arg != PARSE_STRING) {
! 63: char *value = zend_ini_string("mbstring.internal_encoding", sizeof("mbstring.internal_encoding"), 0);
! 64: _php_mb_ini_mbstring_internal_encoding_set(value, value ? strlen(value): 0 TSRMLS_CC);
! 65: }
! 66:
! 67: if (!MBSTRG(encoding_translation)) {
! 68: php_default_treat_data(arg, str, destArray TSRMLS_CC);
! 69: return;
! 70: }
! 71:
! 72: switch (arg) {
! 73: case PARSE_POST:
! 74: case PARSE_GET:
! 75: case PARSE_COOKIE:
! 76: ALLOC_ZVAL(array_ptr);
! 77: array_init(array_ptr);
! 78: INIT_PZVAL(array_ptr);
! 79: switch (arg) {
! 80: case PARSE_POST:
! 81: PG(http_globals)[TRACK_VARS_POST] = array_ptr;
! 82: break;
! 83: case PARSE_GET:
! 84: PG(http_globals)[TRACK_VARS_GET] = array_ptr;
! 85: break;
! 86: case PARSE_COOKIE:
! 87: PG(http_globals)[TRACK_VARS_COOKIE] = array_ptr;
! 88: break;
! 89: }
! 90: break;
! 91: default:
! 92: array_ptr=destArray;
! 93: break;
! 94: }
! 95:
! 96: if (arg==PARSE_POST) {
! 97: sapi_handle_post(array_ptr TSRMLS_CC);
! 98: return;
! 99: }
! 100:
! 101: if (arg == PARSE_GET) { /* GET data */
! 102: c_var = SG(request_info).query_string;
! 103: if (c_var && *c_var) {
! 104: res = (char *) estrdup(c_var);
! 105: free_buffer = 1;
! 106: } else {
! 107: free_buffer = 0;
! 108: }
! 109: } else if (arg == PARSE_COOKIE) { /* Cookie data */
! 110: c_var = SG(request_info).cookie_data;
! 111: if (c_var && *c_var) {
! 112: res = (char *) estrdup(c_var);
! 113: free_buffer = 1;
! 114: } else {
! 115: free_buffer = 0;
! 116: }
! 117: } else if (arg == PARSE_STRING) { /* String data */
! 118: res = str;
! 119: free_buffer = 1;
! 120: }
! 121:
! 122: if (!res) {
! 123: return;
! 124: }
! 125:
! 126: switch (arg) {
! 127: case PARSE_POST:
! 128: case PARSE_GET:
! 129: case PARSE_STRING:
! 130: separator = (char *) estrdup(PG(arg_separator).input);
! 131: break;
! 132: case PARSE_COOKIE:
! 133: separator = ";\0";
! 134: break;
! 135: }
! 136:
! 137: switch(arg) {
! 138: case PARSE_POST:
! 139: MBSTRG(http_input_identify_post) = mbfl_no_encoding_invalid;
! 140: break;
! 141: case PARSE_GET:
! 142: MBSTRG(http_input_identify_get) = mbfl_no_encoding_invalid;
! 143: break;
! 144: case PARSE_COOKIE:
! 145: MBSTRG(http_input_identify_cookie) = mbfl_no_encoding_invalid;
! 146: break;
! 147: case PARSE_STRING:
! 148: MBSTRG(http_input_identify_string) = mbfl_no_encoding_invalid;
! 149: break;
! 150: }
! 151:
! 152: info.data_type = arg;
! 153: info.separator = separator;
! 154: info.force_register_globals = 0;
! 155: info.report_errors = 0;
! 156: info.to_encoding = MBSTRG(internal_encoding);
! 157: info.to_language = MBSTRG(language);
! 158: info.from_encodings = MBSTRG(http_input_list);
! 159: info.num_from_encodings = MBSTRG(http_input_list_size);
! 160: info.from_language = MBSTRG(language);
! 161:
! 162: MBSTRG(illegalchars) = 0;
! 163:
! 164: detected = _php_mb_encoding_handler_ex(&info, array_ptr, res TSRMLS_CC);
! 165: MBSTRG(http_input_identify) = detected;
! 166:
! 167: if (detected != mbfl_no_encoding_invalid) {
! 168: switch(arg){
! 169: case PARSE_POST:
! 170: MBSTRG(http_input_identify_post) = detected;
! 171: break;
! 172: case PARSE_GET:
! 173: MBSTRG(http_input_identify_get) = detected;
! 174: break;
! 175: case PARSE_COOKIE:
! 176: MBSTRG(http_input_identify_cookie) = detected;
! 177: break;
! 178: case PARSE_STRING:
! 179: MBSTRG(http_input_identify_string) = detected;
! 180: break;
! 181: }
! 182: }
! 183:
! 184: if (arg != PARSE_COOKIE) {
! 185: efree(separator);
! 186: }
! 187:
! 188: if (free_buffer) {
! 189: efree(res);
! 190: }
! 191: }
! 192: /* }}} */
! 193:
! 194: /* {{{ mbfl_no_encoding _php_mb_encoding_handler_ex() */
! 195: enum mbfl_no_encoding _php_mb_encoding_handler_ex(const php_mb_encoding_handler_info_t *info, zval *arg, char *res TSRMLS_DC)
! 196: {
! 197: char *var, *val;
! 198: const char *s1, *s2;
! 199: char *strtok_buf = NULL, **val_list = NULL;
! 200: zval *array_ptr = (zval *) arg;
! 201: int n, num, *len_list = NULL;
! 202: unsigned int val_len, new_val_len;
! 203: mbfl_string string, resvar, resval;
! 204: enum mbfl_no_encoding from_encoding = mbfl_no_encoding_invalid;
! 205: mbfl_encoding_detector *identd = NULL;
! 206: mbfl_buffer_converter *convd = NULL;
! 207: int prev_rg_state = 0;
! 208:
! 209: mbfl_string_init_set(&string, info->to_language, info->to_encoding);
! 210: mbfl_string_init_set(&resvar, info->to_language, info->to_encoding);
! 211: mbfl_string_init_set(&resval, info->to_language, info->to_encoding);
! 212:
! 213: /* register_globals stuff
! 214: * XXX: this feature is going to be deprecated? */
! 215:
! 216: if (info->force_register_globals && !(prev_rg_state = PG(register_globals))) {
! 217: zend_alter_ini_entry("register_globals", sizeof("register_globals"), "1", sizeof("1")-1, PHP_INI_PERDIR, PHP_INI_STAGE_RUNTIME);
! 218: }
! 219:
! 220: if (!res || *res == '\0') {
! 221: goto out;
! 222: }
! 223:
! 224: /* count the variables(separators) contained in the "res".
! 225: * separator may contain multiple separator chars.
! 226: */
! 227: num = 1;
! 228: for (s1=res; *s1 != '\0'; s1++) {
! 229: for (s2=info->separator; *s2 != '\0'; s2++) {
! 230: if (*s1 == *s2) {
! 231: num++;
! 232: }
! 233: }
! 234: }
! 235: num *= 2; /* need space for variable name and value */
! 236:
! 237: val_list = (char **)ecalloc(num, sizeof(char *));
! 238: len_list = (int *)ecalloc(num, sizeof(int));
! 239:
! 240: /* split and decode the query */
! 241: n = 0;
! 242: strtok_buf = NULL;
! 243: var = php_strtok_r(res, info->separator, &strtok_buf);
! 244: while (var) {
! 245: val = strchr(var, '=');
! 246: if (val) { /* have a value */
! 247: len_list[n] = php_url_decode(var, val-var);
! 248: val_list[n] = var;
! 249: n++;
! 250:
! 251: *val++ = '\0';
! 252: val_list[n] = val;
! 253: len_list[n] = php_url_decode(val, strlen(val));
! 254: } else {
! 255: len_list[n] = php_url_decode(var, strlen(var));
! 256: val_list[n] = var;
! 257: n++;
! 258:
! 259: val_list[n] = "";
! 260: len_list[n] = 0;
! 261: }
! 262: n++;
! 263: var = php_strtok_r(NULL, info->separator, &strtok_buf);
! 264: }
! 265: num = n; /* make sure to process initilized vars only */
! 266:
! 267: /* initialize converter */
! 268: if (info->num_from_encodings <= 0) {
! 269: from_encoding = mbfl_no_encoding_pass;
! 270: } else if (info->num_from_encodings == 1) {
! 271: from_encoding = info->from_encodings[0];
! 272: } else {
! 273: /* auto detect */
! 274: from_encoding = mbfl_no_encoding_invalid;
! 275: identd = mbfl_encoding_detector_new((enum mbfl_no_encoding *)info->from_encodings, info->num_from_encodings, MBSTRG(strict_detection));
! 276: if (identd) {
! 277: n = 0;
! 278: while (n < num) {
! 279: string.val = (unsigned char *)val_list[n];
! 280: string.len = len_list[n];
! 281: if (mbfl_encoding_detector_feed(identd, &string)) {
! 282: break;
! 283: }
! 284: n++;
! 285: }
! 286: from_encoding = mbfl_encoding_detector_judge(identd);
! 287: mbfl_encoding_detector_delete(identd);
! 288: }
! 289: if (from_encoding == mbfl_no_encoding_invalid) {
! 290: if (info->report_errors) {
! 291: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to detect encoding");
! 292: }
! 293: from_encoding = mbfl_no_encoding_pass;
! 294: }
! 295: }
! 296:
! 297: convd = NULL;
! 298: if (from_encoding != mbfl_no_encoding_pass) {
! 299: convd = mbfl_buffer_converter_new(from_encoding, info->to_encoding, 0);
! 300: if (convd != NULL) {
! 301: mbfl_buffer_converter_illegal_mode(convd, MBSTRG(current_filter_illegal_mode));
! 302: mbfl_buffer_converter_illegal_substchar(convd, MBSTRG(current_filter_illegal_substchar));
! 303: } else {
! 304: if (info->report_errors) {
! 305: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to create converter");
! 306: }
! 307: goto out;
! 308: }
! 309: }
! 310:
! 311: /* convert encoding */
! 312: string.no_encoding = from_encoding;
! 313:
! 314: n = 0;
! 315: while (n < num) {
! 316: string.val = (unsigned char *)val_list[n];
! 317: string.len = len_list[n];
! 318: if (convd != NULL && mbfl_buffer_converter_feed_result(convd, &string, &resvar) != NULL) {
! 319: var = (char *)resvar.val;
! 320: } else {
! 321: var = val_list[n];
! 322: }
! 323: n++;
! 324: string.val = val_list[n];
! 325: string.len = len_list[n];
! 326: if (convd != NULL && mbfl_buffer_converter_feed_result(convd, &string, &resval) != NULL) {
! 327: val = resval.val;
! 328: val_len = resval.len;
! 329: } else {
! 330: val = val_list[n];
! 331: val_len = len_list[n];
! 332: }
! 333: n++;
! 334: /* we need val to be emalloc()ed */
! 335: val = estrndup(val, val_len);
! 336: if (sapi_module.input_filter(info->data_type, var, &val, val_len, &new_val_len TSRMLS_CC)) {
! 337: /* add variable to symbol table */
! 338: php_register_variable_safe(var, val, new_val_len, array_ptr TSRMLS_CC);
! 339: }
! 340: efree(val);
! 341:
! 342: if (convd != NULL){
! 343: mbfl_string_clear(&resvar);
! 344: mbfl_string_clear(&resval);
! 345: }
! 346: }
! 347:
! 348: out:
! 349: /* register_global stuff */
! 350: if (info->force_register_globals && !prev_rg_state) {
! 351: zend_alter_ini_entry("register_globals", sizeof("register_globals"), "0", sizeof("0")-1, PHP_INI_PERDIR, PHP_INI_STAGE_RUNTIME);
! 352: }
! 353:
! 354: if (convd != NULL) {
! 355: MBSTRG(illegalchars) += mbfl_buffer_illegalchars(convd);
! 356: mbfl_buffer_converter_delete(convd);
! 357: }
! 358: if (val_list != NULL) {
! 359: efree((void *)val_list);
! 360: }
! 361: if (len_list != NULL) {
! 362: efree((void *)len_list);
! 363: }
! 364:
! 365: return from_encoding;
! 366: }
! 367: /* }}} */
! 368:
! 369: /* {{{ SAPI_POST_HANDLER_FUNC(php_mb_post_handler) */
! 370: SAPI_POST_HANDLER_FUNC(php_mb_post_handler)
! 371: {
! 372: enum mbfl_no_encoding detected;
! 373: php_mb_encoding_handler_info_t info;
! 374:
! 375: MBSTRG(http_input_identify_post) = mbfl_no_encoding_invalid;
! 376:
! 377: info.data_type = PARSE_POST;
! 378: info.separator = "&";
! 379: info.force_register_globals = 0;
! 380: info.report_errors = 0;
! 381: info.to_encoding = MBSTRG(internal_encoding);
! 382: info.to_language = MBSTRG(language);
! 383: info.from_encodings = MBSTRG(http_input_list);
! 384: info.num_from_encodings = MBSTRG(http_input_list_size);
! 385: info.from_language = MBSTRG(language);
! 386:
! 387: detected = _php_mb_encoding_handler_ex(&info, arg, SG(request_info).post_data TSRMLS_CC);
! 388:
! 389: MBSTRG(http_input_identify) = detected;
! 390: if (detected != mbfl_no_encoding_invalid) {
! 391: MBSTRG(http_input_identify_post) = detected;
! 392: }
! 393: }
! 394: /* }}} */
! 395:
! 396: #endif /* HAVE_MBSTRING */
! 397:
! 398: /*
! 399: * Local variables:
! 400: * tab-width: 4
! 401: * c-basic-offset: 4
! 402: * End:
! 403: * vim600: fdm=marker
! 404: * vim: noet sw=4 ts=4
! 405: */
! 406:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>