sas Fri Aug 29 08:33:48 2003 EDT
Modified files:
/php-src/ext/session session.c
Log:
Fix a segfault which occured when using a storage format not capable
of expressing references (e.g. WDDX) and deserializing a session variable
whose name conflicted with an existing symbol in the global scope.
PR: #25307
Submitted by: Jani Taskinen
Speling fixes: me
Index: php-src/ext/session/session.c
diff -u php-src/ext/session/session.c:1.374 php-src/ext/session/session.c:1.375
--- php-src/ext/session/session.c:1.374 Thu Aug 28 16:43:18 2003
+++ php-src/ext/session/session.c Fri Aug 29 08:33:47 2003
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: session.c,v 1.374 2003/08/28 20:43:18 andrey Exp $ */
+/* $Id: session.c,v 1.375 2003/08/29 12:33:47 sas Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -290,24 +290,31 @@
if (PG(register_globals)) {
zval **old_symbol;
if (zend_hash_find(&EG(symbol_table),name,namelen+1,(void
*)&old_symbol) == SUCCESS) {
+
/*
- There was an old one, we need to replace it accurately.
- hash_update in zend_set_hash_symbol is not good, because
- it will leave referenced variables (such as local instances
- of a global variable) dangling.
-
- BTW: if you use register_globals references between
- session-vars won't work because of this very reason!
+ * A global symbol with the same name exists already. That
+ * symbol might have been created by other means (e.g. $_GET).
+ *
+ * hash_update in zend_set_hash_symbol is not good, because
+ * it will leave referenced variables (such as local instances
+ * of a global variable) dangling.
+ *
+ * BTW: if you use register_globals references between
+ * session-vars won't work because of this very reason!
*/
REPLACE_ZVAL_VALUE(old_symbol,state_val,1);
- /* the following line will muck with the reference-table used
for
- * unserialisation
+ /*
+ * The following line will update the reference table used for
+ * unserialization. It is optional, because some storage
+ * formats may not be able to represent references.
*/
-
PHP_VAR_UNSERIALIZE_ZVAL_CHANGED(var_hash,state_val,*old_symbol);
+ if (var_hash) {
+
PHP_VAR_UNSERIALIZE_ZVAL_CHANGED(var_hash,state_val,*old_symbol);
+ }
zend_set_hash_symbol(*old_symbol, name, namelen, 1, 1,
Z_ARRVAL_P(PS(http_session_vars)));
} else {
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php