]> granicus.if.org Git - php/commitdiff
fix unknown opcode overflow error
authorHaitao Lv <i@lvht.net>
Mon, 12 Feb 2018 01:25:31 +0000 (09:25 +0800)
committerJoe <krakjoe@php.net>
Mon, 12 Feb 2018 08:27:55 +0000 (09:27 +0100)
Zend/zend_vm_gen.php
Zend/zend_vm_opcodes.c

index c694c94287169db6d57f99a3064e2d82a38210b9..588af86aeaa6006e23cd50bfd2d7420e91ad1431 100644 (file)
@@ -2396,7 +2396,8 @@ function gen_vm($def, $skel) {
        // Insert header
        out($f, HEADER_TEXT);
        fputs($f,"#include <stdio.h>\n");
-       fputs($f,"#include <zend.h>\n\n");
+       fputs($f,"#include <zend.h>\n");
+       fputs($f,"#include <zend_vm_opcodes.h>\n\n");
        
        fputs($f,"static const char *zend_vm_opcodes_names[".($max_opcode + 1)."] = {\n");
        for ($i = 0; $i <= $max_opcode; $i++) {
@@ -2411,10 +2412,16 @@ function gen_vm($def, $skel) {
        fputs($f, "};\n\n");
 
        fputs($f, "ZEND_API const char* ZEND_FASTCALL zend_get_opcode_name(zend_uchar opcode) {\n");
+       fputs($f, "\tif (UNEXPECTED(opcode > ZEND_VM_LAST_OPCODE)) {\n");
+       fputs($f, "\t\treturn NULL;\n");
+       fputs($f, "\t}\n");
        fputs($f, "\treturn zend_vm_opcodes_names[opcode];\n");
        fputs($f, "}\n");
 
        fputs($f, "ZEND_API uint32_t ZEND_FASTCALL zend_get_opcode_flags(zend_uchar opcode) {\n");
+       fputs($f, "\tif (UNEXPECTED(opcode > ZEND_VM_LAST_OPCODE)) {\n");
+       fputs($f, "\t\topcode = ZEND_NOP;\n");
+       fputs($f, "\t}\n");
        fputs($f, "\treturn zend_vm_opcodes_flags[opcode];\n");
        fputs($f, "}\n");
     
index a40134936d0fe9d95a734fecfafafbd1415cb93e..52b7cb855c869bd34996fee5f6a4a40aee8c9562 100644 (file)
@@ -20,6 +20,7 @@
 
 #include <stdio.h>
 #include <zend.h>
+#include <zend_vm_opcodes.h>
 
 static const char *zend_vm_opcodes_names[199] = {
        "ZEND_NOP",
@@ -426,8 +427,14 @@ static uint32_t zend_vm_opcodes_flags[199] = {
 };
 
 ZEND_API const char* ZEND_FASTCALL zend_get_opcode_name(zend_uchar opcode) {
+       if (UNEXPECTED(opcode > ZEND_VM_LAST_OPCODE)) {
+               return NULL;
+       }
        return zend_vm_opcodes_names[opcode];
 }
 ZEND_API uint32_t ZEND_FASTCALL zend_get_opcode_flags(zend_uchar opcode) {
+       if (UNEXPECTED(opcode > ZEND_VM_LAST_OPCODE)) {
+               opcode = ZEND_NOP;
+       }
        return zend_vm_opcodes_flags[opcode];
 }