PEAR is discontinued

This is a static archive preserving historical releases and metadata. No new packages or updates will be published. For updates to existing packages, or to publish new packages, please use Composer and Packagist.

Home » PEAR » PEAR » Bug #9355

Bug in GLIBC detection (OS/Guess.php), patch proposal

Details

Submitted2006-11-16 17:47 UTC
FromFedora at FamilleCollet dot com
Assignedcellog
StatusClosed
PackagePEAR
PHP Version5.2.0
OSLinux (Fedora)
Roadmaps(Not assigned)

Comments

[2006-11-16 17:47 UTC] Fedora at FamilleCollet dot com

Description:
------------
GLIBC version is detected in OS/Guess.php

This require "cpp" and "/usr/include/features.h" (glibc-headers)

If "cpp" is available, the script compile a small piece of code which include "features.h" without testing if it is installed.

And finaly the failback (reading the link /lib/libc.so.6) seems broken (regex problem).

Test script:
---------------
php -r 'require("OS/Guess.php"); print_r(new OS_Guess());'

Expected result:
----------------
OS_Guess Object
(
[sysname] => linux
[nodename] => remi
[cpu] => x86_64
[release] => 2.6
[extra] => glibc2.5
)

Actual result:
--------------
/tmp/glibctest3HeaAL:1:22: erreur: features.h : Aucun fichier ou répertoire de ce type
OS_Guess Object
(
[sysname] => linux
[nodename] => remi
[cpu] => x86_64
[release] => 2.6
[extra] => glibc__GLIBC__.__GLIBC_MINOR__
)

[2006-11-16 17:49 UTC] Fedora at FamilleCollet dot com

Here is a patch :

--- OS/Guess.php.orig 2006-11-01 08:26:23.000000000 +0100
+++ OS/Guess.php 2006-11-01 08:42:32.000000000 +0100
@@ -202,11 +202,11 @@
return $glibc; // no need to run this multiple times
}
include_once "System.php";
- if (!@file_exists('/usr/bin/cpp') || !@is_executable('/usr/bin/cpp')) {
- // Use glibc's <features.h> header file to
- // get major and minor version number:
- if (@file_exists('/usr/include/features.h') &&
- @is_readable('/usr/include/features.h')) {
+ // Use glibc's <features.h> header file to
+ // get major and minor version number:
+ if (@file_exists('/usr/include/features.h') &&
+ @is_readable('/usr/include/features.h')) {
+ if (!@file_exists('/usr/bin/cpp') || !@is_executable('/usr/bin/cpp')) {
$features_file = fopen('/usr/include/features.h', 'rb');
while (!feof($features_file)) {
$line = fgets($features_file, 8192);
@@ -238,29 +238,31 @@
return $glibc = '';
}
return $glibc = 'glibc' . trim($glibc_major) . "." . trim($glibc_minor) ;
+ } // No cpp
+ $tmpfile = System::mktemp("glibctest");
+ $fp = fopen($tmpfile, "w");
+ fwrite($fp, "#include <features.h>\n__GLIBC__ __GLIBC_MINOR__\n");
+ fclose($fp);
+ $cpp = popen("/usr/bin/cpp $tmpfile", "r");
+ $major = $minor = 0;
+ while ($line = fgets($cpp, 1024)) {
+ if ($line{0} == '#' || trim($line) == '') {
+ continue;
+ }
+ if (list($major, $minor) = explode(' ', trim($line))) {
+ break;
+ }
}
- return $glibc = '';
- }
- $tmpfile = System::mktemp("glibctest");
- $fp = fopen($tmpfile, "w");
- fwrite($fp, "#include <features.h>\n__GLIBC__ __GLIBC_MINOR__\n");
- fclose($fp);
- $cpp = popen("/usr/bin/cpp $tmpfile", "r");
- $major = $minor = 0;
- while ($line = fgets($cpp, 1024)) {
- if ($line{0} == '#' || trim($line) == '') {
- continue;
- }
- if (list($major, $minor) = explode(' ', trim($line))) {
- break;
+ pclose($cpp);
+ unlink($tmpfile);
+ if (!($major && $minor)) {
+ return $glibc = "glibc{$major}.{$minor}";
}
- }
- pclose($cpp);
- unlink($tmpfile);
- if (!($major && $minor) && is_link('/lib/libc.so.6')) {
+ } // features.h
+ if (is_link('/lib/libc.so.6')) {
// Let's try reading the libc.so.6 symlink
- if (ereg('^libc-([.*])\.so$', basename(readlink('/lib/libc.so.6')), $matches)) {
- list($major, $minor) = explode('.', $matches);
+ if (ereg('^libc-(.*)\.so$', basename(readlink('/lib/libc.so.6')), $matches)) {
+ list($major, $minor) = explode('.', $matches[1]);
}
}
if (!($major && $minor)) {

[2006-11-16 17:50 UTC] Fedora at FamilleCollet dot com

Change summary.

[2006-11-21 06:34 UTC] Fedora at FamilleCollet dot com

Thank's for fixing this bug.

It seems to me there still a problem with the "ereg" command as it return an array :
array(2) {
[0]=>
string(11) "libc-2.5.so"
[1]=>
string(3) "2.5"
}
From php doc :
If matches are found for parenthesized substrings of pattern and the function is called with the third argument regs, the matches will be stored in the elements of the array regs. $regs[1] will contain the substring which starts at the first left parenthesis; $regs[2] will contain the substring starting at the second, and so on. $regs[0] will contain a copy of the complete string matched.

So, you should use (line 262) :
list($major, $minor) = explode('.', $matches[1]);

[2006-12-09 18:12 UTC] Fedora at FamilleCollet dot com

What about fixing the last problem with ereg ?