stack overflow in array/sanitizer
オープン
まだ誰も着手していません。
Bug
Extension: standard
Status: Needs Triage
- 主要言語
- C
- スター
- 40.4k
- フォーク
- 8.2k
- 平均マージ
- 2日 13時間
- マージ済み PR(30日)
- 96
説明
Description
The following code:
<?php
$a=[]; for($i=0;$i<1000000;$i++){$a=['k'=>$a];}
$b=array_merge_recursive($a,$a);
Resulted in this output:
#226 0x55fe77cec009 in php_array_merge_recursive /home/php-src/ext/standard/array.c:3975
#227 0x55fe77cec009 in php_array_merge_recursive /home/php-src/ext/standard/array.c:3975
#228 0x55fe77cec009 in php_array_merge_recursive /home/php-src/ext/standard/array.c:3975
#229 0x55fe77cec009 in php_array_merge_recursive /home/php-src/ext/standard/array.c:3975
#230 0x55fe77cec009 in php_array_merge_recursive /home/php-src/ext/standard/array.c:3975
#231 0x55fe77cec009 in php_array_merge_recursive /home/php-src/ext/standard/array.c:3975
#232 0x55fe77cec009 in php_array_merge_recursive /home/php-src/ext/standard/array.c:3975
#233 0x55fe77cec009 in php_array_merge_recursive /home/php-src/ext/standard/array.c:3975
#234 0x55fe77cec009 in php_array_merge_recursive /home/php-src/ext/standard/array.c:3975
#235 0x55fe77cec009 in php_array_merge_recursive /home/php-src/ext/standard/array.c:3975
#236 0x55fe77cec009 in php_array_merge_recursive /home/php-src/ext/standard/array.c:3975
#237 0x55fe77cec009 in php_array_merge_recursive /home/php-src/ext/standard/array.c:3975
#238 0x55fe77cec009 in php_array_merge_recursive /home/php-src/ext/standard/array.c:3975
#239 0x55fe77cec009 in php_array_merge_recursive /home/php-src/ext/standard/array.c:3975
#240 0x55fe77cec009 in php_array_merge_recursive /home/php-src/ext/standard/array.c:3975
#241 0x55fe77cec009 in php_array_merge_recursive /home/php-src/ext/standard/array.c:3975
#242 0x55fe77cec009 in php_array_merge_recursive /home/php-src/ext/standard/array.c:3975
#243 0x55fe77cec009 in php_array_merge_recursive /home/php-src/ext/standard/array.c:3975
#244 0x55fe77cec009 in php_array_merge_recursive /home/php-src/ext/standard/array.c:3975
#245 0x55fe77cec009 in php_array_merge_recursive /home/php-src/ext/standard/array.c:3975
#246 0x55fe77cec009 in php_array_merge_recursive /home/php-src/ext/standard/array.c:3975
#247 0x55fe77cec009 in php_array_merge_recursive /home/php-src/ext/standard/array.c:3975
#248 0x55fe77cec009 in php_array_merge_recursive /home/php-src/ext/standard/array.c:3975
#249 0x55fe77cec009 in php_array_merge_recursive /home/php-src/ext/standard/array.c:3975
SUMMARY: AddressSanitizer: stack-overflow ../../../../src/libsanitizer/asan/asan_stack.cpp:63 in __sanitizer::BufferedStackTrace::UnwindImpl(unsigned long, unsigned long, void*, bool, unsigned int)
==26==ABORTING
USE_ZEND_ALLOC=0 php poc.php
PHP Version
8.6.0
Operating System
ubuntu 22.04
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
調査の方向性
issue の reproducer から始めて、ext/standard/array.c:3975 の php_array_merge_recursive を調べてください。AddressSanitizer と USE_ZEND_ALLOC=0 を指定して実行し、その後、ネストされた array_merge_recursive のケースを対象とするリグレッションテストを追加してください。reproducer によってスタックオーバーフローが発生しなくなれば完了です。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- c, php
- 領域
- backend, testing-qa
- issue の種類
- バグ
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 活発さ
- 静か
- 明瞭さ
- おおむね明確
- 初心者へのやさしさ
- 52/100