cvs: /php3 ChangeLog language-parser.y /php3/functions xml.c
| From: | Zeev Suraski | Date: | Mon, 07 Feb 2000 23:48:09 +0000 |
| Subject: | cvs: /php3 ChangeLog language-parser.y /php3/functions xml.c | ||
| Groups: | php.dev | ||
| Request: | Send a blank email to php-dev+get-15287@lists.php.net to get a copy of this message | ||
zeev Mon Feb 7 15:48:09 2000 EDT
Modified files:
/php3 ChangeLog language-parser.y
/php3/functions xml.c
Log:
Unbelievable, language-parser.y actually gets a year 2000 commit!
- Fix an historical bug in call_user_function()
- Fix XML module interface with call_user_function() - if it returns FAILURE,
you may not assume that the return_value is valid.
Index: php3/ChangeLog
diff -u php3/ChangeLog:1.819 php3/ChangeLog:1.820
--- php3/ChangeLog:1.819 Sun Feb 6 07:16:17 2000
+++ php3/ChangeLog Mon Feb 7 15:48:09 2000
@@ -2,6 +2,10 @@
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
???, Version 3.0.15
+- Fixed a bug in the XML module that could cause crashes (Zeev)
+- Fixed a long historical bug in the API function call_user_function(),
+ that could cause crashes in functions that made use of it (e.g.,
+ XML module functions) (Zeev)
- Fixed possible buffer-overflow in base64_decode(). (Thies)
- Fixed possible buffer-overflow in setcookie(). (Thies)
- Added ImageWbmp() for outputting WAP's Wireless Bitmaps (markonen)
Index: php3/language-parser.y
diff -u php3/language-parser.y:1.182 php3/language-parser.y:1.183
--- php3/language-parser.y:1.182 Fri Dec 31 20:48:04 1999
+++ php3/language-parser.y Mon Feb 7 15:48:09 2000
@@ -31,7 +31,7 @@
*/
-/* $Id: language-parser.y,v 1.182 2000/01/01 04:48:04 sas Exp $ */
+/* $Id: language-parser.y,v 1.183 2000/02/07 23:48:09 zeev Exp $ */
/*
@@ -739,15 +739,26 @@
int original_shutdown_requested=GLOBAL(shutdown_requested);
int original_execute_flag = GLOBAL(ExecuteFlag);
FunctionState original_function_state = GLOBAL(function_state);
+ pval p_function_name;
+ if (GLOBAL(shutdown_requested)==ABNORMAL_SHUTDOWN) {
+ return FAILURE;
+ }
+
/* save the location to go back to */
return_offset.offset = tc_get_current_offset(&GLOBAL(token_cache_manager))-1;
if (object) {
function_table = object->value.ht;
}
- php3_str_tolower(function_name->value.str.val, function_name->value.str.len);
- if (_php3_hash_find(function_table, function_name->value.str.val,
function_name->value.str.len+1, (void **) &func)==FAILURE
+
+ /* if phpparse() triggers shutdown, function_name would get erased, so it'd end up
+ * being freed twice. Avoid this.
+ */
+ p_function_name = *function_name;
+ pval_copy_constructor(&p_function_name);
+ php3_str_tolower(p_function_name.value.str.val, p_function_name.value.str.len);
+ if (_php3_hash_find(function_table, p_function_name.value.str.val,
p_function_name.value.str.len+1, (void **) &func)==FAILURE
|| func->type != IS_USER_FUNCTION) {
return FAILURE;
}
@@ -756,25 +767,27 @@
GLOBAL(shutdown_requested) = 0;
GLOBAL(function_state).loop_nest_level = GLOBAL(function_state).loop_change_level =
GLOBAL(function_state).loop_change_type = 0;
GLOBAL(function_state).returned = 0;
+ GLOBAL(function_state).function_name = p_function_name.value.str.val;
GLOBAL(ExecuteFlag) = EXECUTE;
GLOBAL(Execute) = SHOULD_EXECUTE;
tc_set_token(&token_cache_manager, func->offset, IC_FUNCTION);
if (object) {
class_ptr.value.varptr.pvalue = object;
- cs_functioncall_pre_variable_passing(function_name, &class_ptr, 0 _INLINE_TLS);
+ cs_functioncall_pre_variable_passing(&p_function_name, &class_ptr, 0 _INLINE_TLS);
} else {
- cs_functioncall_pre_variable_passing(function_name,NULL, 0 _INLINE_TLS);
+ cs_functioncall_pre_variable_passing(&p_function_name,NULL, 0 _INLINE_TLS);
}
for (i=0; i<param_count; i++) {
_php3_hash_next_index_pointer_insert(GLOBAL(function_state).function_symbol_table, params[i]);
}
- cs_functioncall_post_variable_passing(function_name, NULL);
+ cs_functioncall_post_variable_passing(&p_function_name, NULL);
phpparse();
if (GLOBAL(shutdown_requested)) { /* we died during this function call */
return FAILURE;
}
- cs_functioncall_end(retval,function_name,&return_offset,NULL,0);
+ cs_functioncall_end(retval,&p_function_name,&return_offset,NULL,0);
+ pval_destructor(&p_function_name);
GLOBAL(function_state) = original_function_state;
GLOBAL(ExecuteFlag) = original_execute_flag;
GLOBAL(shutdown_requested) = original_shutdown_requested;
Index: php3/functions/xml.c
diff -u php3/functions/xml.c:1.32 php3/functions/xml.c:1.33
--- php3/functions/xml.c:1.32 Fri Dec 31 20:31:17 1999
+++ php3/functions/xml.c Mon Feb 7 15:48:09 2000
@@ -27,7 +27,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: xml.c,v 1.32 2000/01/01 04:31:17 sas Exp $ */
+/* $Id: xml.c,v 1.33 2000/02/07 23:48:09 zeev Exp $ */
#define IS_EXT_MODULE
#if COMPILE_DL
# include "dl/phpdl.h"
@@ -336,7 +336,7 @@
Instead, we create a callback function. */
function_table=php3i_get_function_table();
if (call_user_function(function_table, NULL, func, retval, argc, argv) == FAILURE) {
- php3tls_pval_destructor(retval);
+ /*php3tls_pval_destructor(retval);*/
efree(retval);
return NULL;
}