php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #74114 undefined symbol: Z_STRVAL_PP
Submitted: 2017-02-16 21:56 UTC Modified: 2020-12-23 19:07 UTC
Votes:2
Avg. Score:5.0 ± 0.0
Reproduced:2 of 2 (100.0%)
Same Version:1 (50.0%)
Same OS:2 (100.0%)
From: neyman dot neil dot e at dol dot gov Assigned: calvinb (profile)
Status: Closed Package: PDO_IBM (PECL)
PHP Version: 7.0.16 OS: RHEL 6.8
Private report: No CVE-ID: None
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If this is not your bug, you can add a comment by following this link.
If this is your bug, but you forgot your password, you can retrieve your password here.
Password:
Status:
Package:
Bug Type:
Summary:
From: neyman dot neil dot e at dol dot gov
New email:
PHP Version: OS:

 

 [2017-02-16 21:56 UTC] neyman dot neil dot e at dol dot gov
Description:
------------
In ibm_driver.c, around line 985:


+#if PHP_MAJOR_VERSION >= 7
+                        if (Z_TYPE(data) == IS_STRING) {
+#else  
                        if (Z_TYPE_PP(data) == IS_STRING) {
+#endif
                                option_str = Z_STRVAL_PP(data);
                        } else {


The opt_str = Z_STR_PP(data) after the endif fails on php 7.  The module compiles, but when I include the module in php.ini, there is an error when running php 7:  "undefined symbol: Z_STRVAL_PP" and the pdo_ibm module will not load.



Test script:
---------------
I tried replacing with:  

#if PHP_MAJOR_VERSION >= 7
                        if (Z_TYPE(data) == IS_STRING) {
                              option_str = Z_STRVAL_P(*data);

#else
                        if (Z_TYPE_PP(data) == IS_STRING) {
                               option_str = Z_STRVAL_PP(data);

#endif
                        } else {


And in this case the module loads without that error, but not sure if it is correct.  It seems definitely must not have the Z_STRVAL_PP after the endif or it will still load in php version >= 7.


Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2017-02-21 12:49 UTC] fred dot demarcy dot ml at gmail dot com
Experiencing same problem.
I can get the code to compile using:

#if PHP_MAJOR_VERSION >= 7
                        if (Z_TYPE(data) == IS_STRING) {
                              option_str = Z_STRVAL_P(*data);

#else
                        if (Z_TYPE_PP(data) == IS_STRING) {
                               option_str = Z_STRVAL_PP(data);

#endif
                        } else {

but then this causes segmentation fault... executing on the cli or in Apache

Script:
<?php
try
{
    $db= new PDO("ibm:DATABASE=GEN1;HOSTNAME=10.78.10.16;PORT=50000;", "admin", "bluebird456", array(PDO::ATTR_CASE=> PDO::CASE_NATURAL));
}
catch(PDOException $e)
{
	die("Connection error: ".$e->getMessage());
}

$attributes = array(
    "AUTOCOMMIT", "ERRMODE", "CASE", "CLIENT_VERSION", "CONNECTION_STATUS",
    "ORACLE_NULLS", "PERSISTENT", "PREFETCH", "SERVER_INFO", "SERVER_VERSION",
    "TIMEOUT"
);

foreach ($attributes as $val) {
    echo "PDO::ATTR_$val: ";
    echo $db->getAttribute(constant("PDO::ATTR_$val")) . "\n";
}

?>


# strace php <script>.php
...
access("/home/db2inst1/sqllib/cfg/db2dsdriver.cfg", F_OK) = -1 ENOENT (No such file or directory)
open("/home/db2inst1/sqllib/cfg/db2cli.ini", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/home/db2inst1/sqllib/cfg/db2cli.ini", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/home/db2inst1/sqllib/cfg/db2cli.ini", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/home/db2inst1/sqllib/cfg/db2cli.ini", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/home/db2inst1/sqllib/cfg/db2cli.ini", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/home/db2inst1/sqllib/cfg/db2cli.ini", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/home/db2inst1/sqllib/cfg/db2cli.ini", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/home/db2inst1/sqllib/cfg/db2cli.ini", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/home/db2inst1/sqllib/cfg/db2cli.ini", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/home/db2inst1/sqllib/cfg/db2cli.ini", O_RDONLY) = -1 ENOENT (No such file or directory)
semget(0x52dfa674, 1, 0)                = -1 ENOENT (No such file or directory)
mmap(NULL, 262144, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f779d086000
mmap(NULL, 262144, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f779d046000
semget(0x52dfa674, 1, 0)                = -1 ENOENT (No such file or directory)
semget(0x52dfa674, 1, 0)                = -1 ENOENT (No such file or directory)
semget(0x52dfa674, 1, 0)                = -1 ENOENT (No such file or directory)
semget(0x52dfa674, 1, 0)                = -1 ENOENT (No such file or directory)
--- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=0} ---
+++ killed by SIGSEGV (core dumped) +++
Segmentation fault (core dumped)

In Apache I get:
[Tue Feb 21 12:35:56.815597 2017] [core:notice] [pid 4737] AH00052: child pid 11607 exit signal Segmentation fault (11)
 [2017-02-22 19:26 UTC] neyman dot neil dot e at dol dot gov
Possibly the segfault is related to Bug #72424...

I was able to successfully connect using "fred's" test script if I removed the options parameter from the connection string

$db= new PDO("ibm:DATABASE=$database;HOSTNAME=$hostname;PORT=$port;", $user, $password);

But also get the segfault when I add options to end of the PDO array.
 [2017-02-23 15:53 UTC] fred dot demarcy dot ml at gmail dot com
Indeed without the options parameter from the connection string I can connect as well! Good catch :-)


$ php DB2-Fred-Test.php
PDO::ATTR_AUTOCOMMIT: 1
PDO::ATTR_ERRMODE: 0
PDO::ATTR_CASE: 1
PDO::ATTR_CLIENT_VERSION: 1.3.4
PDO::ATTR_CONNECTION_STATUS: PHP Warning:  PDO::getAttribute(): SQLSTATE[IM001]: Driver does not support this function: driver does not support that attribute in /home/freds/Downloads/DB2-Fred-Test.php on line 30
PHP Stack trace:
PHP   1. {main}() /home/freds/Downloads/DB2-Fred-Test.php:0
PHP   2. PDO->getAttribute() /home/freds/Downloads/DB2-Fred-Test.php:30

Warning: PDO::getAttribute(): SQLSTATE[IM001]: Driver does not support this function: driver does not support that attribute in /home/freds/Downloads/DB2-Fred-Test.php on line 30

Call Stack:
    0.0005     353728   1. {main}() /home/freds/Downloads/DB2-Fred-Test.php:0
    1.5188     357416   2. PDO->getAttribute() /home/freds/Downloads/DB2-Fred-Test.php:30


PDO::ATTR_ORACLE_NULLS: 0
PDO::ATTR_PERSISTENT:
PDO::ATTR_PREFETCH: PHP Warning:  PDO::getAttribute(): SQLSTATE[IM001]: Driver does not support this function: driver does not support that attribute in /home/freds/Downloads/DB2-Fred-Test.php on line 30
PHP Stack trace:
PHP   1. {main}() /home/freds/Downloads/DB2-Fred-Test.php:0
PHP   2. PDO->getAttribute() /home/freds/Downloads/DB2-Fred-Test.php:30

Warning: PDO::getAttribute(): SQLSTATE[IM001]: Driver does not support this function: driver does not support that attribute in /home/freds/Downloads/DB2-Fred-Test.php on line 30

Call Stack:
    0.0005     353728   1. {main}() /home/freds/Downloads/DB2-Fred-Test.php:0
    1.5199     357416   2. PDO->getAttribute() /home/freds/Downloads/DB2-Fred-Test.php:30


PDO::ATTR_SERVER_INFO: DB2/NT64
PDO::ATTR_SERVER_VERSION: PHP Warning:  PDO::getAttribute(): SQLSTATE[IM001]: Driver does not support this function: driver does not support that attribute in /home/freds/Downloads/DB2-Fred-Test.php on line 30
PHP Stack trace:
PHP   1. {main}() /home/freds/Downloads/DB2-Fred-Test.php:0
PHP   2. PDO->getAttribute() /home/freds/Downloads/DB2-Fred-Test.php:30

Warning: PDO::getAttribute(): SQLSTATE[IM001]: Driver does not support this function: driver does not support that attribute in /home/freds/Downloads/DB2-Fred-Test.php on line 30

Call Stack:
    0.0005     353728   1. {main}() /home/freds/Downloads/DB2-Fred-Test.php:0
    1.5209     357416   2. PDO->getAttribute() /home/freds/Downloads/DB2-Fred-Test.php:30


PDO::ATTR_TIMEOUT: PHP Warning:  PDO::getAttribute(): SQLSTATE[IM001]: Driver does not support this function: driver does not support that attribute in /home/freds/Downloads/DB2-Fred-Test.php on line 30
PHP Stack trace:
PHP   1. {main}() /home/freds/Downloads/DB2-Fred-Test.php:0
PHP   2. PDO->getAttribute() /home/freds/Downloads/DB2-Fred-Test.php:30

Warning: PDO::getAttribute(): SQLSTATE[IM001]: Driver does not support this function: driver does not support that attribute in /home/freds/Downloads/DB2-Fred-Test.php on line 30

Call Stack:
    0.0005     353728   1. {main}() /home/freds/Downloads/DB2-Fred-Test.php:0
    1.5210     357416   2. PDO->getAttribute() /home/freds/Downloads/DB2-Fred-Test.php:30

The question is when will this get fixed?
 [2017-03-08 21:27 UTC] pollita@php.net
Unfortunately, this is far from the only bug in PDO_IBM's PHP7 implementation.  While I could apply your patch, there's no way the extension will actually function in PHP 7 or later as is.

As such I'd recommend contacting the package maintainer which is opendev@us.ibm.com according to https://pecl.php.net/package/PDO_IBM
 [2018-06-07 14:30 UTC] ronyan at outlook dot com
See a workaround: ( pdo_ibm 1.3.5 ) ibm_driver.c:



980 #if PHP_MAJOR_VERSION >= 7
981                         if (Z_TYPE_P(data) == IS_STRING) {
982 #else	
983 			if (Z_TYPE_PP(data) == IS_STRING) {
984 #endif
985 				option_str = Z_STRVAL_PP(data); // <--- this line
986 			} else {
987 #if PHP_MAJOR_VERSION >= 7
988 				option_num = Z_LVAL_P(data);
989 #else
990 				option_num = Z_LVAL_PP(data);
991 #endif
992 			}

FIX:

981 #if PHP_MAJOR_VERSION >= 7
982                         if (Z_TYPE_P(data) == IS_STRING) {
983 #else	
984 			if (Z_TYPE_PP(data) == IS_STRING) {
985 #endif
986 //------------- fix ---------------
987 #if PHP_MAJOR_VERSION >= 7
988 				option_str = Z_STRVAL_P(data);
989 #else
990 				option_str = Z_STRVAL_PP(data);
991 #endif
    //------------- end fix ---------------
992 			} else {
993 #if PHP_MAJOR_VERSION >= 7
994 				option_num = Z_LVAL_P(data);
995 #else
996 				option_num = Z_LVAL_PP(data);
997 #endif
998 			}
 [2020-12-23 19:07 UTC] calvinb@php.net
-Status: Open +Status: Closed -Assigned To: +Assigned To: calvinb
 [2020-12-23 19:07 UTC] calvinb@php.net
Hi, I've made sure PDO_IBM compiles OK on PHP 7.x (only tested myself with 7.3) and 8.0. Let me know if you still have issues with this; otherwise I'm closing this issue.
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Tue Apr 23 13:01:29 2024 UTC