Skip to content

Commit 6771dca

Browse files
committed
Merge branch 'master' into array-map-pfa
2 parents 2068a9d + e9e0fe4 commit 6771dca

30 files changed

Lines changed: 260 additions & 111 deletions

.github/workflows/real-time-benchmark.yml

Lines changed: 40 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -131,18 +131,6 @@ jobs:
131131
repository: php/real-time-benchmark-data
132132
ssh-key: ${{ secrets.PHP_VERSION_BENCHMARK_RESULTS_DEPLOY_KEY }}
133133
path: 'php-version-benchmarks/docs/results'
134-
- name: Setup infra config
135-
run: |
136-
set -e
137-
138-
cp ./php-version-benchmarks/config/infra/aws/x86_64-metal.ini.dist ./php-version-benchmarks/config/infra/aws/x86_64-metal.ini
139-
ESCAPED_DOCKER_REGISTRY=$(printf '%s\n' "${{ secrets.PHP_VERSION_BENCHMARK_DOCKER_REGISTRY }}" | sed -e 's/[\/&]/\\&/g')
140-
sed -i "s/INFRA_DOCKER_REGISTRY=public.ecr.aws\/abcdefgh/INFRA_DOCKER_REGISTRY=$ESCAPED_DOCKER_REGISTRY/g" ./php-version-benchmarks/config/infra/aws/x86_64-metal.ini
141-
sed -i "s/INFRA_MEASURE_INSTRUCTION_COUNT=0/INFRA_MEASURE_INSTRUCTION_COUNT=${{ env.INSTRUCTION_COUNT }}/g" ./php-version-benchmarks/config/infra/aws/x86_64-metal.ini
142-
cp ./php-version-benchmarks/build/infrastructure/config/aws.tfvars.dist ./php-version-benchmarks/build/infrastructure/config/aws.tfvars
143-
sed -i 's/access_key = ""/access_key = "${{ secrets.PHP_VERSION_BENCHMARK_AWS_ACCESS_KEY }}"/g' ./php-version-benchmarks/build/infrastructure/config/aws.tfvars
144-
sed -i 's/secret_key = ""/secret_key = "${{ secrets.PHP_VERSION_BENCHMARK_AWS_SECRET_KEY }}"/g' ./php-version-benchmarks/build/infrastructure/config/aws.tfvars
145-
sed -i 's/github_token = ""/github_token = "${{ secrets.GITHUB_TOKEN }}"/g' ./php-version-benchmarks/build/infrastructure/config/aws.tfvars
146134
- name: Setup PHP config - baseline PHP version
147135
run: |
148136
set -e
@@ -153,7 +141,7 @@ jobs:
153141
PHP_NAME="PHP - baseline@$BASELINE_SHORT_SHA"
154142
PHP_ID=php_baseline
155143
156-
PHP_REPO=https://github.com/${{ env.REPOSITORY }}.git
144+
PHP_REPO=${{ github.server_url }}/${{ env.REPOSITORY }}.git
157145
PHP_BRANCH=${{ env.BRANCH }}
158146
PHP_COMMIT=${{ env.BASELINE_COMMIT }}
159147
@@ -170,7 +158,7 @@ jobs:
170158
PHP_NAME="PHP - baseline@$BASELINE_SHORT_SHA (JIT)"
171159
PHP_ID=php_baseline_jit
172160
173-
PHP_REPO=https://github.com/${{ env.REPOSITORY }}.git
161+
PHP_REPO=${{ github.server_url }}/${{ env.REPOSITORY }}.git
174162
PHP_BRANCH=${{ env.BRANCH }}
175163
PHP_COMMIT=${{ env.BASELINE_COMMIT }}
176164
@@ -191,11 +179,13 @@ jobs:
191179
LAST_RESULT_SHA="$(cd ./php-version-benchmarks/tmp/php_${{ env.ID }}/ && git --no-pager log --until="$YESTERDAY" -n 1 --pretty='%H')"
192180
fi
193181
182+
echo "LAST_RESULT_SHA=$LAST_RESULT_SHA" >> $GITHUB_ENV
183+
194184
cat << EOF > ./php-version-benchmarks/config/php/previous.ini
195185
PHP_NAME="PHP - previous ${{ env.BRANCH }}"
196186
PHP_ID=php_previous
197187
198-
PHP_REPO=https://github.com/${{ env.REPOSITORY }}.git
188+
PHP_REPO=${{ github.server_url }}/${{ env.REPOSITORY }}.git
199189
PHP_BRANCH=${{ env.BRANCH }}
200190
PHP_COMMIT=$LAST_RESULT_SHA
201191
@@ -209,7 +199,7 @@ jobs:
209199
PHP_NAME="PHP - ${{ env.BRANCH }}"
210200
PHP_ID=php_${{ env.ID }}
211201
212-
PHP_REPO=https://github.com/${{ env.REPOSITORY }}.git
202+
PHP_REPO=${{ github.server_url }}/${{ env.REPOSITORY }}.git
213203
PHP_BRANCH=${{ env.BRANCH }}
214204
PHP_COMMIT=${{ env.COMMIT }}
215205
@@ -224,7 +214,7 @@ jobs:
224214
PHP_NAME="PHP - ${{ env.BRANCH }} (JIT)"
225215
PHP_ID=php_${{ env.ID }}_jit
226216
227-
PHP_REPO=https://github.com/${{ env.REPOSITORY }}.git
217+
PHP_REPO=${{ github.server_url }}/${{ env.REPOSITORY }}.git
228218
PHP_BRANCH=${{ env.BRANCH }}
229219
PHP_COMMIT=${{ env.COMMIT }}
230220
@@ -244,6 +234,37 @@ jobs:
244234
if [ "${{ env.RUN_MICRO_BENCH }}" -eq "1" ]; then
245235
cp ./php-version-benchmarks/config/test/6_micro_bench.php.ini.dist ./php-version-benchmarks/config/test/6_micro_bench.php.ini
246236
fi
237+
- name: Setup infra config
238+
run: |
239+
set -e
240+
241+
if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
242+
WORKSPACE="manual"
243+
BASE_COMMIT="$(echo "${{ env.BASELINE_COMMIT }}" | cut -c 1-6)"
244+
else
245+
WORKSPACE="nightly"
246+
BASE_COMMIT="$(echo "${{ env.LAST_RESULT_SHA }}" | cut -c 1-6)"
247+
fi
248+
COMPARE_COMMIT="$(echo "${{ env.COMMIT }}" | cut -c 1-6)"
249+
250+
cp ./php-version-benchmarks/config/infra/aws/x86_64-metal.ini.dist ./php-version-benchmarks/config/infra/aws/x86_64-metal.ini
251+
sed -i "s|INFRA_DOCKER_REGISTRY=public.ecr.aws/abcdefgh|INFRA_DOCKER_REGISTRY=${{ secrets.PHP_VERSION_BENCHMARK_DOCKER_REGISTRY }}|g" ./php-version-benchmarks/config/infra/aws/x86_64-metal.ini
252+
sed -i "s|INFRA_WORKSPACE=|INFRA_WORKSPACE=$WORKSPACE|g" ./php-version-benchmarks/config/infra/aws/x86_64-metal.ini
253+
sed -i "s/INFRA_MEASURE_INSTRUCTION_COUNT=0/INFRA_MEASURE_INSTRUCTION_COUNT=${{ env.INSTRUCTION_COUNT }}/g" ./php-version-benchmarks/config/infra/aws/x86_64-metal.ini
254+
255+
cp ./php-version-benchmarks/build/infrastructure/config/aws.tfvars.dist ./php-version-benchmarks/build/infrastructure/config/aws.tfvars
256+
sed -i 's/access_key = ""/access_key = "${{ secrets.PHP_VERSION_BENCHMARK_AWS_ACCESS_KEY }}"/g' ./php-version-benchmarks/build/infrastructure/config/aws.tfvars
257+
sed -i 's/secret_key = ""/secret_key = "${{ secrets.PHP_VERSION_BENCHMARK_AWS_SECRET_KEY }}"/g' ./php-version-benchmarks/build/infrastructure/config/aws.tfvars
258+
sed -i 's/state_bucket = ""/state_bucket = "${{ secrets.PHP_VERSION_BENCHMARK_STATE_BUCKET }}"/g' ./php-version-benchmarks/build/infrastructure/config/aws.tfvars
259+
sed -i 's/github_token = ""/github_token = "${{ secrets.GITHUB_TOKEN }}"/g' ./php-version-benchmarks/build/infrastructure/config/aws.tfvars
260+
261+
WORKFLOW_RUN_URL="${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}"
262+
sed -i "s|log_url = \"\"|log_url = \"$WORKFLOW_RUN_URL\"|g" ./php-version-benchmarks/build/infrastructure/config/aws.tfvars
263+
sed -i 's|artifact_url = ""|artifact_url = "#ARTIFACT_URL#"|g' ./php-version-benchmarks/build/infrastructure/config/aws.tfvars
264+
265+
CHANGESET_URL="${{ github.server_url }}/${{ github.repository }}/compare/$BASE_COMMIT..$COMPARE_COMMIT"
266+
sed -i 's|extra_title = ""|extra_title = "Changeset"|g' ./php-version-benchmarks/build/infrastructure/config/aws.tfvars
267+
sed -i "s|extra_text = \"\"|extra_text = \"$CHANGESET_URL\"|g" ./php-version-benchmarks/build/infrastructure/config/aws.tfvars
247268
- name: Run benchmark
248269
run: ./php-version-benchmarks/benchmark.sh run aws
249270
- name: Store results
@@ -264,7 +285,7 @@ jobs:
264285
git commit -m "Add result for ${{ github.repository }}@${{ github.sha }}"
265286
git push
266287
- name: Upload artifacts
267-
if: github.event_name == 'workflow_dispatch'
288+
id: upload
268289
uses: actions/upload-artifact@v6
269290
with:
270291
name: results
@@ -278,6 +299,7 @@ jobs:
278299
run: |
279300
cd ./php-version-benchmarks/tmp/php_${{ env.ID }}
280301
NEWEST_RESULT_DIRECTORY=$(ls -td ${{ github.workspace }}/php-version-benchmarks/docs/results/${{ env.YEAR }}/*/ | head -1)
302+
sed -i "s|#ARTIFACT_URL#|${{ steps.upload.outputs.artifact-url }}|g" "${NEWEST_RESULT_DIRECTORY}result.md"
281303
gh pr comment ${{ inputs.pull_request }} --body-file "${NEWEST_RESULT_DIRECTORY}result.md" --repo ${{ github.repository }}
282304
- name: Cleanup
283305
if: always()

NEWS

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ PHP NEWS
88
. It is now possible to use reference assign on WeakMap without the key
99
needing to be present beforehand. (ndossche)
1010
. Added `clamp()`. (kylekatarnls, thinkverse)
11+
. Fix OSS-Fuzz #429429090 (Failed assertion on unset() with uninitialized
12+
container). (ilutov)
13+
. Fixed GH-20564 (Don't call autoloaders with pending exception). (ilutov)
1114

1215
- Date:
1316
. Update timelib to 2022.16. (Derick)

UPGRADING.INTERNALS

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ PHP 8.6 INTERNALS UPGRADE NOTES
5454
ZEND_ACC_USER_ARG_INFO flag was set.
5555
. Added zend_ast_call_get_args() to fetch the argument node from any call
5656
node.
57+
. The zend_exception_save() and zend_exception_restore() functions were
58+
removed.
5759

5860
========================
5961
2. Build system changes

Zend/Optimizer/zend_inference.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3840,7 +3840,7 @@ static zend_always_inline zend_result _zend_update_type_info(
38403840
tmp &= ~MAY_BE_RC1;
38413841
}
38423842
if (opline->opcode == ZEND_FETCH_STATIC_PROP_IS) {
3843-
tmp |= MAY_BE_UNDEF;
3843+
tmp |= MAY_BE_NULL;
38443844
}
38453845
}
38463846
UPDATE_SSA_TYPE(tmp, ssa_op->result_def);

Zend/tests/gh20564.phpt

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
--TEST--
2+
GH-20564: Don't call autoloaders with pending exception
3+
--CREDITS--
4+
Viet Hoang Luu (@vi3tL0u1s)
5+
--FILE--
6+
<?php
7+
8+
class A {
9+
function __call($method, $args) {
10+
eval("<<<ENDOFSTRING\n Test\n ENDOFSTRING;");
11+
spl_autoload_register('A::test');
12+
array_map('B::test', []);
13+
}
14+
}
15+
16+
try {
17+
(new A)->test();
18+
} catch (Throwable $e) {
19+
echo $e->getMessage(), "\n";
20+
}
21+
22+
?>
23+
--EXPECT--
24+
array_map(): Argument #1 ($callback) must be a valid callback or null, class "B" not found
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
--TEST--
2+
OSS-Fuzz #471486164: get_property_ptr_ptr() on uninitialized hooked property
3+
--FILE--
4+
<?php
5+
6+
class C {
7+
public $a {
8+
get => $this->a;
9+
set { $this->a = &$value; }
10+
}
11+
public $x = 1;
12+
}
13+
14+
$proxy = (new ReflectionClass(C::class))->newLazyProxy(function ($proxy) {
15+
$proxy->a = 1;
16+
return new C;
17+
});
18+
var_dump($proxy->x);
19+
20+
?>
21+
--EXPECT--
22+
int(1)
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
--TEST--
2+
OSS-Fuzz #471486164: get_property_ptr_ptr() on uninitialized hooked property
3+
--FILE--
4+
<?php
5+
6+
class C {
7+
public int $a {
8+
get => $this->a;
9+
set {
10+
global $ref;
11+
$this->a = &$ref;
12+
}
13+
}
14+
}
15+
16+
$ref = 1;
17+
$proxy = new C;
18+
$proxy->a = 1;
19+
var_dump($proxy->a);
20+
$ref++;
21+
var_dump($proxy->a);
22+
23+
?>
24+
--EXPECT--
25+
int(1)
26+
int(2)

Zend/tests/oss_fuzz_429429090.phpt

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
--TEST--
2+
OSS-Fuzz #429429090: FETCH_OBJ_UNSET IS_UNDEF result
3+
--FILE--
4+
<?php
5+
6+
class C {
7+
public D $x;
8+
static D $y;
9+
}
10+
11+
$c = new C();
12+
isset($c->x[0]->prop);
13+
unset($c->x[0]->prop);
14+
isset(C::$y[0]->prop);
15+
unset(C::$y[0]->prop);
16+
17+
?>
18+
===DONE===
19+
--EXPECT--
20+
===DONE===

Zend/tests/oss_fuzz_438780145.phpt

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
--TEST--
2+
OSS-Fuzz #438780145: Nested finally with repeated return type check may uaf
3+
--FILE--
4+
<?php
5+
6+
function &test(): int {
7+
$x = 0;
8+
try {
9+
return $x;
10+
} finally {
11+
try {
12+
return $x;
13+
} finally {
14+
$x = "";
15+
}
16+
}
17+
}
18+
19+
test();
20+
21+
?>
22+
--EXPECTF--
23+
Fatal error: Uncaught TypeError: test(): Return value must be of type int, string returned in %s:%d
24+
Stack trace:
25+
#0 %s(%d): test()
26+
#1 {main}
27+
thrown in %s on line %d

Zend/zend.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1082,7 +1082,6 @@ void zend_startup(zend_utility_functions *utility_functions) /* {{{ */
10821082
#endif
10831083

10841084
zend_enum_startup();
1085-
zend_closure_startup();
10861085
}
10871086
/* }}} */
10881087

@@ -1979,7 +1978,6 @@ ZEND_API zend_result zend_execute_script(int type, zval *retval, zend_file_handl
19791978
zend_result ret = SUCCESS;
19801979
if (op_array) {
19811980
zend_execute(op_array, retval);
1982-
zend_exception_restore();
19831981
if (UNEXPECTED(EG(exception))) {
19841982
if (Z_TYPE(EG(user_exception_handler)) != IS_UNDEF) {
19851983
zend_user_exception_handler();

0 commit comments

Comments
 (0)