5
5
from construct import *
6
6
from definitions import *
7
7
8
+ meta = None
9
+
8
10
def unserialize_zend_function ():
9
11
return Zend_Op_Array ("op_array" )
10
12
@@ -30,8 +32,11 @@ def Z_Val(name, callback = None, unserialize = True):
30
32
ULInt32 ("u2" ),
31
33
32
34
If (lambda z : z .u1 .type == 6 and unserialize ,
33
- Pointer (lambda z : z .value .w1 + Struct .sizeof (Meta ), Zend_String ("string" ))
34
- ),
35
+ OnDemand (Pointer (lambda z : (z .value .w1 & ~ 1 ) +
36
+ (meta ['mem_size' ] if meta ['str_size' ] != 0 else 0 ) +
37
+ Struct .sizeof (Meta ),
38
+ Zend_String ("string" ))
39
+ )),
35
40
If (lambda z : z .u1 .type == 17 and unserialize ,
36
41
Pointer (lambda z : z .value .w1 + Struct .sizeof (Meta ), callback ()))
37
42
)
@@ -42,7 +47,7 @@ def Pointer_To(name, structure):
42
47
ULInt32 ("position" ),
43
48
IfThenElse (structure .name , lambda z : z .position == 0 ,
44
49
Empty (),
45
- Pointer (lambda z : z .position + Struct .sizeof (Meta ), structure ))
50
+ Pointer (lambda z : ( z .position & ~ 1 ) + Struct .sizeof (Meta ), structure ))
46
51
)
47
52
48
53
def Zend_Class_Entry (name ):
@@ -99,7 +104,8 @@ def Hash_Table(name, callback = None):
99
104
Pointer (lambda z : z .bucket_pos + Struct .sizeof (Meta ),
100
105
Array (lambda z : z .nNumUsed ,
101
106
Bucket ("buckets" , callback )
102
- )))
107
+ ))
108
+ )
103
109
104
110
def Zend_Value (name ):
105
111
return Struct (name ,
@@ -172,8 +178,8 @@ def Zend_Op_Array(name):
172
178
Pointer (lambda z : z .vars_pos_pos + Struct .sizeof (Meta ),
173
179
Array (lambda z : z .last_var ,
174
180
Struct ("vars" ,
175
- ULInt32 ("pos" ),
176
- Pointer (lambda v : v .pos + Struct .sizeof (Meta ), Zend_String ("var" )))
181
+ ULInt32 ("pos" ))
182
+ # Pointer(lambda v: v.pos + Struct.sizeof(Meta), Zend_String("var")))
177
183
)
178
184
),
179
185
ULInt32 ("last_live_range" ),
@@ -306,7 +312,7 @@ def parse_zval(self, offset, op_type):
306
312
# Interpret the z_val
307
313
if op_type == IS_CONST :
308
314
if type == IS_STRING :
309
- return repr (Zend_String ("val" ).parse (self .stream [w1 + size_of_meta :])['val' ])
315
+ return repr (Zend_String ("val" ).parse (self .stream [( w1 & ~ 1 ) + ( meta [ 'mem_size' ] if meta [ 'str_size' ] != 0 else 0 ) + size_of_meta :])['val' ])
310
316
311
317
if type == IS_LONG :
312
318
return str (w1 )
@@ -344,6 +350,9 @@ def __init__(self, file_path):
344
350
345
351
self .parsed = OPcacheParser .parse_stream (self .stream )
346
352
353
+ global meta
354
+ meta = self .parsed ['meta' ]
355
+
347
356
def __getitem__ (self , index ):
348
357
return self .parsed [index ]
349
358
0 commit comments