From c14785c3795cbb54786fe8dd991ed70784027f06 Mon Sep 17 00:00:00 2001 From: Valerio Bozzolan Date: Tue, 9 May 2023 08:28:44 +0200 Subject: [PATCH] Fix PHP 8.1 "strpos(null)" exception from PhutilCommandString which blocks arc patch Summary: For some reason it may happen that a specific command line argument receives a null argument from PHP, instead of just an empty string. Nowadays, this null value probably breaks almost whatever GNU/Linux or FreeBSD or Microsoft Windows etc. implementations since everyone expect to receive a string. This used to work in the past since functions like strpos() or strlen() accepted null, but not anymore. This generate a deprecation warning since PHP 8.1, that is elevated as exception from Phabricator/Phorge and breaking features. Without getting into implementation logics (which doesn't make sense to fix all of them) the calling function should just be kind. So we normalize nonsense null values to an empty string. Note: this was the expected behavior prior to PHP 8.1. Now we do that normalization explicitly, in this early point. After this fix, also T15368 should probably be fixed. Closes T15367 Test Plan: - run "arc patch " - to you it must continue to work - (to @ton it starts working right now) Reviewers: O1 Blessed Committers, avivey Reviewed By: O1 Blessed Committers, avivey Subscribers: speck, tobiaswiese, Matthew, Cigaryno, ton Maniphest Tasks: T15367 Differential Revision: https://we.phorge.it/D25205 --- src/xsprintf/PhutilCommandString.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/xsprintf/PhutilCommandString.php b/src/xsprintf/PhutilCommandString.php index 671600ed..e26d6295 100644 --- a/src/xsprintf/PhutilCommandString.php +++ b/src/xsprintf/PhutilCommandString.php @@ -56,6 +56,13 @@ final class PhutilCommandString extends Phobject { } } + // Be generous about what we accept + // but normalize to a value that makes sense for a command line + // premising that CLIs only accept strings since that is how computers work + if ($value === null) { + $value = ''; + } + switch ($mode) { case self::MODE_LINUX: return self::escapeLinux($value);