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

cacher: fix segv if oplineinfo is used for __FILE __DIR

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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.