sixd Mon Mar 9 18:59:20 2009 UTC
Added files:
/php-src/ext/oci8/tests pecl_bug16035.phpt
Modified files:
/php-src/ext/oci8 oci8.c
/php-src/ext/oci8/tests details.inc
connect_without_oracle_home.phpt
connect_without_oracle_home_old.phpt
create_table.inc
Log:
PECL Bug #16035 (oci_connect without ORACLE_HOME defined causes segfault)
http://cvs.php.net/viewvc.cgi/php-src/ext/oci8/oci8.c?r1=1.361&r2=1.362&diff_format=u
Index: php-src/ext/oci8/oci8.c
diff -u php-src/ext/oci8/oci8.c:1.361 php-src/ext/oci8/oci8.c:1.362
--- php-src/ext/oci8/oci8.c:1.361 Mon Mar 9 18:03:34 2009
+++ php-src/ext/oci8/oci8.c Mon Mar 9 18:59:20 2009
@@ -26,7 +26,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: oci8.c,v 1.361 2009/03/09 18:03:34 sixd Exp $ */
+/* $Id: oci8.c,v 1.362 2009/03/09 18:59:20 sixd Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -72,6 +72,12 @@
#define ONUPDATELONGFUNC OnUpdateInt
#endif
+#ifdef ZTS
+#define PHP_OCI_INIT_MODE (OCI_DEFAULT | OCI_OBJECT | OCI_THREADED |
OCI_NO_MUTEX)
+#else
+#define PHP_OCI_INIT_MODE (OCI_DEFAULT | OCI_OBJECT)
+#endif
+
/* static protos {{{ */
static void php_oci_connection_list_dtor (zend_rsrc_list_entry * TSRMLS_DC);
static void php_oci_pconnection_list_dtor (zend_rsrc_list_entry * TSRMLS_DC);
@@ -836,60 +842,65 @@
*/
static void php_oci_init_global_handles(TSRMLS_D)
{
- sword errcode;
- sb4 error_code = 0;
- text tmp_buf[PHP_OCI_ERRBUF_LEN];
+ sword errstatus;
+ sb4 ora_error_code = 0;
+ text tmp_buf[PHP_OCI_ERRBUF_LEN];
- errcode = OCIEnvNlsCreate(&OCI_G(env), OCI_DEFAULT, 0, NULL, NULL,
NULL, 0, NULL, 0, 0);
+ errstatus = OCIEnvNlsCreate(&OCI_G(env), PHP_OCI_INIT_MODE, 0, NULL,
NULL, NULL, 0, NULL, 0, 0);
- if (errcode == OCI_ERROR) {
- goto oci_error;
+ if (errstatus == OCI_ERROR) {
+#ifdef HAVE_OCI_INSTANT_CLIENT
+# ifdef PHP_WIN32
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "OCIEnvNlsCreate()
failed. There is something wrong with your system - please check that PATH
includes the directory with Oracle Instant Client libraries");
+# else
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "OCIEnvNlsCreate()
failed. There is something wrong with your system - please check that
LD_LIBRARY_PATH includes the directory with Oracle Instant Client libraries");
+# endif
+#else
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "OCIEnvNlsCreate()
failed. There is something wrong with your system - please check that
ORACLE_HOME is set and points to the right directory");
+#endif
+ OCI_G(env) = NULL;
+ OCI_G(err) = NULL;
+ return;
}
- errcode = OCIHandleAlloc (OCI_G(env), (dvoid **)&OCI_G(err),
OCI_HTYPE_ERROR, 0, NULL);
-
- if (errcode == OCI_ERROR || errcode == OCI_SUCCESS_WITH_INFO) {
- goto oci_error;
- }
+ errstatus = OCIHandleAlloc (OCI_G(env), (dvoid **)&OCI_G(err),
OCI_HTYPE_ERROR, 0, NULL);
+ if (errstatus == OCI_SUCCESS) {
#if !defined(OCI_MAJOR_VERSION) || (OCI_MAJOR_VERSION < 11)
- /* This works around PECL bug #15988 (sqlnet.ora not being read).
- * The root cause was fixed in Oracle 10.2.0.4 but there is no
- * compile time method to check for that precise patch level, nor
- * can it be guaranteed that runtime will use the same patch level
- * the code was compiled with. So, we do this code for all non
- * 11g versions.
- */
- OCICPool *cpoolh;
- ub4 cpoolmode = 0x80000000; /* Pass invalid mode to
OCIConnectionPoolCreate */
- PHP_OCI_CALL(OCIHandleAlloc, (OCI_G(env), (dvoid **) &cpoolh,
OCI_HTYPE_CPOOL, (size_t) 0, (dvoid **) 0));
- PHP_OCI_CALL(OCIConnectionPoolCreate, (OCI_G(env), OCI_G(err), cpoolh,
NULL, 0, NULL, 0, 0, 0, 0, NULL, 0, NULL, 0, cpoolmode));
- PHP_OCI_CALL(OCIConnectionPoolDestroy, (cpoolh, OCI_G(err),
OCI_DEFAULT));
- PHP_OCI_CALL(OCIHandleFree, (cpoolh, OCI_HTYPE_CPOOL));
+ /* This fixes PECL bug 15988 (sqlnet.ora not being read). The
+ * root cause was fixed in Oracle 10.2.0.4 but there is no
+ * compile time method to check for that precise patch level,
+ * nor can it be guaranteed that runtime will use the same
+ * patch level the code was compiled with. So, we do this
+ * code for all non 11g versions.
+ */
+ OCICPool *cpoolh;
+ ub4 cpoolmode = 0x80000000; /* Pass invalid mode to
OCIConnectionPoolCreate */
+ PHP_OCI_CALL(OCIHandleAlloc, (OCI_G(env), (dvoid **) &cpoolh,
OCI_HTYPE_CPOOL, (size_t) 0, (dvoid **) 0));
+ PHP_OCI_CALL(OCIConnectionPoolCreate, (OCI_G(env), OCI_G(err),
cpoolh, NULL, 0, NULL, 0, 0, 0, 0, NULL, 0, NULL, 0, cpoolmode));
+ PHP_OCI_CALL(OCIConnectionPoolDestroy, (cpoolh, OCI_G(err),
OCI_DEFAULT));
+ PHP_OCI_CALL(OCIHandleFree, (cpoolh, OCI_HTYPE_CPOOL));
#endif
+ } else {
+ OCIErrorGet(OCI_G(env), (ub4)1, NULL, &ora_error_code, tmp_buf,
(ub4)PHP_OCI_ERRBUF_LEN, (ub4)OCI_HTYPE_ERROR);
- return;
-
-oci_error:
-
- OCIErrorGet(OCI_G(env), (ub4)1, NULL, &error_code, tmp_buf,
(ub4)PHP_OCI_ERRBUF_LEN, (ub4)OCI_HTYPE_ERROR);
-
- if (error_code) {
- int tmp_buf_len = strlen((char *)tmp_buf);
-
- if (tmp_buf_len > 0 && tmp_buf[tmp_buf_len - 1] == '\n') {
- tmp_buf[tmp_buf_len - 1] = '\0';
- }
-
- if (errcode != OCI_SUCCESS_WITH_INFO) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "OCI_ERROR:
%s", tmp_buf);
-
- OCIHandleFree((dvoid *) OCI_G(env), OCI_HTYPE_ENV);
-
- OCI_G(env) = NULL;
- OCI_G(err) = NULL;
- } else {
- php_error_docref(NULL TSRMLS_CC, E_WARNING,
"OCI_SUCCESS_WITH_INFO: %s", tmp_buf);
+ if (ora_error_code) {
+ int tmp_buf_len = strlen((char *)tmp_buf);
+
+ if (tmp_buf_len > 0 && tmp_buf[tmp_buf_len - 1] ==
'\n') {
+ tmp_buf[tmp_buf_len - 1] = '\0';
+ }
+
+ if (errstatus == OCI_SUCCESS_WITH_INFO) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING,
"Initialization error: OCI_SUCCESS_WITH_INFO: %s", tmp_buf);
+ } else {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING,
"Initialization error: OCI_ERROR: %s", tmp_buf);
+
+ OCIHandleFree((dvoid *) OCI_G(env),
OCI_HTYPE_ENV);
+
+ OCI_G(env) = NULL;
+ OCI_G(err) = NULL;
+ }
}
}
} /* }}} */
@@ -926,14 +937,6 @@
zend_class_entry oci_lob_class_entry;
zend_class_entry oci_coll_class_entry;
-#define PHP_OCI_INIT_MODE_TMP OCI_DEFAULT | OCI_OBJECT
-
-#ifdef ZTS
-#define PHP_OCI_INIT_MODE PHP_OCI_INIT_MODE_TMP | OCI_THREADED
-#else
-#define PHP_OCI_INIT_MODE PHP_OCI_INIT_MODE_TMP
-#endif
-
REGISTER_INI_ENTRIES();
le_statement =
zend_register_list_destructors_ex(php_oci_statement_list_dtor, NULL, "oci8
statement", module_number);
@@ -1088,7 +1091,7 @@
php_info_print_table_start();
php_info_print_table_row(2, "OCI8 Support", "enabled");
php_info_print_table_row(2, "Version", PHP_OCI8_VERSION);
- php_info_print_table_row(2, "Revision", "$Revision: 1.361 $");
+ php_info_print_table_row(2, "Revision", "$Revision: 1.362 $");
snprintf(buf, sizeof(buf), "%ld", OCI_G(num_persistent));
php_info_print_table_row(2, "Active Persistent Connections", buf);
@@ -1565,6 +1568,14 @@
}
}
+ /* Initialize global handles if they weren't initialized before */
+ if (OCI_G(env) == NULL) {
+ php_oci_init_global_handles(TSRMLS_C);
+ if (OCI_G(env) == NULL) {
+ return NULL;
+ }
+ }
+
/* We cannot use the new session create logic (OCISessionGet from
* client-side session pool) when privileged connect or password
* change is attempted or OCI_CRED_EXT mode is specified. TODO:
@@ -1601,11 +1612,6 @@
}
smart_str_appendl_ex(&hashed_details, "**", sizeof("**") - 1, 0);
- /* Initialize global handles if they weren't initialized before */
- if (OCI_G(env) == NULL) {
- php_oci_init_global_handles(TSRMLS_C);
- }
-
if (!UG(unicode)) {
if (charset.s && *charset.s) {
PHP_OCI_CALL_RETURN(charsetid, OCINlsCharSetNameToId,
(OCI_G(env), (CONST oratext *)charset.s));
http://cvs.php.net/viewvc.cgi/php-src/ext/oci8/tests/details.inc?r1=1.6&r2=1.7&diff_format=u
Index: php-src/ext/oci8/tests/details.inc
diff -u php-src/ext/oci8/tests/details.inc:1.6
php-src/ext/oci8/tests/details.inc:1.7
--- php-src/ext/oci8/tests/details.inc:1.6 Thu Jun 19 20:24:00 2008
+++ php-src/ext/oci8/tests/details.inc Mon Mar 9 18:59:20 2009
@@ -32,12 +32,18 @@
}
} else {
$user = "system";
- $password = "system";
+ $password = "oracle";
$dbase = "localhost/XE";
$oracle_on_localhost = TRUE;
$test_drcp = FALSE;
}
+$user = "system";
+$password = "oracle";
+$dbase =
"ca-tools1.us.oracle.com/orcl";
+$oracle_on_localhost = TRUE;
+$test_drcp = FALSE;
+
/*
* Common object names for scripts to use
*/
http://cvs.php.net/viewvc.cgi/php-src/ext/oci8/tests/connect_without_oracle_home.phpt?r1=1.4&r2=1.5&diff_format=u
Index: php-src/ext/oci8/tests/connect_without_oracle_home.phpt
diff -u php-src/ext/oci8/tests/connect_without_oracle_home.phpt:1.4
php-src/ext/oci8/tests/connect_without_oracle_home.phpt:1.5
--- php-src/ext/oci8/tests/connect_without_oracle_home.phpt:1.4 Tue Dec 12
13:22:33 2006
+++ php-src/ext/oci8/tests/connect_without_oracle_home.phpt Mon Mar 9
18:59:20 2009
@@ -2,15 +2,23 @@
oci_connect() without ORACLE_HOME set (OCIServerAttach() segfaults)
--SKIPIF--
<?php
-/* disabled for a while */
-die("skip");
-
if (!extension_loaded('oci8')) die("skip no oci8 extension");
+/* Disabled: Fix for PECL Bug #16035 stops a crash if ORACLE_HOME is not set
when PHP starts. Using putenv('ORACLE_HOME=""') at runtime will still segfault
*/
+die("skip can't be tested with run-tests.php");
+ob_start();
+phpinfo(INFO_MODULES);
+$phpinfo = ob_get_clean();
+$ov = preg_match('/Compile-time ORACLE_HOME/', $phpinfo);
+if ($ov !== 1) {
+ die ("skip Test only valid when OCI8 is built with an ORACLE_HOME");
+}
?>
--FILE--
<?php
-require dirname(__FILE__)."/connect.inc";
+require dirname(__FILE__)."/details.inc";
+
+putenv('ORACLE_HOME=""');
if (!empty($dbase)) {
var_dump(oci_connect($user, $password, $dbase));
@@ -19,12 +27,10 @@
var_dump(oci_connect($user, $password));
}
-echo "Done\n";
-
?>
+===DONE===
+<?php exit(0); ?>
--EXPECTF--
-Warning: ocilogon(): _oci_open_server failed, check ORACLE_HOME and NLS_LANG
variables: ORA-12514: TNS:listener does not currently know of service requested
in connect descriptor in %sconnect.inc on line %d
-
-Warning: oci_connect(): _oci_open_server failed, check ORACLE_HOME and
NLS_LANG variables: ORA-12514: TNS:listener does not currently know of service
requested in connect descriptor in %sconnect_without_oracle_home.php on line %d
+Warning: oci_connect(): OCIEnvNlsCreate() failed. There is something wrong
with your system - please check that ORACLE_HOME is set and points to the right
directory in %s on line %d
bool(false)
-Done
+===DONE===
http://cvs.php.net/viewvc.cgi/php-src/ext/oci8/tests/connect_without_oracle_home_old.phpt?r1=1.4&r2=1.5&diff_format=u
Index: php-src/ext/oci8/tests/connect_without_oracle_home_old.phpt
diff -u php-src/ext/oci8/tests/connect_without_oracle_home_old.phpt:1.4
php-src/ext/oci8/tests/connect_without_oracle_home_old.phpt:1.5
--- php-src/ext/oci8/tests/connect_without_oracle_home_old.phpt:1.4 Tue Dec
12 13:22:33 2006
+++ php-src/ext/oci8/tests/connect_without_oracle_home_old.phpt Mon Mar 9
18:59:20 2009
@@ -2,14 +2,23 @@
ocilogon() without ORACLE_HOME set (OCIServerAttach() segfaults)
--SKIPIF--
<?php
-/* disabled for a while */
-die("skip");
if (!extension_loaded('oci8')) die("skip no oci8 extension");
+/* Disabled: Fix for PECL Bug #16035 stops a crash if ORACLE_HOME is not set
when PHP starts. Using putenv('ORACLE_HOME=""') at runtime will still segfault
*/
+die("skip can't be tested with run-tests.php");
+ob_start();
+phpinfo(INFO_MODULES);
+$phpinfo = ob_get_clean();
+$ov = preg_match('/Compile-time ORACLE_HOME/', $phpinfo);
+if ($ov !== 1) {
+ die ("skip Test only valid when OCI8 is built with an ORACLE_HOME");
+}
?>
--FILE--
<?php
-require dirname(__FILE__)."/connect.inc";
+require dirname(__FILE__)."/details.inc";
+
+putenv('ORACLE_HOME=""');
if (!empty($dbase)) {
var_dump(ocilogon($user, $password, $dbase));
@@ -18,12 +27,10 @@
var_dump(ocilogon($user, $password));
}
-echo "Done\n";
-
?>
+===DONE===
+<?php exit(0); ?>
--EXPECTF--
-Warning: ocilogon(): _oci_open_server failed, check ORACLE_HOME and NLS_LANG
variables: ORA-12514: TNS:listener does not currently know of service requested
in connect descriptor in %sconnect.inc on line %d
-
-Warning: oci_connect(): _oci_open_server failed, check ORACLE_HOME and
NLS_LANG variables: ORA-12514: TNS:listener does not currently know of service
requested in connect descriptor in %sconnect_without_oracle_home.php on line %d
+Warning: ocilogon(): OCIEnvNlsCreate() failed. There is something wrong with
your system - please check that ORACLE_HOME is set and points to the right
directory in %s on line %d
bool(false)
-Done
+===DONE===
http://cvs.php.net/viewvc.cgi/php-src/ext/oci8/tests/create_table.inc?r1=1.3&r2=1.4&diff_format=u
Index: php-src/ext/oci8/tests/create_table.inc
diff -u php-src/ext/oci8/tests/create_table.inc:1.3
php-src/ext/oci8/tests/create_table.inc:1.4
--- php-src/ext/oci8/tests/create_table.inc:1.3 Tue Sep 6 19:33:18 2005
+++ php-src/ext/oci8/tests/create_table.inc Mon Mar 9 18:59:20 2009
@@ -1,19 +1,11 @@
<?php
-
if ($c) {
- $ora_sql = "DROP TABLE
- ".$schema.$table_name."
- ";
-
- $statement = OCIParse($c, $ora_sql);
- @OCIExecute($statement);
+ $ora_sql = "DROP TABLE ".$schema.$table_name;
+ $statement = oci_parse($c, $ora_sql);
+ @oci_execute($statement);
- $ora_sql = "CREATE TABLE
- ".$schema.$table_name." (id NUMBER, value
NUMBER, blob BLOB, clob CLOB, string VARCHAR(10))
- ";
-
- $statement = OCIParse($c,$ora_sql);
- OCIExecute($statement);
+ $ora_sql = "CREATE TABLE ".$schema.$table_name." (id NUMBER, value
NUMBER, blob BLOB, clob CLOB, string VARCHAR(10))";
+ $statement = oci_parse($c, $ora_sql);
+ oci_execute($statement);
}
-
?>
http://cvs.php.net/viewvc.cgi/php-src/ext/oci8/tests/pecl_bug16035.phpt?view=markup&rev=1.1
Index: php-src/ext/oci8/tests/pecl_bug16035.phpt
+++ php-src/ext/oci8/tests/pecl_bug16035.phpt
--TEST--
PECL Bug #16035 (Crash with Oracle 10.2 connecting with a character set but
ORACLE_HOME isn't set)
--SKIPIF--
<?php
if (!extension_loaded('oci8')) die ("skip no oci8 extension");
/* Disabled: Fix for PECL Bug #16035 stops a crash if ORACLE_HOME is not set
when PHP starts. Using putenv('ORACLE_HOME=""') at runtime will still segfault
*/
die("skip can't be tested with run-tests.php");
ob_start();
phpinfo(INFO_MODULES);
$phpinfo = ob_get_clean();
$ov = preg_match('/Compile-time ORACLE_HOME/', $phpinfo);
if ($ov !== 1) {
die ("skip Test only valid when OCI8 is built with an ORACLE_HOME");
}
?>
--FILE--
<?php
putenv('ORACLE_HOME=""');
oci_connect('abc', 'def', 'ghi', 'jkl');
?>
===DONE===
<?php exit(0); ?>
--EXPECTF--
PHP Warning: oci_connect(): OCIEnvNlsCreate() failed. There is something wrong
with your system - please check that ORACLE_HOME is set and points to the right
directory in %s on line %d
===DONE===
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php