Changeset 779


Ignore:
Timestamp:
2011-04-22T09:51:38+02:00 (3 years ago)
Author:
moo
Message:

cacher: fix segv if oplineinfo is used for __FILE __DIR

Location:
trunk/processor
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/processor/head.m4

    r770 r779  
    7373    zend_uint cache_class_index; 
    7474 
     75#ifndef NDEBUG 
     76    const zend_op_array    *active_op_array_src; 
     77    zend_op_array          *active_op_array_dst; 
     78#endif 
    7579    const zend_op          *active_opcodes_src; 
    7680    zend_op                *active_opcodes_dst; 
  • trunk/processor/processor.m4

    r771 r779  
    612612#endif 
    613613            case ZEND_JMP: 
     614                assert(Z_OP(src->op1).jmp_addr > processor->active_opcodes_src && Z_OP(src->op1).jmp_addr - processor->active_opcodes_src < processor->active_op_array_src->last); 
    614615                Z_OP(dst->op1).jmp_addr = processor->active_opcodes_dst + (Z_OP(src->op1).jmp_addr - processor->active_opcodes_src); 
     616                assert(Z_OP(dst->op1).jmp_addr > processor->active_opcodes_dst && Z_OP(dst->op1).jmp_addr - processor->active_opcodes_dst < processor->active_op_array_dst->last); 
    615617                break; 
    616618 
     
    622624            case ZEND_JMP_SET: 
    623625#endif 
     626                assert(Z_OP(src->op2).jmp_addr > processor->active_opcodes_src && Z_OP(src->op2).jmp_addr - processor->active_opcodes_src < processor->active_op_array_src->last); 
    624627                Z_OP(dst->op2).jmp_addr = processor->active_opcodes_dst + (Z_OP(src->op2).jmp_addr - processor->active_opcodes_src); 
     628                assert(Z_OP(dst->op2).jmp_addr > processor->active_opcodes_dst && Z_OP(dst->op2).jmp_addr - processor->active_opcodes_dst < processor->active_op_array_dst->last); 
    625629                break; 
    626630 
     
    668672#ifndef ZEND_ENGINE_2_4 
    669673        if (op_array_info->oplineinfo_cnt) { 
     674            zend_op *opline, *end; 
    670675            gc_opcodes = 1; 
    671676            COPY_N_EX(last, zend_op, opcodes) 
     677 
     678            for (opline = dst->opcodes, end = opline + src->last; opline < end; ++opline) { 
     679                switch (opline->opcode) { 
     680#ifdef ZEND_GOTO 
     681                    case ZEND_GOTO: 
     682#endif 
     683                    case ZEND_JMP: 
     684                        Z_OP(opline->op1).jmp_addr = dst->opcodes + (Z_OP(opline->op1).jmp_addr - src->opcodes); 
     685                        break; 
     686 
     687                    case ZEND_JMPZ: 
     688                    case ZEND_JMPNZ: 
     689                    case ZEND_JMPZ_EX: 
     690                    case ZEND_JMPNZ_EX: 
     691#ifdef ZEND_JMP_SET 
     692                    case ZEND_JMP_SET: 
     693#endif 
     694                        Z_OP(opline->op2).jmp_addr = dst->opcodes + (Z_OP(opline->op2).jmp_addr - src->opcodes); 
     695                        break; 
     696 
     697                    default: 
     698                        break; 
     699                } 
     700            } 
    672701        } 
    673702#endif 
     
    743772 
    744773    pushdef(`AFTER_ALLOC', `IFCOPY(` 
     774#ifndef NDEBUG 
     775        processor->active_op_array_dst = dst; 
     776        processor->active_op_array_src = src; 
     777#endif 
    745778        processor->active_opcodes_dst = dst->opcodes; 
    746779        processor->active_opcodes_src = src->opcodes; 
Note: See TracChangeset for help on using the changeset viewer.