Page MenuHomePhorge

Fix PHP 8.1 "strlen(null)" exception on History page of Diffusion repo after setting maintenance mode
ClosedPublic

Authored by aklapper on Jun 14 2023, 19:21.
Tags
None
Referenced Files
Unknown Object (File)
Sun, May 12, 12:35
Unknown Object (File)
Sun, May 12, 12:35
Unknown Object (File)
Wed, May 8, 11:23
Unknown Object (File)
Wed, May 8, 11:21
Unknown Object (File)
Wed, May 8, 11:20
Unknown Object (File)
Wed, May 8, 10:11
Unknown Object (File)
Wed, May 8, 09:27
Unknown Object (File)
Wed, May 8, 04:35

Details

Summary

strlen() was used in Phabricator to check if a generic value is a non-empty string.
This behavior is deprecated since PHP 8.1. Phorge adopts phutil_nonempty_string() as a replacement.

Note: this may highlight other absurd input values that might be worth correcting
instead of just ignoring. If phutil_nonempty_string() throws an exception in your
instance, report it to Phorge to evaluate and fix that specific corner case.

EXCEPTION: (RuntimeException) strlen(): Passing null to parameter #1 ($string) of type string is deprecated at [<arcanist>/src/error/PhutilErrorHandler.php:261]
arcanist(head=master, ref.master=97e163187418), phorge(head=master, ref.master=1c098c273d06)
  #0 <#2> PhutilErrorHandler::handleError(integer, string, string, integer) called at [<phorge>/src/applications/repository/xaction/PhabricatorRepositoryMaintenanceTransaction.php:28]

Closes T15475

Test Plan

Play a bit with maintenance messages:

./bin/repository maintenance --start "Start"      R1
./bin/repository maintenance --start "Start Yeah" R1
./bin/repository maintenance --stop               R1

Then visit /diffusion/1/manage/history/ and look at Diffusion put this repository into maintenance mode. as expected, instead of an exception.

Diff Detail

Repository
rP Phorge
Lint
Lint Not Applicable
Unit
Tests Not Applicable

Event Timeline

Indeed the maintenance message should always be null or a string. Soft +1 for a week. Then hard +1.

src/applications/repository/xaction/PhabricatorRepositoryMaintenanceTransaction.php
27

Thanks again. To make this a bit more readable (and a bit more performant) than the original legacy source code, maybe we can define these in line 27, and use these instead:

$old_nonempty = phutil_nonempty_string($old);
$new_nonempty = phutil_nonempty_string($new);
valerio.bozzolan edited the test plan for this revision. (Show Details)

I tested all the cases locally, seems good to me. I will just amend the small proposed thing for better readability.

sgtm

This revision is now accepted and ready to land.Jul 5 2023, 13:07