source: trunk/submodules/xc_disassembler.c @ 982

Last change on this file since 982 was 982, checked in by moo, 2 years ago

move files to subdirs

  • Property svn:eol-style set to native
File size: 4.6 KB
Line 
1#include "xc_disassembler.h"
2#include "xcache.h"
3#include "xc_utils.h"
4#include "xc_processor.h"
5
6static void xc_dasm(zval *output, zend_op_array *op_array TSRMLS_DC) /* {{{ */
7{
8    const Bucket *b;
9    zval *zv, *list;
10    xc_compile_result_t cr;
11    int bufsize = 2;
12    char *buf;
13    xc_dasm_t dasm;
14
15    xc_compile_result_init_cur(&cr, op_array TSRMLS_CC);
16
17    xc_apply_op_array(&cr, (apply_func_t) xc_undo_pass_two TSRMLS_CC);
18    xc_apply_op_array(&cr, (apply_func_t) xc_fix_opcode TSRMLS_CC);
19
20    /* go */
21    array_init(output);
22
23    ALLOC_INIT_ZVAL(zv);
24    array_init(zv);
25    xc_dasm_zend_op_array(&dasm, zv, op_array TSRMLS_CC);
26    add_assoc_zval_ex(output, ZEND_STRS("op_array"), zv);
27
28    buf = emalloc(bufsize);
29
30    ALLOC_INIT_ZVAL(list);
31    array_init(list);
32    for (b = xc_sandbox_user_function_begin(TSRMLS_C); b; b = b->pListNext) {
33        int keysize, keyLength;
34
35        ALLOC_INIT_ZVAL(zv);
36        array_init(zv);
37        xc_dasm_zend_function(&dasm, zv, b->pData TSRMLS_CC);
38
39        keysize = BUCKET_KEY_SIZE(b) + 2;
40        if (keysize > bufsize) {
41            do {
42                bufsize *= 2;
43            } while (keysize > bufsize);
44            buf = erealloc(buf, bufsize);
45        }
46        memcpy(buf, BUCKET_KEY_S(b), keysize);
47        buf[keysize - 2] = buf[keysize - 1] = ""[0];
48        keyLength = b->nKeyLength;
49#ifdef IS_UNICODE
50        if (BUCKET_KEY_TYPE(b) == IS_UNICODE) {
51            if (buf[0] == ""[0] && buf[1] == ""[0]) {
52                keyLength ++;
53            }
54        } else
55#endif
56        {
57            if (buf[0] == ""[0]) {
58                keyLength ++;
59            }
60        }
61
62        add_u_assoc_zval_ex(list, BUCKET_KEY_TYPE(b), ZSTR(buf), keyLength, zv);
63    }
64    add_assoc_zval_ex(output, ZEND_STRS("function_table"), list);
65   
66    ALLOC_INIT_ZVAL(list);
67    array_init(list);
68    for (b = xc_sandbox_user_class_begin(TSRMLS_C); b; b = b->pListNext) {
69        int keysize, keyLength;
70
71        ALLOC_INIT_ZVAL(zv);
72        array_init(zv);
73        xc_dasm_zend_class_entry(&dasm, zv, CestToCePtr(*(xc_cest_t *)b->pData) TSRMLS_CC);
74
75        keysize = BUCKET_KEY_SIZE(b) + 2;
76        if (keysize > bufsize) {
77            do {
78                bufsize *= 2;
79            } while (keysize > bufsize);
80            buf = erealloc(buf, bufsize);
81        }
82        memcpy(buf, BUCKET_KEY_S(b), keysize);
83        buf[keysize - 2] = buf[keysize - 1] = ""[0];
84        keyLength = b->nKeyLength;
85#ifdef IS_UNICODE
86        if (BUCKET_KEY_TYPE(b) == IS_UNICODE) {
87            if (buf[0] == ""[0] && buf[1] == ""[0]) {
88                keyLength ++;
89            }
90        } else
91#endif
92        {
93            if (buf[0] == ""[0]) {
94                keyLength ++;
95            }
96        }
97        add_u_assoc_zval_ex(list, BUCKET_KEY_TYPE(b), ZSTR(buf), keyLength, zv);
98    }
99    efree(buf);
100    add_assoc_zval_ex(output, ZEND_STRS("class_table"), list);
101
102    /*xc_apply_op_array(&cr, (apply_func_t) xc_redo_pass_two TSRMLS_CC);*/
103    xc_compile_result_free(&cr);
104}
105/* }}} */
106typedef struct xc_dasm_sandboxed_t { /* {{{ */
107    enum Type {
108        xc_dasm_file_t
109        , xc_dasm_string_t
110    } type;
111    union {
112        zval *zfilename;
113        struct {
114            zval *source;
115            char *eval_name;
116        } compile_string;
117    } input;
118
119    zval *output;
120} xc_dasm_sandboxed_t; /* {{{ */
121
122zend_op_array *xc_dasm_sandboxed(void *data TSRMLS_DC)
123{
124    zend_bool catched = 0;
125    zend_op_array *op_array = NULL;
126    xc_dasm_sandboxed_t *sandboxed_dasm = (xc_dasm_sandboxed_t *) data;
127
128    zend_try {
129        if (sandboxed_dasm->type == xc_dasm_file_t) {
130            op_array = compile_filename(ZEND_REQUIRE, sandboxed_dasm->input.zfilename TSRMLS_CC);
131        }
132        else {
133            op_array = compile_string(sandboxed_dasm->input.compile_string.source, sandboxed_dasm->input.compile_string.eval_name TSRMLS_CC);
134        }
135    } zend_catch {
136        catched = 1;
137    } zend_end_try();
138
139    if (catched || !op_array) {
140#define return_value sandboxed_dasm->output
141        RETVAL_FALSE;
142#undef return_value
143        return NULL;
144    }
145
146    xc_dasm(sandboxed_dasm->output, op_array TSRMLS_CC);
147
148    /* free */
149#ifdef ZEND_ENGINE_2
150    destroy_op_array(op_array TSRMLS_CC);
151#else
152    destroy_op_array(op_array);
153#endif
154    efree(op_array);
155
156    return NULL;
157} /* }}} */
158void xc_dasm_string(zval *output, zval *source TSRMLS_DC) /* {{{ */
159{
160    xc_dasm_sandboxed_t sandboxed_dasm;
161    char *eval_name = zend_make_compiled_string_description("runtime-created function" TSRMLS_CC);
162
163    sandboxed_dasm.output = output;
164    sandboxed_dasm.type = xc_dasm_string_t;
165    sandboxed_dasm.input.compile_string.source = source;
166    sandboxed_dasm.input.compile_string.eval_name = eval_name;
167    xc_sandbox(&xc_dasm_sandboxed, (void *) &sandboxed_dasm, eval_name TSRMLS_CC);
168    efree(eval_name);
169}
170/* }}} */
171void xc_dasm_file(zval *output, const char *filename TSRMLS_DC) /* {{{ */
172{
173    zval *zfilename;
174    xc_dasm_sandboxed_t sandboxed_dasm;
175
176    MAKE_STD_ZVAL(zfilename);
177    zfilename->value.str.val = estrdup(filename);
178    zfilename->value.str.len = strlen(filename);
179    zfilename->type = IS_STRING;
180
181    sandboxed_dasm.output = output;
182    sandboxed_dasm.type = xc_dasm_file_t;
183    sandboxed_dasm.input.zfilename = zfilename;
184    xc_sandbox(&xc_dasm_sandboxed, (void *) &sandboxed_dasm, zfilename->value.str.val TSRMLS_CC);
185
186    zval_dtor(zfilename);
187    FREE_ZVAL(zfilename);
188}
189/* }}} */
Note: See TracBrowser for help on using the repository browser.