From ac7ed464b5f85b1aff8224f061baa9b954abff7f Mon Sep 17 00:00:00 2001 From: Andi Gutmans Date: Sun, 16 Dec 2001 19:45:49 +0000 Subject: [PATCH] - Start adding parsed variable checks. --- Zend/zend_compile.c | 22 ++++++++++++++++++++++ Zend/zend_compile.h | 2 ++ Zend/zend_language_parser.y | 7 ++++--- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 0b753f23d6..b74946b96f 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -528,6 +528,28 @@ void zend_do_if_end(TSRMLS_D) DEC_BPC(CG(active_op_array)); } +#if 0 +/* variable parsing type (compile-time) */ +#define ZEND_PARSED_MEMBER (1<<0) +#define ZEND_PARSED_METHOD_CALL (1<<1) +#define ZEND_PARSED_STATIC_MEMBER (1<<2) +#define ZEND_PARSED_FUNCTION_CALL (1<<3) +#define ZEND_PARSED_VARIABLE (1<<4) + +#endif + +void zend_check_writable_variable(znode *variable) +{ + zend_uint type = variable->u.EA.type; + + if (type & ZEND_PARSED_METHOD_CALL) { + zend_error(E_ERROR, "Can't use method return value in write context"); + } + if ((type & ZEND_PARSED_FUNCTION_CALL) && + !(type & (ZEND_PARSED_METHOD_CALL|ZEND_PARSED_MEMBER))) { + zend_error(E_ERROR, "Can't use function return value in write context"); + } +} zend_bool zend_variable_buffer_empty(TSRMLS_D) { diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index 76dd43e7a2..a7c8b9159a 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -259,6 +259,8 @@ void zend_do_post_incdec(znode *result, znode *op1, int op TSRMLS_DC); void zend_do_begin_variable_parse(TSRMLS_D); void zend_do_end_variable_parse(int type, int arg_offset TSRMLS_DC); +void zend_check_writable_variable(znode *variable); + void zend_do_free(znode *op1 TSRMLS_DC); void zend_do_init_string(znode *result TSRMLS_DC); diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y index 09764324e1..01057699cb 100644 --- a/Zend/zend_language_parser.y +++ b/Zend/zend_language_parser.y @@ -613,12 +613,13 @@ r_cvar: w_cvar: - cvar { zend_do_end_variable_parse(BP_VAR_W, 0 TSRMLS_CC); $$ = $1; } + cvar { zend_do_end_variable_parse(BP_VAR_W, 0 TSRMLS_CC); $$ = $1; } + { zend_check_writable_variable(&$$); } ; - rw_cvar: - cvar { zend_do_end_variable_parse(BP_VAR_RW, 0 TSRMLS_CC); $$ = $1; } + cvar { zend_do_end_variable_parse(BP_VAR_RW, 0 TSRMLS_CC); $$ = $1; } + { zend_check_writable_variable(&$$); } ; r_cvar_without_static_member: -- 2.50.1