cvs: ZendEngine2 / zend_execute.c zend_vm_def.h zend_vm_execute.h

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

  Modified files:              
    /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-20080304100623.txt (text/plain, 29.8 KB)
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_execute.c?r1=1.789&r2=1.790&diff_format=u
Index: ZendEngine2/zend_execute.c
diff -u ZendEngine2/zend_execute.c:1.789 ZendEngine2/zend_execute.c:1.790
--- ZendEngine2/zend_execute.c:1.789	Thu Feb 28 19:33:40 2008
+++ ZendEngine2/zend_execute.c	Tue Mar  4 10:06:22 2008
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_execute.c,v 1.789 2008/02/28 19:33:40 felipe Exp $ */
+/* $Id: zend_execute.c,v 1.790 2008/03/04 10:06:22 dmitry Exp $ */
 
 #define ZEND_INTENSIVE_DEBUGGING 0
 
@@ -652,7 +652,7 @@
 }
 /* }}} */
 
-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 (UG(unicode) && Z_TYPE_P(T->str_offset.str) == IS_STRING && Z_TYPE_P(value) != IS_STRING) {
 		convert_to_unicode(T->str_offset.str);
@@ -662,7 +662,7 @@
 
 		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)) {
@@ -699,7 +699,7 @@
 
 		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_USTRLEN_P(T->str_offset.str)) {
@@ -729,6 +729,7 @@
 			}
 		}
 	}
+	return 1;
 }
 /* }}} */
 
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_vm_def.h?r1=1.215&r2=1.216&diff_format=u
Index: ZendEngine2/zend_vm_def.h
diff -u ZendEngine2/zend_vm_def.h:1.215 ZendEngine2/zend_vm_def.h:1.216
--- ZendEngine2/zend_vm_def.h:1.215	Sat Feb 23 17:03:51 2008
+++ ZendEngine2/zend_vm_def.h	Tue Mar  4 10:06:22 2008
@@ -18,7 +18,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_vm_def.h,v 1.215 2008/02/23 17:03:51 helly Exp $ */
+/* $Id: zend_vm_def.h,v 1.216 2008/03/04 10:06:22 dmitry Exp $ */
 
 /* If you change this file, please regenerate the zend_vm_execute.h and
  * zend_vm_opcodes.h files by running:
@@ -1586,13 +1586,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);
@@ -1611,14 +1621,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.219&r2=1.220&diff_format=u
Index: ZendEngine2/zend_vm_execute.h
diff -u ZendEngine2/zend_vm_execute.h:1.219 ZendEngine2/zend_vm_execute.h:1.220
--- ZendEngine2/zend_vm_execute.h:1.219	Sat Feb 23 17:03:52 2008
+++ ZendEngine2/zend_vm_execute.h	Tue Mar  4 10:06:22 2008
@@ -10167,13 +10167,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);
@@ -10192,14 +10202,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);};
@@ -12035,13 +12054,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);
@@ -12060,14 +12089,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);};
@@ -13833,13 +13871,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);
@@ -13858,14 +13906,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);};
@@ -14904,13 +14961,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);
@@ -16271,13 +16338,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);
@@ -16296,14 +16373,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);};
@@ -24175,13 +24261,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);
@@ -24200,14 +24296,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! */
@@ -25860,13 +25965,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);
@@ -25885,14 +26000,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! */
@@ -27547,13 +27671,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);
@@ -27572,14 +27706,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! */
@@ -28509,13 +28652,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);
@@ -29772,13 +29925,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);
@@ -29797,14 +29960,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.