2016-02-20 1 views
0

Version courte

Pourquoi ce code non modifié du PHP officiel 5.6.18 version:Building PHP5.6.18 Arch Linux: test de Windows ne sauté malgré PHP_OS vérifier

--SKIPIF-- 
<?php 
if (phpversion() < "5.3.0") { die('SKIP php version so lower.'); } 
if (!extension_loaded('openssl')) { die('ext/openssl required'); } 
if(substr(PHP_OS, 0, 3) != 'WIN') { 
     die('skip windows only test'); 
} 
?> 

... pas la cause un test Windows uniquement à ignorer lorsque je construis le paquet PHP sur Arch Linux?

Version longue

Je suis en train de construire PHP5.6.18 utilisant le PKGBUILD du système officiel Arch Build. Voici ce que je l'ai fait:

  1. git clone git://projects.archlinux.org/svntogit/packages.git
  2. Je suis passé par le git history of the php package et identifié this commit comme le meilleur point de départ - essentiellement la dernière livraison avant la UPréc à PHP7. Donc, je cd dans packages, et git checkout qui commettent l'ID.
  3. I mis à la PKGBUILD comme ceci:
    • réglé pkgver=5.6.18
    • réglé pkgrel=1
    • définir le premier md5sum à '177ba962557795866ae331ad4ad99bba'
  4. setup clean chroot for building (ce qui a réduit les échecs de test de 2-3 à 1
  5. Créer un fichier php: makechrootpkg -c -r $CHROOT (dans le répertoire contenant le fichier PKGBUILD)

La construction fonctionne très bien, mais je reçois l'échec du test suivant:

Number of tests : 6651    6180 
Tests skipped : 471 ( 7.1%) -------- 
Tests warned : 1 ( 0.0%) ( 0.0%) 
Tests failed : 1 ( 0.0%) ( 0.0%) 
Expected fail : 9 ( 0.1%) ( 0.1%) 
Tests passed : 6169 (92.8%) (99.8%) 
--------------------------------------------------------------------- 
Time taken  : 45 seconds 
... 
FAILED TEST SUMMARY 
--------------------------------------------------------------------- 
mixed stream_socket_enable_crypto(resource $stream , bool $enable [, int $crypto_type [, resource $session_stream 
]]) ; [ext/standard/tests/streams/stream_socket_enable_crypto-win32.phpt] 
===================================================================== 

===================================================================== 
WARNED TEST SUMMARY 
--------------------------------------------------------------------- 
Bug #70172 - Use After Free Vulnerability in unserialize() [ext/standard/tests/serialize/bug70172.phpt] (warn: XFA 
IL section but test passes) 
===================================================================== 

OK, donc le win32 semble déjà suspect dans le nom du fichier, et un regard sur le contenu du fichier suggère en effet que le test devrait être sautée sur Linux:

--TEST-- 
mixed stream_socket_enable_crypto(resource $stream , bool $enable [, int $crypto_type [, resource $session_stream ]]) ; 
... 
--SKIPIF-- 
<?php 
if (phpversion() < "5.3.0") { die('SKIP php version so lower.'); } 
if (!extension_loaded('openssl')) { die('ext/openssl required'); } 
if(substr(PHP_OS, 0, 3) != 'WIN') { 
     die('skip windows only test'); 
} 
?> 

Notez le PHP_OS de contrôle connexes. Donc, je pense, peut-être PHP_OS est en quelque sorte obtenir la mauvaise valeur. Alors, je:

  1. aller manuellement dans le chroot de construction: arch-nspawn $CHROOT/$USER/
  2. Ajouter echo substr(PHP_OS, 0, 3) au début de ce test (juste sous la <?php dans la section --FILE--, et dans le fichier stream_socket_enable_crypto-win32.php réel)
  3. Réexécutez-le en utilisant le script stream_socket_enable_crypto-win32.sh dans le même répertoire, je vois en effet la sortie attendue Lin.

Pourquoi ce test n'est-il pas ignoré? Je suis vraiment confus. Comment puis-je résoudre ce problème?

Répondre

1

Pour contourner ce problème, pour l'instant je vais juste supprimer le test dans la section prepare() du fichier PKGBUILD:

prepare() { 
     cd ${srcdir}/${pkgbase}-${pkgver} 
     # .... 
     # add this line: 
     rm ./ext/standard/tests/streams/stream_socket_enable_crypto-win32.phpt 
} 
+0

Comme il est une solution plutôt qu'une solution appropriée, je ne vais pas marquer ceci comme la réponse tout à fait encore, voir si n'importe qui a une meilleure idée/solution/cause racine. – m01

0

Ce serait bien si M01 serait nous faire connaître le nom du fichier PKGBUILD il édité afin que je puisse jeter un coup d'oeil à cela aussi bien.

Mais jusque-là il suffit d'ouvrir ce fichier:

/usr/src/php/ext/standard/tests/streams/stream_socket_enable_crypto-win32.phpt 

et trouver cette ligne comme indiqué ci-dessus ainsi.

Et commentez la ligne, si quelqu'un est encore en cours d'exécution PHP 5.3, ils devraient être tarballed et de toute façon lol .. emplumé

//commented out by dave due to bug and should be skipped 
//if (phpversion() < "5.3.0") { die('SKIP php version so lower.'); } 
+0

Je suis assez sûr que c'est juste le [fichier principal PKGBUILD php] (https://git.archlinux.org/svntogit/packages.git/tree/trunk/PKGBUILD?h=packages/php) dans e.g. '/ var/abs/extra/php/PKGBUILD' (si vous utilisez ABS), qui construit un tas de paquets liés au PHP. – m01