Changeset 784 in svn for branches/1.3


Ignore:
Timestamp:
2011-04-22T17:18:42+02:00 (4 years ago)
Author:
Xuefer
Message:

merge from trunk

Location:
branches/1.3
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • branches/1.3

  • branches/1.3/ChangeLog

    r766 r784  
    111.3.2 2011-??-??
    22========
     3 * avoid possible filename injection in admin page
    34 * adds 30 seconds timeout to "compiling" flag
    45 * decompiler: improves decompiling
  • branches/1.3/Decompiler.class.php

    r766 r784  
    737737        $EX['last'] = count($opcodes) - 1;
    738738        $EX['silence'] = 0;
     739        $EX['recvs'] = array();
     740        $EX['uses'] = array();
    739741
    740742        for ($next = 0, $last = $EX['last'];
     
    11391141                        break;
    11401142                    }
     1143                    if (is_a($rvalue, 'Decompiler_Fetch')) {
     1144                        $src = str($rvalue->src, $EX);
     1145                        if ('$' . unquoteName($src) == $lvalue) {
     1146                            switch ($rvalue->fetchType) {
     1147                            case ZEND_FETCH_STATIC:
     1148                                $statics = &$EX['op_array']['static_variables'];
     1149                                if ((xcache_get_type($statics[$name]) & IS_LEXICAL_VAR)) {
     1150                                    $EX['uses'][] = str($lvalue);
     1151                                    unset($statics);
     1152                                    break 2;
     1153                                }
     1154                                unset($statics);
     1155                            }
     1156                        }
     1157                    }
    11411158                    $resvar = "$lvalue = " . str($rvalue, $EX);
    11421159                    break;
     
    11551172                            case ZEND_FETCH_STATIC:
    11561173                                $statics = &$EX['op_array']['static_variables'];
     1174                                if ((xcache_get_type($statics[$name]) & IS_LEXICAL_REF)) {
     1175                                    $EX['uses'][] = '&' . str($lvalue);
     1176                                    unset($statics);
     1177                                    break 2;
     1178                                }
     1179
    11571180                                $resvar = 'static ' . $lvalue;
    11581181                                $name = unquoteName($src);
     
    12031226                    if ($opc == XC_ISSET_ISEMPTY_VAR) {
    12041227                        $rvalue = $this->getOpVal($op1, $EX);
     1228                        // for < PHP_5_3
     1229                        if ($op1['op_type'] == XC_IS_CONST) {
     1230                            $rvalue = '$' . unquoteVariableName($this->getOpVal($op1, $EX));
     1231                        }
    12051232                        if ($op2['EA.type'] == ZEND_FETCH_STATIC_MEMBER) {
    12061233                            $class = $this->getOpVal($op2, $EX);
     
    12271254                    switch ((!ZEND_ENGINE_2 ? $op['op2']['var'] /* constant */ : $ext) & (ZEND_ISSET|ZEND_ISEMPTY)) {
    12281255                    case ZEND_ISSET:
    1229                         $rvalue = "isset($rvalue)";
     1256                        $rvalue = "isset(" . str($rvalue) . ")";
    12301257                        break;
    12311258                    case ZEND_ISEMPTY:
    1232                         $rvalue = "empty($rvalue)";
     1259                        $rvalue = "empty(" . str($rvalue) . ")";
    12331260                        break;
    12341261                    }
     
    18381865    }
    18391866    // }}}
     1867    function duses(&$EX, $indent) // {{{
     1868    {
     1869        if ($EX['uses']) {
     1870            echo ' use(', implode(', ', $EX['uses']), ')';
     1871        }
     1872    }
     1873    // }}}
    18401874    function dfunction($func, $indent = '', $nobody = false) // {{{
    18411875    {
     
    18461880            $EX['op_array'] = &$func['op_array'];
    18471881            $EX['recvs'] = array();
     1882            $EX['uses'] = array();
    18481883        }
    18491884        else {
     
    18521887            $EX = &$this->dop_array($func['op_array'], $newindent);
    18531888            $body = ob_get_clean();
    1854             if (!isset($EX['recvs'])) {
    1855                 $EX['recvs'] = array();
    1856             }
    18571889        }
    18581890
     
    18611893            $functionName = '';
    18621894        }
    1863         echo 'function ', $functionName, '(';
     1895        echo 'function', $functionName ? ' ' . $functionName : '', '(';
    18641896        $this->dargs($EX, $indent);
    18651897        echo ")";
     1898        $this->duses($EX, $indent);
    18661899        if ($nobody) {
    18671900            echo ";\n";
     
    22312264define('IS_CONSTANT', 8);
    22322265define('IS_CONSTANT_ARRAY',   9);
     2266/* Ugly hack to support constants as static array indices */
     2267define('IS_CONSTANT_TYPE_MASK',   0x0f);
     2268define('IS_CONSTANT_UNQUALIFIED', 0x10);
     2269define('IS_CONSTANT_INDEX',       0x80);
     2270define('IS_LEXICAL_VAR',          0x20);
     2271define('IS_LEXICAL_REF',          0x40);
    22332272
    22342273@define('XC_IS_CV', 16);
  • branches/1.3/NEWS

    r766 r784  
    111.3.2 2011-??-??
    22========
     3 * admin page security fix
    34 * adds 30 seconds timeout to "compiling" flag
    45 * improves decompiling
  • branches/1.3/admin/common.php

    r625 r784  
    11<?php
     2
     3function xcache_validateFileName($name)
     4{
     5    return preg_match('!^[a-zA-Z0-9._-]+$!', $name);
     6}
    27
    38function get_language_file_ex($name, $l, $s)
     
    1621        $l = $lmap[$l];
    1722    }
    18     if (file_exists($file = "$name-$l-$s.lang.php")) {
     23    $file = "$name-$l-$s.lang.php";
     24    if (xcache_validateFileName($file) && file_exists($file)) {
    1925        return $file;
    2026    }
    2127    if (isset($smap[$s])) {
    2228        $s = $smap[$s];
    23         if (file_exists($file = "$name-$l-$s.lang.php")) {
     29        $file = "$name-$l-$s.lang.php";
     30        if (xcache_validateFileName($file) && file_exists($file)) {
    2431            return $file;
    2532        }
    2633    }
    27     if (file_exists($file = "$name-$l.lang.php")) {
     34    $file = "$name-$l.lang.php";
     35    if (xcache_validateFileName($file) && file_exists($file)) {
    2836        return $file;
    2937    }
     
    3947        $file = get_language_file_ex($name, $l, $s);
    4048        if (!isset($file)) {
    41             $l = strtok($l, '-');
     49            $l = strtok($l, ':-');
    4250            $file = get_language_file_ex($name, $l, $s);
    4351        }
     
    4553    else if (!empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
    4654        foreach (explode(',', str_replace(' ', '', $_SERVER['HTTP_ACCEPT_LANGUAGE'])) as $l) {
    47             $l = strtok($l, ';');
     55            $l = strtok($l, ':;');
    4856            $file = get_language_file_ex($name, $l, $s);
    4957            if (isset($file)) {
     
    5260            }
    5361            if (strpos($l, '-') !== false) {
    54                 $ll = strtok($l, '-');
     62                $ll = strtok($l, ':-');
    5563                $file = get_language_file_ex($name, $ll, $s);
    5664                if (isset($file)) {
  • branches/1.3/decompilesample.php

    r766 r784  
    360360$total = 0;
    361361$tax = 1;
    362 $callback = function ($quantity, $product) use ($tax, &$total) {
    363     static $static = array(1);
     362$callback = function($quantity, $product) use($tax, &$total) {
    364363    $tax = 'tax';
     364    static $static1 = array(1);
     365    static $static2;
     366    $tax = 'tax';
     367    $tax = --$tax;
    365368    $pricePerItem = constant('PRICE_' . strtoupper($product));
    366369    $total += $pricePerItem * $quantity * ($tax + 1);
  • branches/1.3/opcode_spec_def.h

    r726 r784  
    147147    OPSPEC(    UNUSED,      VAR_2,        STD,        VAR) /* 97 FETCH_OBJ_UNSET                */
    148148    OPSPEC(    UNUSED,        STD,        STD,        VAR) /* 98 FETCH_DIM_TMP_VAR              */
    149 #ifdef ZEND_ENGINE_2
     149#ifdef ZEND_ENGINE_2_3
     150    OPSPEC(    UNUSED,      VAR_2,        STD,        TMP) /* 99 FETCH_CONSTANT                 */
     151#elif defined(ZEND_ENGINE_2)
    150152    OPSPEC(    UNUSED,     UCLASS,        STD,        TMP) /* 99 FETCH_CONSTANT                 */
    151153#else
  • branches/1.3/utils.c

    r772 r784  
    244244            case IS_TMP_VAR:
    245245                break;
    246 
    247             case IS_CONST:
    248                 if (spec == OPSPEC_UCLASS) {
    249                     break;
    250                 }
    251                 /* fall */
    252246
    253247            default:
  • branches/1.3/xcache.c

    r766 r784  
    22802280}
    22812281/* }}} */
     2282/* {{{ proto int xcache_get_refcount(mixed variable)
     2283   XCache internal uses only: Get reference count of variable */
     2284PHP_FUNCTION(xcache_get_refcount)
     2285{
     2286    zval *variable;
     2287    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &variable) == FAILURE) {
     2288        RETURN_NULL();
     2289    }
     2290
     2291    RETURN_LONG(Z_REFCOUNT_P(variable));
     2292}
     2293/* }}} */
     2294/* {{{ proto bool xcache_get_isref(mixed variable)
     2295   XCache internal uses only: Check if variable data is marked referenced */
     2296ZEND_BEGIN_ARG_INFO_EX(arginfo_xcache_get_isref, 0, 0, 1)
     2297    ZEND_ARG_INFO(1, variable)
     2298ZEND_END_ARG_INFO()
     2299
     2300PHP_FUNCTION(xcache_get_isref)
     2301{
     2302    zval *variable;
     2303    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &variable) == FAILURE) {
     2304        RETURN_NULL();
     2305    }
     2306
     2307    RETURN_BOOL(Z_ISREF_P(variable) && Z_REFCOUNT_P(variable) >= 3);
     2308}
     2309/* }}} */
    22822310#ifdef HAVE_XCACHE_DPRINT
    22832311/* {{{ proto bool  xcache_dprint(mixed value)
     
    24282456/* }}} */
    24292457#endif
    2430 /* {{{ proto mixed xcache_get_special_value(zval value) */
     2458/* {{{ proto mixed xcache_get_special_value(zval value)
     2459   XCache internal use only: For decompiler to get static value with type fixed */
    24312460PHP_FUNCTION(xcache_get_special_value)
    24322461{
     
    24532482        RETURN_NULL();
    24542483    }
     2484}
     2485/* }}} */
     2486/* {{{ proto int xcache_get_type(zval value)
     2487   XCache internal use only for disassembler to get variable type in engine level */
     2488PHP_FUNCTION(xcache_get_type)
     2489{
     2490    zval *value;
     2491
     2492    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &value) == FAILURE) {
     2493        return;
     2494    }
     2495
     2496    RETURN_LONG(Z_TYPE_P(value));
    24552497}
    24562498/* }}} */
     
    25072549#endif
    25082550    PHP_FE(xcache_get_special_value, NULL)
     2551    PHP_FE(xcache_get_type,          NULL)
    25092552    PHP_FE(xcache_get_op_type,       NULL)
    25102553    PHP_FE(xcache_get_data_type,     NULL)
     
    25212564    PHP_FE(xcache_unset,             NULL)
    25222565    PHP_FE(xcache_unset_by_prefix,   NULL)
     2566    PHP_FE(xcache_get_refcount,      NULL)
     2567    PHP_FE(xcache_get_isref,         arginfo_xcache_get_isref)
    25232568#ifdef HAVE_XCACHE_DPRINT
    25242569    PHP_FE(xcache_dprint,            NULL)
Note: See TracChangeset for help on using the changeset viewer.