zend_set_local_var() overwrites existing compiled variable (CV) zval without calling zval_ptr_dtor()
Maintainer thường phản hồi trong vòng 1 ngày
Đánh giá
- Độ khó
- 2/5
- Thời gian dự kiến
- 1-3 giờ
- Mức phù hợp với người mới
- 82/100
Hướng nghiên cứu
Đọc Zend/zend_execute_API.c, so sánh nhánh biến đã biên dịch của zend_set_local_var() với zend_set_local_var_str() và nhánh bảng ký hiệu. Kiểm tra cách các giá trị zval hiện có được giải phóng trước khi thay thế, sau đó chạy các bài kiểm tra liên quan đến việc gán biến cục bộ và đếm tham chiếu. Công việc hoàn tất khi việc thay thế một biến đã biên dịch có sẵn giá trị giải phóng giá trị trước đó mà không làm ảnh hưởng đến hành vi hiện có.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
Description
In Zend/zend_execute_API.c (lines 1927–1959), when zend_set_local_var(zend_string *name, zval *value, bool force) finds a matching compiled variable (EX_VAR_NUM(str - op_array->vars)), it overwrites *var directly via ZVAL_COPY_VALUE(var, value) without calling zval_ptr_dtor(var) first:
do {
if (ZSTR_H(*str) == h &&
zend_string_equal_content(*str, name)) {
zval *var = EX_VAR_NUM(str - op_array->vars);
ZVAL_COPY_VALUE(var, value);
return SUCCESS;
}
str++;
} while (str != end);
Compare this with zend_set_local_var_str() immediately below it in Zend/zend_execute_API.c (lines 1978–1987):
do {
if (ZSTR_H(*str) == h &&
zend_string_equals_cstr(*str, name, len)) {
zval *var = EX_VAR_NUM(str - op_array->vars);
zval_ptr_dtor(var);
ZVAL_COPY_VALUE(var, value);
return SUCCESS;
}
str++;
} while (str != end);
And in the EX_CALL_INFO() & ZEND_CALL_HAS_SYMBOL_TABLE branch of zend_set_local_var() (line 1954), zend_hash_update_ind(execute_data->symbol_table, name, value) is called, which properly invokes the destructor on the old value. Only the CV branch of zend_set_local_var() (line 1940) omits zval_ptr_dtor(var);, leaking the previous reference-counted value if the CV was already populated.
Suggested Patch
--- a/Zend/zend_execute_API.c
+++ b/Zend/zend_execute_API.c
@@ -1937,6 +1937,7 @@ ZEND_API zend_result zend_set_local_var(zend_string *name, zval *value, bool for
if (ZSTR_H(*str) == h &&
zend_string_equal_content(*str, name)) {
zval *var = EX_VAR_NUM(str - op_array->vars);
+ zval_ptr_dtor(var);
ZVAL_COPY_VALUE(var, value);
return SUCCESS;
}
PHP Version
PHP 8.4, PHP 8.5, master
Operating System
All
- Ngôn ngữ chính
- C
- Star
- 40.7k
- Fork
- 8.3k
- Merge trung bình
- 2 ngày 20 giờ
- Pull request đã merge (30 ngày)
- 147
Chuẩn bị môi trường
- Không có Dockerfile hay tệp Docker Compose
- Không có mẫu pull request
- Đọc hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của php/php-src
-
sapi/fpm/tests/tester.inc can send SIGUSR2 to pid 0, killing run-tests.phpCó thể đã có người làm Có pull request liên kết đang mở hoặc đã được merge. Đang mởBug Status: Needs Triage
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
Maintainer thường phản hồi trong vòng 1 ngày
-
Case-insensitive substr_compare, ksort, krsort are still locale-dependentCó thể đã có người làm @lazerg đã nhận 4 ngày trước. Đang mởBug Extension: standard Status: Verified
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 73/100
php/php-src#24552 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
master: part of the mbstring bailout fix got lost in a mergeCó thể đã có người làm @lazerg đã nhận 4 ngày trước. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
Maintainer thường phản hồi trong vòng 1 ngày
-
Bug Status: Needs Triage
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 64/100
Maintainer thường phản hồi trong vòng 1 ngày
Issue tương tự
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 65/100
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
HexaCluster/credcheck#86 ·
-
Wheels for Python 3.15Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 66/100
mongodb/winkerberos#175 ·
-
bug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 74/100
AOMediaCodec/SVT-AV1#3320 ·
-
Add `CPC_TAKE_TILL_CHARS`Đang mởdifficulty: easy
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 64/100