cvs: ZendEngine2(PHP_5_3) / zend_execute.c zend_vm_def.h zend_vm_execute.h

[email protected] ("Dmitry Stogov")
Newsgroups php.zend-engine.cvs
Message-ID <cvsdmitry1204625215@cvsserver>
dmitry		Tue Mar  4 10:06:55 2008 UTC

  Modified files:              (Branch: PHP_5_3)
    /ZendEngine2	zend_execute.c zend_vm_def.h zend_vm_execute.h 
  Log:
  Fixed wrong result of cascading assignment to string offset
  Fixed memory corruption on cascading assignment of IS_TMP_VAR into string offset
  Fixed opcode caches shared memory corruption on cascading assignment of IS_CONST
   into string offset
dmitry-20080304100655.txt (text/plain, 29.9 KB)
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_execute.c?r1=1.716.2.12.2.24.2.20&r2=1.716.2.12.2.24.2.21&diff_format=u
Index: ZendEngine2/zend_execute.c
diff -u ZendEngine2/zend_execute.c:1.716.2.12.2.24.2.20 ZendEngine2/zend_execute.c:1.716.2.12.2.24.2.21
--- ZendEngine2/zend_execute.c:1.716.2.12.2.24.2.20	Mon Feb 18 12:11:47 2008
+++ ZendEngine2/zend_execute.c	Tue Mar  4 10:06:51 2008
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_execute.c,v 1.716.2.12.2.24.2.20 2008/02/18 12:11:47 dmitry Exp $ */
+/* $Id: zend_execute.c,v 1.716.2.12.2.24.2.21 2008/03/04 10:06:51 dmitry Exp $ */
 
 #define ZEND_INTENSIVE_DEBUGGING 0
 
@@ -626,13 +626,13 @@
 	FREE_OP_IF_VAR(free_value);
 }
 
