Annotation of embedaddon/php/ext/mbstring/mb_gpc.c, revision 1.1.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>