From 51cafda4a33993d210ff5641b5e87ab4bd7638c6 Mon Sep 17 00:00:00 2001 From: terrafrost Date: Tue, 13 Sep 2022 23:56:13 -0500 Subject: [PATCH] make PHP 8.1 32-bit changes compatable with raspberry pi's --- phpseclib/Math/BigInteger.php | 2 +- phpseclib/Net/SFTP.php | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/phpseclib/Math/BigInteger.php b/phpseclib/Math/BigInteger.php index ec07d3d8..c2bccae2 100644 --- a/phpseclib/Math/BigInteger.php +++ b/phpseclib/Math/BigInteger.php @@ -371,7 +371,7 @@ class Math_BigInteger break; case MATH_BIGINTEGER_MODE_BCMATH: // round $len to the nearest 4 (thanks, DavidMJ!) - $len = (strlen($x) + 3) & 0xFFFFFFFC; + $len = (strlen($x) + 3) & ~3; $x = str_pad($x, $len, chr(0), STR_PAD_LEFT); diff --git a/phpseclib/Net/SFTP.php b/phpseclib/Net/SFTP.php index b8b1bab6..e20c4cd6 100644 --- a/phpseclib/Net/SFTP.php +++ b/phpseclib/Net/SFTP.php @@ -459,8 +459,11 @@ class Net_SFTP extends Net_SSH2 0x00002000 => 'NET_SFTP_ATTR_LINK_COUNT', 0x00004000 => 'NET_SFTP_ATTR_UNTRANSLATED_NAME', 0x00008000 => 'NET_SFTP_ATTR_CTIME', - // intval is used because 0x80000000 will yield a floating point on 32-bit systems - intval(0x80000000) => 'NET_SFTP_ATTR_EXTENDED' + // 0x80000000 will yield a floating point on 32-bit systems and converting floating points to integers + // yields inconsistent behavior depending on how php is compiled. so we left shift -1 (which, in + // two's compliment, consists of all 1 bits) by 31. on 64-bit systems this'll yield 0xFFFFFFFF80000000. + // that's not a problem, however, and 'anded' and a 32-bit number, as all the leading 1 bits are ignored. + (PHP_INT_SIZE == 4 ? -1 : 0xFFFFFFFF) => 'NET_SFTP_ATTR_EXTENDED' ); $this->open_flags = array( 0x00000001 => 'NET_SFTP_OPEN_READ',