-static inline void zend_assign_to_string_offset(temp_variable *T, zval *value, int value_type TSRMLS_DC)
+static inline int zend_assign_to_string_offset(temp_variable *T, zval *value, int value_type TSRMLS_DC)
 {
 	if (Z_TYPE_P(T->str_offset.str) == IS_STRING) {
 
 		if (((int)T->str_offset.offset < 0)) {
 			zend_error(E_WARNING, "Illegal string offset:  %d", T->str_offset.offset);
-			return;
+			return 0;
 		}
 
 		if (T->str_offset.offset >= Z_STRLEN_P(T->str_offset.str)) {
@@ -667,6 +667,7 @@
 		T(result->u.var).var = &T->str_offset.str;
 		*/
 	}
+	return 1;
 }
 
 static inline zval* zend_assign_to_variable(zval **variable_ptr_ptr, zval *value, int is_tmp_var TSRMLS_DC)
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_vm_def.h?r1=1.59.2.29.2.48.2.38&r2=1.59.2.29.2.48.2.39&diff_format=u
Index: ZendEngine2/zend_vm_def.h
diff -u ZendEngine2/zend_vm_def.h:1.59.2.29.2.48.2.38 ZendEngine2/zend_vm_def.h:1.59.2.29.2.48.2.39
--- ZendEngine2/zend_vm_def.h:1.59.2.29.2.48.2.38	Sat Feb 23 17:06:20 2008
+++ ZendEngine2/zend_vm_def.h	Tue Mar  4 10:06:52 2008
@@ -18,7 +18,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_vm_def.h,v 1.59.2.29.2.48.2.38 2008/02/23 17:06:20 helly Exp $ */
+/* $Id: zend_vm_def.h,v 1.59.2.29.2.48.2.39 2008/03/04 10:06:52 dmitry Exp $ */
 
 /* If you change this file, please regenerate the zend_vm_execute.h and
  * zend_vm_opcodes.h files by running:
@@ -1544,13 +1544,23 @@
 		value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
 		variable_ptr_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
 		if (!variable_ptr_ptr) {
-			zend_assign_to_string_offset(&EX_T(op_data->op2.u.var), value, op_data->op1.op_type TSRMLS_CC);
+			if (zend_assign_to_string_offset(&EX_T(op_data->op2.u.var), value, op_data->op1.op_type TSRMLS_CC)) {
+				if (!RETURN_VALUE_UNUSED(&opline->result)) {
+					EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
+					ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
+					INIT_PZVAL(EX_T(opline->result.u.var).var.ptr);
+					ZVAL_STRINGL(EX_T(opline->result.u.var).var.ptr, Z_STRVAL_P(EX_T(op_data->op2.u.var).str_offset.str)+EX_T(op_data->op2.u.var).str_offset.offset, 1, 1);
+				}
+			} else if (!RETURN_VALUE_UNUSED(&opline->result)) {
+				AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
+				PZVAL_LOCK(EG(uninitialized_zval_ptr));
+			}
 		} else {
 		 	value = zend_assign_to_variable(variable_ptr_ptr, value, IS_TMP_FREE(free_op_data1) TSRMLS_CC);
-		}
-		if (!RETURN_VALUE_UNUSED(&opline->result)) {
-			AI_SET_PTR(EX_T(opline->result.u.var).var, value);
-			PZVAL_LOCK(value);
+			if (!RETURN_VALUE_UNUSED(&opline->result)) {
+				AI_SET_PTR(EX_T(opline->result.u.var).var, value);
+				PZVAL_LOCK(value);
+			}
 		}
 		FREE_OP_VAR_PTR(free_op_data2);
 	 	FREE_OP_IF_VAR(free_op_data1);
@@ -1569,14 +1579,23 @@
 	zval **variable_ptr_ptr = GET_OP1_ZVAL_PTR_PTR(BP_VAR_W);
 
 	if (!variable_ptr_ptr) {
-		zend_assign_to_string_offset(&EX_T(opline->op1.u.var), value, OP2_TYPE TSRMLS_CC);
+		if (zend_assign_to_string_offset(&EX_T(opline->op1.u.var), value, OP2_TYPE TSRMLS_CC)) {
+			if (!RETURN_VALUE_UNUSED(&opline->result)) {
+				EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
+				ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
+				INIT_PZVAL(EX_T(opline->result.u.var).var.ptr);
+				ZVAL_STRINGL(EX_T(opline->result.u.var).var.ptr, Z_STRVAL_P(EX_T(opline->op1.u.var).str_offset.str)+EX_T(opline->op1.u.var).str_offset.offset, 1, 1);
+			}
+		} else if (!RETURN_VALUE_UNUSED(&opline->result)) {
+			AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
+			PZVAL_LOCK(EG(uninitialized_zval_ptr));
+		}
 	} else {
 	 	value = zend_assign_to_variable(variable_ptr_ptr, value, IS_OP2_TMP_FREE() TSRMLS_CC);
-	}
-
-	if (!RETURN_VALUE_UNUSED(&opline->result)) {
-		AI_SET_PTR(EX_T(opline->result.u.var).var, value);
-		PZVAL_LOCK(value);
+		if (!RETURN_VALUE_UNUSED(&opline->result)) {
+			AI_SET_PTR(EX_T(opline->result.u.var).var, value);
+			PZVAL_LOCK(value);
+		}
 	}
 
 	FREE_OP1_VAR_PTR();
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_vm_execute.h?r1=1.62.2.30.2.49.2.37&r2=1.62.2.30.2.49.2.38&diff_format=u
Index: ZendEngine2/zend_vm_execute.h
diff -u ZendEngine2/zend_vm_execute.h:1.62.2.30.2.49.2.37 ZendEngine2/zend_vm_execute.h:1.62.2.30.2.49.2.38
--- ZendEngine2/zend_vm_execute.h:1.62.2.30.2.49.2.37	Sat Feb 23 17:06:20 2008
+++ ZendEngine2/zend_vm_execute.h	Tue Mar  4 10:06:52 2008
@@ -9810,13 +9810,23 @@
 		value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
 		variable_ptr_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
 		if (!variable_ptr_ptr) {
-			zend_assign_to_string_offset(&EX_T(op_data->op2.u.var), value, op_data->op1.op_type TSRMLS_CC);
+			if (zend_assign_to_string_offset(&EX_T(op_data->op2.u.var), value, op_data->op1.op_type TSRMLS_CC)) {
+				if (!RETURN_VALUE_UNUSED(&opline->result)) {
+					EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
+					ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
+					INIT_PZVAL(EX_T(opline->result.u.var).var.ptr);
+					ZVAL_STRINGL(EX_T(opline->result.u.var).var.ptr, Z_STRVAL_P(EX_T(op_data->op2.u.var).str_offset.str)+EX_T(op_data->op2.u.var).str_offset.offset, 1, 1);
+				}
+			} else if (!RETURN_VALUE_UNUSED(&opline->result)) {
+				AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
+				PZVAL_LOCK(EG(uninitialized_zval_ptr));
+			}
 		} else {
 		 	value = zend_assign_to_variable(variable_ptr_ptr, value, IS_TMP_FREE(free_op_data1) TSRMLS_CC);
-		}
-		if (!RETURN_VALUE_UNUSED(&opline->result)) {
-			AI_SET_PTR(EX_T(opline->result.u.var).var, value);
-			PZVAL_LOCK(value);
+			if (!RETURN_VALUE_UNUSED(&opline->result)) {
+				AI_SET_PTR(EX_T(opline->result.u.var).var, value);
+				PZVAL_LOCK(value);
+			}
 		}
 		FREE_OP_VAR_PTR(free_op_data2);
 	 	FREE_OP_IF_VAR(free_op_data1);
@@ -9835,14 +9845,23 @@
 	zval **variable_ptr_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
 
 	if (!variable_ptr_ptr) {
-		zend_assign_to_string_offset(&EX_T(opline->op1.u.var), value, IS_CONST TSRMLS_CC);
+		if (zend_assign_to_string_offset(&EX_T(opline->op1.u.var), value, IS_CONST TSRMLS_CC)) {
+			if (!RETURN_VALUE_UNUSED(&opline->result)) {
+				EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
+				ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
+				INIT_PZVAL(EX_T(opline->result.u.var).var.ptr);
+				ZVAL_STRINGL(EX_T(opline->result.u.var).var.ptr, Z_STRVAL_P(EX_T(opline->op1.u.var).str_offset.str)+EX_T(opline->op1.u.var).str_offset.offset, 1, 1);
+			}
+		} else if (!RETURN_VALUE_UNUSED(&opline->result)) {
+			AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
+			PZVAL_LOCK(EG(uninitialized_zval_ptr));
+		}
 	} else {
 	 	value = zend_assign_to_variable(variable_ptr_ptr, value, 0 TSRMLS_CC);
-	}
-
-	if (!RETURN_VALUE_UNUSED(&opline->result)) {
-		AI_SET_PTR(EX_T(opline->result.u.var).var, value);
-		PZVAL_LOCK(value);
+		if (!RETURN_VALUE_UNUSED(&opline->result)) {
+			AI_SET_PTR(EX_T(opline->result.u.var).var, value);
+			PZVAL_LOCK(value);
+		}
 	}
 
 	if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
@@ -11619,13 +11638,23 @@
 		value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
 		variable_ptr_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
 		if (!variable_ptr_ptr) {
-			zend_assign_to_string_offset(&EX_T(op_data->op2.u.var), value, op_data->op1.op_type TSRMLS_CC);
+			if (zend_assign_to_string_offset(&EX_T(op_data->op2.u.var), value, op_data->op1.op_type TSRMLS_CC)) {
+				if (!RETURN_VALUE_UNUSED(&opline->result)) {
+					EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
+					ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
+					INIT_PZVAL(EX_T(opline->result.u.var).var.ptr);
+					ZVAL_STRINGL(EX_T(opline->result.u.var).var.ptr, Z_STRVAL_P(EX_T(op_data->op2.u.var).str_offset.str)+EX_T(op_data->op2.u.var).str_offset.offset, 1, 1);
+				}
+			} else if (!RETURN_VALUE_UNUSED(&opline->result)) {
+				AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
+				PZVAL_LOCK(EG(uninitialized_zval_ptr));
+			}
 		} else {
 		 	value = zend_assign_to_variable(variable_ptr_ptr, value, IS_TMP_FREE(free_op_data1) TSRMLS_CC);
-		}
-		if (!RETURN_VALUE_UNUSED(&opline->result)) {
-			AI_SET_PTR(EX_T(opline->result.u.var).var, value);
-			PZVAL_LOCK(value);
+			if (!RETURN_VALUE_UNUSED(&opline->result)) {
+				AI_SET_PTR(EX_T(opline->result.u.var).var, value);
+				PZVAL_LOCK(value);
+			}
 		}
 		FREE_OP_VAR_PTR(free_op_data2);
 	 	FREE_OP_IF_VAR(free_op_data1);
@@ -11644,14 +11673,23 @@
 	zval **variable_ptr_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
 
 	if (!variable_ptr_ptr) {
-		zend_assign_to_string_offset(&EX_T(opline->op1.u.var), value, IS_TMP_VAR TSRMLS_CC);
+		if (zend_assign_to_string_offset(&EX_T(opline->op1.u.var), value, IS_TMP_VAR TSRMLS_CC)) {
+			if (!RETURN_VALUE_UNUSED(&opline->result)) {
+				EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
+				ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
+				INIT_PZVAL(EX_T(opline->result.u.var).var.ptr);
+				ZVAL_STRINGL(EX_T(opline->result.u.var).var.ptr, Z_STRVAL_P(EX_T(opline->op1.u.var).str_offset.str)+EX_T(opline->op1.u.var).str_offset.offset, 1, 1);
+			}
+		} else if (!RETURN_VALUE_UNUSED(&opline->result)) {
+			AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
+			PZVAL_LOCK(EG(uninitialized_zval_ptr));
+		}
 	} else {
 	 	value = zend_assign_to_variable(variable_ptr_ptr, value, 1 TSRMLS_CC);
-	}
-
-	if (!RETURN_VALUE_UNUSED(&opline->result)) {
-		AI_SET_PTR(EX_T(opline->result.u.var).var, value);
-		PZVAL_LOCK(value);
+		if (!RETURN_VALUE_UNUSED(&opline->result)) {
+			AI_SET_PTR(EX_T(opline->result.u.var).var, value);
+			PZVAL_LOCK(value);
+		}
 	}
 
 	if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
@@ -13358,13 +13396,23 @@
 		value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
 		variable_ptr_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
 		if (!variable_ptr_ptr) {
-			zend_assign_to_string_offset(&EX_T(op_data->op2.u.var), value, op_data->op1.op_type TSRMLS_CC);
+			if (zend_assign_to_string_offset(&EX_T(op_data->op2.u.var), value, op_data->op1.op_type TSRMLS_CC)) {
+				if (!RETURN_VALUE_UNUSED(&opline->result)) {
+					EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
+					ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
+					INIT_PZVAL(EX_T(opline->result.u.var).var.ptr);
+					ZVAL_STRINGL(EX_T(opline->result.u.var).var.ptr, Z_STRVAL_P(EX_T(op_data->op2.u.var).str_offset.str)+EX_T(op_data->op2.u.var).str_offset.offset, 1, 1);
+				}
+			} else if (!RETURN_VALUE_UNUSED(&opline->result)) {
+				AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
+				PZVAL_LOCK(EG(uninitialized_zval_ptr));
+			}
 		} else {
 		 	value = zend_assign_to_variable(variable_ptr_ptr, value, IS_TMP_FREE(free_op_data1) TSRMLS_CC);
-		}
-		if (!RETURN_VALUE_UNUSED(&opline->result)) {
-			AI_SET_PTR(EX_T(opline->result.u.var).var, value);
-			PZVAL_LOCK(value);
+			if (!RETURN_VALUE_UNUSED(&opline->result)) {
+				AI_SET_PTR(EX_T(opline->result.u.var).var, value);
+				PZVAL_LOCK(value);
+			}
 		}
 		FREE_OP_VAR_PTR(free_op_data2);
 	 	FREE_OP_IF_VAR(free_op_data1);
@@ -13383,14 +13431,23 @@
 	zval **variable_ptr_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
 
 	if (!variable_ptr_ptr) {
-		zend_assign_to_string_offset(&EX_T(opline->op1.u.var), value, IS_VAR TSRMLS_CC);
+		if (zend_assign_to_string_offset(&EX_T(opline->op1.u.var), value, IS_VAR TSRMLS_CC)) {
+			if (!RETURN_VALUE_UNUSED(&opline->result)) {
+				EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
+				ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
+				INIT_PZVAL(EX_T(opline->result.u.var).var.ptr);
+				ZVAL_STRINGL(EX_T(opline->result.u.var).var.ptr, Z_STRVAL_P(EX_T(opline->op1.u.var).str_offset.str)+EX_T(opline->op1.u.var).str_offset.offset, 1, 1);
+			}
+		} else if (!RETURN_VALUE_UNUSED(&opline->result)) {
+			AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
+			PZVAL_LOCK(EG(uninitialized_zval_ptr));
+		}
 	} else {
 	 	value = zend_assign_to_variable(variable_ptr_ptr, value, 0 TSRMLS_CC);
-	}
-
-	if (!RETURN_VALUE_UNUSED(&opline->result)) {
-		AI_SET_PTR(EX_T(opline->result.u.var).var, value);
-		PZVAL_LOCK(value);
+		if (!RETURN_VALUE_UNUSED(&opline->result)) {
+			AI_SET_PTR(EX_T(opline->result.u.var).var, value);
+			PZVAL_LOCK(value);
+		}
 	}
 
 	if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
@@ -14374,13 +14431,23 @@
 		value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
 		variable_ptr_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
 		if (!variable_ptr_ptr) {
-			zend_assign_to_string_offset(&EX_T(op_data->op2.u.var), value, op_data->op1.op_type TSRMLS_CC);
+			if (zend_assign_to_string_offset(&EX_T(op_data->op2.u.var), value, op_data->op1.op_type TSRMLS_CC)) {
+				if (!RETURN_VALUE_UNUSED(&opline->result)) {
+					EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
+					ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
+					INIT_PZVAL(EX_T(opline->result.u.var).var.ptr);
+					ZVAL_STRINGL(EX_T(opline->result.u.var).var.ptr, Z_STRVAL_P(EX_T(op_data->op2.u.var).str_offset.str)+EX_T(op_data->op2.u.var).str_offset.offset, 1, 1);
+				}
+			} else if (!RETURN_VALUE_UNUSED(&opline->result)) {
+				AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
+				PZVAL_LOCK(EG(uninitialized_zval_ptr));
+			}
 		} else {
 		 	value = zend_assign_to_variable(variable_ptr_ptr, value, IS_TMP_FREE(free_op_data1) TSRMLS_CC);
-		}
-		if (!RETURN_VALUE_UNUSED(&opline->result)) {
-			AI_SET_PTR(EX_T(opline->result.u.var).var, value);
-			PZVAL_LOCK(value);
+			if (!RETURN_VALUE_UNUSED(&opline->result)) {
+				AI_SET_PTR(EX_T(opline->result.u.var).var, value);
+				PZVAL_LOCK(value);
+			}
 		}
 		FREE_OP_VAR_PTR(free_op_data2);
 	 	FREE_OP_IF_VAR(free_op_data1);
@@ -15735,13 +15802,23 @@
 		value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
 		variable_ptr_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
 		if (!variable_ptr_ptr) {
-			zend_assign_to_string_offset(&EX_T(op_data->op2.u.var), value, op_data->op1.op_type TSRMLS_CC);
+			if (zend_assign_to_string_offset(&EX_T(op_data->op2.u.var), value, op_data->op1.op_type TSRMLS_CC)) {
+				if (!RETURN_VALUE_UNUSED(&opline->result)) {
+					EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
+					ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
+					INIT_PZVAL(EX_T(opline->result.u.var).var.ptr);
+					ZVAL_STRINGL(EX_T(opline->result.u.var).var.ptr, Z_STRVAL_P(EX_T(op_data->op2.u.var).str_offset.str)+EX_T(op_data->op2.u.var).str_offset.offset, 1, 1);
+				}
+			} else if (!RETURN_VALUE_UNUSED(&opline->result)) {
+				AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
+				PZVAL_LOCK(EG(uninitialized_zval_ptr));
+			}
 		} else {
 		 	value = zend_assign_to_variable(variable_ptr_ptr, value, IS_TMP_FREE(free_op_data1) TSRMLS_CC);
-		}
-		if (!RETURN_VALUE_UNUSED(&opline->result)) {
-			AI_SET_PTR(EX_T(opline->result.u.var).var, value);
-			PZVAL_LOCK(value);
+			if (!RETURN_VALUE_UNUSED(&opline->result)) {
+				AI_SET_PTR(EX_T(opline->result.u.var).var, value);
+				PZVAL_LOCK(value);
+			}
 		}
 		FREE_OP_VAR_PTR(free_op_data2);
 	 	FREE_OP_IF_VAR(free_op_data1);
@@ -15760,14 +15837,23 @@
 	zval **variable_ptr_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
 
 	if (!variable_ptr_ptr) {
-		zend_assign_to_string_offset(&EX_T(opline->op1.u.var), value, IS_CV TSRMLS_CC);
+		if (zend_assign_to_string_offset(&EX_T(opline->op1.u.var), value, IS_CV TSRMLS_CC)) {
+			if (!RETURN_VALUE_UNUSED(&opline->result)) {
+				EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
+				ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
+				INIT_PZVAL(EX_T(opline->result.u.var).var.ptr);
+				ZVAL_STRINGL(EX_T(opline->result.u.var).var.ptr, Z_STRVAL_P(EX_T(opline->op1.u.var).str_offset.str)+EX_T(opline->op1.u.var).str_offset.offset, 1, 1);
+			}
+		} else if (!RETURN_VALUE_UNUSED(&opline->result)) {
+			AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
+			PZVAL_LOCK(EG(uninitialized_zval_ptr));
+		}
 	} else {
 	 	value = zend_assign_to_variable(variable_ptr_ptr, value, 0 TSRMLS_CC);
-	}
-
-	if (!RETURN_VALUE_UNUSED(&opline->result)) {
-		AI_SET_PTR(EX_T(opline->result.u.var).var, value);
-		PZVAL_LOCK(value);
+		if (!RETURN_VALUE_UNUSED(&opline->result)) {
+			AI_SET_PTR(EX_T(opline->result.u.var).var, value);
+			PZVAL_LOCK(value);
+		}
 	}
 
 	if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
@@ -23253,13 +23339,23 @@
 		value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
 		variable_ptr_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
 		if (!variable_ptr_ptr) {
-			zend_assign_to_string_offset(&EX_T(op_data->op2.u.var), value, op_data->op1.op_type TSRMLS_CC);
+			if (zend_assign_to_string_offset(&EX_T(op_data->op2.u.var), value, op_data->op1.op_type TSRMLS_CC)) {
+				if (!RETURN_VALUE_UNUSED(&opline->result)) {
+					EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
+					ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
+					INIT_PZVAL(EX_T(opline->result.u.var).var.ptr);
+					ZVAL_STRINGL(EX_T(opline->result.u.var).var.ptr, Z_STRVAL_P(EX_T(op_data->op2.u.var).str_offset.str)+EX_T(op_data->op2.u.var).str_offset.offset, 1, 1);
+				}
+			} else if (!RETURN_VALUE_UNUSED(&opline->result)) {
+				AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
+				PZVAL_LOCK(EG(uninitialized_zval_ptr));
+			}
 		} else {
 		 	value = zend_assign_to_variable(variable_ptr_ptr, value, IS_TMP_FREE(free_op_data1) TSRMLS_CC);
-		}
-		if (!RETURN_VALUE_UNUSED(&opline->result)) {
-			AI_SET_PTR(EX_T(opline->result.u.var).var, value);
-			PZVAL_LOCK(value);
+			if (!RETURN_VALUE_UNUSED(&opline->result)) {
+				AI_SET_PTR(EX_T(opline->result.u.var).var, value);
+				PZVAL_LOCK(value);
+			}
 		}
 		FREE_OP_VAR_PTR(free_op_data2);
 	 	FREE_OP_IF_VAR(free_op_data1);
@@ -23278,14 +23374,23 @@
 	zval **variable_ptr_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
 
 	if (!variable_ptr_ptr) {
-		zend_assign_to_string_offset(&EX_T(opline->op1.u.var), value, IS_CONST TSRMLS_CC);
+		if (zend_assign_to_string_offset(&EX_T(opline->op1.u.var), value, IS_CONST TSRMLS_CC)) {
+			if (!RETURN_VALUE_UNUSED(&opline->result)) {
+				EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
+				ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
+				INIT_PZVAL(EX_T(opline->result.u.var).var.ptr);
+				ZVAL_STRINGL(EX_T(opline->result.u.var).var.ptr, Z_STRVAL_P(EX_T(opline->op1.u.var).str_offset.str)+EX_T(opline->op1.u.var).str_offset.offset, 1, 1);
+			}
+		} else if (!RETURN_VALUE_UNUSED(&opline->result)) {
+			AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
+			PZVAL_LOCK(EG(uninitialized_zval_ptr));
+		}
 	} else {
 	 	value = zend_assign_to_variable(variable_ptr_ptr, value, 0 TSRMLS_CC);
-	}
-
-	if (!RETURN_VALUE_UNUSED(&opline->result)) {
-		AI_SET_PTR(EX_T(opline->result.u.var).var, value);
-		PZVAL_LOCK(value);
+		if (!RETURN_VALUE_UNUSED(&opline->result)) {
+			AI_SET_PTR(EX_T(opline->result.u.var).var, value);
+			PZVAL_LOCK(value);
+		}
 	}
 
 	/* zend_assign_to_variable() always takes care of op2, never free it! */
@@ -24881,13 +24986,23 @@
 		value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
 		variable_ptr_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
 		if (!variable_ptr_ptr) {
-			zend_assign_to_string_offset(&EX_T(op_data->op2.u.var), value, op_data->op1.op_type TSRMLS_CC);
+			if (zend_assign_to_string_offset(&EX_T(op_data->op2.u.var), value, op_data->op1.op_type TSRMLS_CC)) {
+				if (!RETURN_VALUE_UNUSED(&opline->result)) {
+					EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
+					ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
+					INIT_PZVAL(EX_T(opline->result.u.var).var.ptr);
+					ZVAL_STRINGL(EX_T(opline->result.u.var).var.ptr, Z_STRVAL_P(EX_T(op_data->op2.u.var).str_offset.str)+EX_T(op_data->op2.u.var).str_offset.offset, 1, 1);
+				}
+			} else if (!RETURN_VALUE_UNUSED(&opline->result)) {
+				AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
+				PZVAL_LOCK(EG(uninitialized_zval_ptr));
+			}
 		} else {
 		 	value = zend_assign_to_variable(variable_ptr_ptr, value, IS_TMP_FREE(free_op_data1) TSRMLS_CC);
-		}
-		if (!RETURN_VALUE_UNUSED(&opline->result)) {
-			AI_SET_PTR(EX_T(opline->result.u.var).var, value);
-			PZVAL_LOCK(value);
+			if (!RETURN_VALUE_UNUSED(&opline->result)) {
+				AI_SET_PTR(EX_T(opline->result.u.var).var, value);
+				PZVAL_LOCK(value);
+			}
 		}
 		FREE_OP_VAR_PTR(free_op_data2);
 	 	FREE_OP_IF_VAR(free_op_data1);
@@ -24906,14 +25021,23 @@
 	zval **variable_ptr_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
 
 	if (!variable_ptr_ptr) {
-		zend_assign_to_string_offset(&EX_T(opline->op1.u.var), value, IS_TMP_VAR TSRMLS_CC);
+		if (zend_assign_to_string_offset(&EX_T(opline->op1.u.var), value, IS_TMP_VAR TSRMLS_CC)) {
+			if (!RETURN_VALUE_UNUSED(&opline->result)) {
+				EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
+				ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
+				INIT_PZVAL(EX_T(opline->result.u.var).var.ptr);
+				ZVAL_STRINGL(EX_T(opline->result.u.var).var.ptr, Z_STRVAL_P(EX_T(opline->op1.u.var).str_offset.str)+EX_T(opline->op1.u.var).str_offset.offset, 1, 1);
+			}
+		} else if (!RETURN_VALUE_UNUSED(&opline->result)) {
+			AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
+			PZVAL_LOCK(EG(uninitialized_zval_ptr));
+		}
 	} else {
 	 	value = zend_assign_to_variable(variable_ptr_ptr, value, 1 TSRMLS_CC);
-	}
-
-	if (!RETURN_VALUE_UNUSED(&opline->result)) {
-		AI_SET_PTR(EX_T(opline->result.u.var).var, value);
-		PZVAL_LOCK(value);
+		if (!RETURN_VALUE_UNUSED(&opline->result)) {
+			AI_SET_PTR(EX_T(opline->result.u.var).var, value);
+			PZVAL_LOCK(value);
+		}
 	}
 
 	/* zend_assign_to_variable() always takes care of op2, never free it! */
@@ -26511,13 +26635,23 @@
 		value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
 		variable_ptr_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
 		if (!variable_ptr_ptr) {
-			zend_assign_to_string_offset(&EX_T(op_data->op2.u.var), value, op_data->op1.op_type TSRMLS_CC);
+			if (zend_assign_to_string_offset(&EX_T(op_data->op2.u.var), value, op_data->op1.op_type TSRMLS_CC)) {
+				if (!RETURN_VALUE_UNUSED(&opline->result)) {
+					EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
+					ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
+					INIT_PZVAL(EX_T(opline->result.u.var).var.ptr);
+					ZVAL_STRINGL(EX_T(opline->result.u.var).var.ptr, Z_STRVAL_P(EX_T(op_data->op2.u.var).str_offset.str)+EX_T(op_data->op2.u.var).str_offset.offset, 1, 1);
+				}
+			} else if (!RETURN_VALUE_UNUSED(&opline->result)) {
+				AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
+				PZVAL_LOCK(EG(uninitialized_zval_ptr));
+			}
 		} else {
 		 	value = zend_assign_to_variable(variable_ptr_ptr, value, IS_TMP_FREE(free_op_data1) TSRMLS_CC);
-		}
-		if (!RETURN_VALUE_UNUSED(&opline->result)) {
-			AI_SET_PTR(EX_T(opline->result.u.var).var, value);
-			PZVAL_LOCK(value);
+			if (!RETURN_VALUE_UNUSED(&opline->result)) {
+				AI_SET_PTR(EX_T(opline->result.u.var).var, value);
+				PZVAL_LOCK(value);
+			}
 		}
 		FREE_OP_VAR_PTR(free_op_data2);
 	 	FREE_OP_IF_VAR(free_op_data1);
@@ -26536,14 +26670,23 @@
 	zval **variable_ptr_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
 
 	if (!variable_ptr_ptr) {
-		zend_assign_to_string_offset(&EX_T(opline->op1.u.var), value, IS_VAR TSRMLS_CC);
+		if (zend_assign_to_string_offset(&EX_T(opline->op1.u.var), value, IS_VAR TSRMLS_CC)) {
+			if (!RETURN_VALUE_UNUSED(&opline->result)) {
+				EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
+				ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
+				INIT_PZVAL(EX_T(opline->result.u.var).var.ptr);
+				ZVAL_STRINGL(EX_T(opline->result.u.var).var.ptr, Z_STRVAL_P(EX_T(opline->op1.u.var).str_offset.str)+EX_T(opline->op1.u.var).str_offset.offset, 1, 1);
+			}
+		} else if (!RETURN_VALUE_UNUSED(&opline->result)) {
+			AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
+			PZVAL_LOCK(EG(uninitialized_zval_ptr));
+		}
 	} else {
 	 	value = zend_assign_to_variable(variable_ptr_ptr, value, 0 TSRMLS_CC);
-	}
-
-	if (!RETURN_VALUE_UNUSED(&opline->result)) {
-		AI_SET_PTR(EX_T(opline->result.u.var).var, value);
-		PZVAL_LOCK(value);
+		if (!RETURN_VALUE_UNUSED(&opline->result)) {
+			AI_SET_PTR(EX_T(opline->result.u.var).var, value);
+			PZVAL_LOCK(value);
+		}
 	}
 
 	/* zend_assign_to_variable() always takes care of op2, never free it! */
@@ -27420,13 +27563,23 @@
 		value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
 		variable_ptr_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
 		if (!variable_ptr_ptr) {
-			zend_assign_to_string_offset(&EX_T(op_data->op2.u.var), value, op_data->op1.op_type TSRMLS_CC);
+			if (zend_assign_to_string_offset(&EX_T(op_data->op2.u.var), value, op_data->op1.op_type TSRMLS_CC)) {
+				if (!RETURN_VALUE_UNUSED(&opline->result)) {
+					EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
+					ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
+					INIT_PZVAL(EX_T(opline->result.u.var).var.ptr);
+					ZVAL_STRINGL(EX_T(opline->result.u.var).var.ptr, Z_STRVAL_P(EX_T(op_data->op2.u.var).str_offset.str)+EX_T(op_data->op2.u.var).str_offset.offset, 1, 1);
+				}
+			} else if (!RETURN_VALUE_UNUSED(&opline->result)) {
+				AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
+				PZVAL_LOCK(EG(uninitialized_zval_ptr));
+			}
 		} else {
 		 	value = zend_assign_to_variable(variable_ptr_ptr, value, IS_TMP_FREE(free_op_data1) TSRMLS_CC);
-		}
-		if (!RETURN_VALUE_UNUSED(&opline->result)) {
-			AI_SET_PTR(EX_T(opline->result.u.var).var, value);
-			PZVAL_LOCK(value);
+			if (!RETURN_VALUE_UNUSED(&opline->result)) {
+				AI_SET_PTR(EX_T(opline->result.u.var).var, value);
+				PZVAL_LOCK(value);
+			}
 		}
 		FREE_OP_VAR_PTR(free_op_data2);
 	 	FREE_OP_IF_VAR(free_op_data1);
@@ -28679,13 +28832,23 @@
 		value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
 		variable_ptr_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
 		if (!variable_ptr_ptr) {
-			zend_assign_to_string_offset(&EX_T(op_data->op2.u.var), value, op_data->op1.op_type TSRMLS_CC);
+			if (zend_assign_to_string_offset(&EX_T(op_data->op2.u.var), value, op_data->op1.op_type TSRMLS_CC)) {
+				if (!RETURN_VALUE_UNUSED(&opline->result)) {
+					EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
+					ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
+					INIT_PZVAL(EX_T(opline->result.u.var).var.ptr);
+					ZVAL_STRINGL(EX_T(opline->result.u.var).var.ptr, Z_STRVAL_P(EX_T(op_data->op2.u.var).str_offset.str)+EX_T(op_data->op2.u.var).str_offset.offset, 1, 1);
+				}
+			} else if (!RETURN_VALUE_UNUSED(&opline->result)) {
+				AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
+				PZVAL_LOCK(EG(uninitialized_zval_ptr));
+			}
 		} else {
 		 	value = zend_assign_to_variable(variable_ptr_ptr, value, IS_TMP_FREE(free_op_data1) TSRMLS_CC);
-		}
-		if (!RETURN_VALUE_UNUSED(&opline->result)) {
-			AI_SET_PTR(EX_T(opline->result.u.var).var, value);
-			PZVAL_LOCK(value);
+			if (!RETURN_VALUE_UNUSED(&opline->result)) {
+				AI_SET_PTR(EX_T(opline->result.u.var).var, value);
+				PZVAL_LOCK(value);
+			}
 		}
 		FREE_OP_VAR_PTR(free_op_data2);
 	 	FREE_OP_IF_VAR(free_op_data1);
@@ -28704,14 +28867,23 @@
 	zval **variable_ptr_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
 
 	if (!variable_ptr_ptr) {
-		zend_assign_to_string_offset(&EX_T(opline->op1.u.var), value, IS_CV TSRMLS_CC);
+		if (zend_assign_to_string_offset(&EX_T(opline->op1.u.var), value, IS_CV TSRMLS_CC)) {
+			if (!RETURN_VALUE_UNUSED(&opline->result)) {
+				EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
+				ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
+				INIT_PZVAL(EX_T(opline->result.u.var).var.ptr);
+				ZVAL_STRINGL(EX_T(opline->result.u.var).var.ptr, Z_STRVAL_P(EX_T(opline->op1.u.var).str_offset.str)+EX_T(opline->op1.u.var).str_offset.offset, 1, 1);
+			}
+		} else if (!RETURN_VALUE_UNUSED(&opline->result)) {
+			AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
+			PZVAL_LOCK(EG(uninitialized_zval_ptr));
+		}
 	} else {
 	 	value = zend_assign_to_variable(variable_ptr_ptr, value, 0 TSRMLS_CC);
-	}
-
-	if (!RETURN_VALUE_UNUSED(&opline->result)) {
-		AI_SET_PTR(EX_T(opline->result.u.var).var, value);
-		PZVAL_LOCK(value);
+		if (!RETURN_VALUE_UNUSED(&opline->result)) {
+			AI_SET_PTR(EX_T(opline->result.u.var).var, value);
+			PZVAL_LOCK(value);
+		}
 	}
 
 	/* zend_assign_to_variable() always takes care of op2, never free it! */
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.