Changeset 784


Ignore:
Timestamp:
2011-04-22T17:18:42+02:00 (3 years ago)
Author:
moo
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.