summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHaitao Lv <i@lvht.net>2018-02-12 09:25:31 +0800
committerJoe <krakjoe@php.net>2018-02-12 09:27:55 +0100
commit5206f79987e8db041e5580f70f60ad0ed2d1cad7 (patch)
treeb4f26a348781697b0bfc81030041a4fde96ff791
parent3253057021143c7336d03265682200482e5bf996 (diff)
downloadphp-git-5206f79987e8db041e5580f70f60ad0ed2d1cad7.tar.gz
fix unknown opcode overflow error
-rw-r--r--Zend/zend_vm_gen.php9
-rw-r--r--Zend/zend_vm_opcodes.c7
2 files changed, 15 insertions, 1 deletions
diff --git a/Zend/zend_vm_gen.php b/Zend/zend_vm_gen.php
index c694c94287..588af86aea 100644
--- a/Zend/zend_vm_gen.php
+++ b/Zend/zend_vm_gen.php
@@ -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");
diff --git a/Zend/zend_vm_opcodes.c b/Zend/zend_vm_opcodes.c
index a40134936d..52b7cb855c 100644
--- a/Zend/zend_vm_opcodes.c
+++ b/Zend/zend_vm_opcodes.c
@@ -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];
}