summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Jones <sixd@php.net>2015-10-07 20:24:49 +1100
committerChristopher Jones <sixd@php.net>2015-10-07 20:24:49 +1100
commit4a57f1821b2ff555d1d57bb961c1ceadbcffc115 (patch)
treeeaf5bb2a533c9c7c534ce154ae176c18c2c1c028
parentc0ca731d7a418502c26bee84f7b71e05f66faeef (diff)
downloadphp-git-4a57f1821b2ff555d1d57bb961c1ceadbcffc115.tar.gz
Fix mem leak and improve test portability (Senthil)
-rw-r--r--ext/oci8/oci8.c24
-rw-r--r--ext/oci8/tests/bug27303_2_11gR1.phpt202
2 files changed, 121 insertions, 105 deletions
diff --git a/ext/oci8/oci8.c b/ext/oci8/oci8.c
index eed4a1c8f8..2bb57b3373 100644
--- a/ext/oci8/oci8.c
+++ b/ext/oci8/oci8.c
@@ -1922,6 +1922,10 @@ php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char
smart_str_append_unsigned_ex(&hashed_details, session_mode, 0);
smart_str_0(&hashed_details);
+ if (persistent) {
+ smart_str_appendl_ex(&hashed_details, "pc", sizeof("pc") - 1, 0);
+ }
+
/* make it lowercase */
/* PHPNG TODO is this safe to do? What about interned strings? */
php_strtolower(hashed_details.s->val, hashed_details.s->len);
@@ -1996,14 +2000,20 @@ php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char
if (!ping_done && (*(connection->next_pingp) > 0) && (timestamp >= *(connection->next_pingp)) && !php_oci_connection_ping(connection)) {
/* server died */
} else {
- php_oci_connection *tmp;
+ php_oci_connection *tmp = (php_oci_connection *) NULL;
+ zval *tmp_val = (zval *) NULL;
/* okay, the connection is open and the server is still alive */
connection->used_this_request = 1;
- tmp = (php_oci_connection *)connection->id->ptr;
-
- if (tmp != NULL && tmp->hash_key->len == hashed_details.s->len &&
- memcmp(tmp->hash_key->val, hashed_details.s->val, tmp->hash_key->len) == 0) {
+ tmp_val = zend_hash_index_find(&EG(regular_list), connection->id->handle);
+ if ((tmp_val != NULL) && (Z_TYPE_P(tmp_val) == IS_RESOURCE)) {
+ tmp = Z_RES_VAL_P(tmp_val);
+ }
+
+ if ((tmp_val != NULL) && (tmp != NULL) &&
+ (tmp->hash_key->len == hashed_details.s->len) &&
+ (memcmp(tmp->hash_key->val, hashed_details.s->val, tmp->hash_key->len) == 0)) {
+ connection = tmp;
++GC_REFCOUNT(connection->id);
/* do nothing */
} else {
@@ -2366,6 +2376,10 @@ static int php_oci_connection_close(php_oci_connection *connection)
connection->private_spool = NULL;
}
+ if (GC_REFCOUNT(connection->hash_key) >= 2) {
+ zend_hash_del(&EG(regular_list), connection->hash_key);
+ }
+
if (connection->hash_key) {
pefree(connection->hash_key, connection->is_persistent);
connection->hash_key = NULL;
diff --git a/ext/oci8/tests/bug27303_2_11gR1.phpt b/ext/oci8/tests/bug27303_2_11gR1.phpt
index 06133e0115..d9a68b8cc7 100644
--- a/ext/oci8/tests/bug27303_2_11gR1.phpt
+++ b/ext/oci8/tests/bug27303_2_11gR1.phpt
@@ -10,6 +10,8 @@ if (!(isset($matches[0]) && $matches[1] < 12)) {
die("skip expected output only valid when using pre-Oracle 12c database");
}
?>
+--ENV--
+NLS_LANG=
--FILE--
<?php
@@ -153,104 +155,104 @@ string(2) "96"
string(2) "97"
string(2) "98"
string(2) "99"
-string(2) "10"
-string(2) "10"
-string(2) "10"
-string(2) "10"
-string(2) "10"
-string(2) "10"
-string(2) "10"
-string(2) "10"
-string(2) "10"
-string(2) "10"
-string(2) "11"
-string(2) "11"
-string(2) "11"
-string(2) "11"
-string(2) "11"
-string(2) "11"
-string(2) "11"
-string(2) "11"
-string(2) "11"
-string(2) "11"
-string(2) "12"
-string(2) "12"
-string(2) "12"
-string(2) "12"
-string(2) "12"
-string(2) "12"
-string(2) "12"
-string(2) "12"
-string(2) "12"
-string(2) "12"
-string(2) "13"
-string(2) "13"
-string(2) "13"
-string(2) "13"
-string(2) "13"
-string(2) "13"
-string(2) "13"
-string(2) "13"
-string(2) "13"
-string(2) "13"
-string(2) "14"
-string(2) "14"
-string(2) "14"
-string(2) "14"
-string(2) "14"
-string(2) "14"
-string(2) "14"
-string(2) "14"
-string(2) "14"
-string(2) "14"
-string(2) "15"
-string(2) "15"
-string(2) "15"
-string(2) "15"
-string(2) "15"
-string(2) "15"
-string(2) "15"
-string(2) "15"
-string(2) "15"
-string(2) "15"
-string(2) "16"
-string(2) "16"
-string(2) "16"
-string(2) "16"
-string(2) "16"
-string(2) "16"
-string(2) "16"
-string(2) "16"
-string(2) "16"
-string(2) "16"
-string(2) "17"
-string(2) "17"
-string(2) "17"
-string(2) "17"
-string(2) "17"
-string(2) "17"
-string(2) "17"
-string(2) "17"
-string(2) "17"
-string(2) "17"
-string(2) "18"
-string(2) "18"
-string(2) "18"
-string(2) "18"
-string(2) "18"
-string(2) "18"
-string(2) "18"
-string(2) "18"
-string(2) "18"
-string(2) "18"
-string(2) "19"
-string(2) "19"
-string(2) "19"
-string(2) "19"
-string(2) "19"
-string(2) "19"
-string(2) "19"
-string(2) "19"
-string(2) "19"
-string(2) "19"
+string(3) "100"
+string(3) "101"
+string(3) "102"
+string(3) "103"
+string(3) "104"
+string(3) "105"
+string(3) "106"
+string(3) "107"
+string(3) "108"
+string(3) "109"
+string(3) "110"
+string(3) "111"
+string(3) "112"
+string(3) "113"
+string(3) "114"
+string(3) "115"
+string(3) "116"
+string(3) "117"
+string(3) "118"
+string(3) "119"
+string(3) "120"
+string(3) "121"
+string(3) "122"
+string(3) "123"
+string(3) "124"
+string(3) "125"
+string(3) "126"
+string(3) "127"
+string(3) "128"
+string(3) "129"
+string(3) "130"
+string(3) "131"
+string(3) "132"
+string(3) "133"
+string(3) "134"
+string(3) "135"
+string(3) "136"
+string(3) "137"
+string(3) "138"
+string(3) "139"
+string(3) "140"
+string(3) "141"
+string(3) "142"
+string(3) "143"
+string(3) "144"
+string(3) "145"
+string(3) "146"
+string(3) "147"
+string(3) "148"
+string(3) "149"
+string(3) "150"
+string(3) "151"
+string(3) "152"
+string(3) "153"
+string(3) "154"
+string(3) "155"
+string(3) "156"
+string(3) "157"
+string(3) "158"
+string(3) "159"
+string(3) "160"
+string(3) "161"
+string(3) "162"
+string(3) "163"
+string(3) "164"
+string(3) "165"
+string(3) "166"
+string(3) "167"
+string(3) "168"
+string(3) "169"
+string(3) "170"
+string(3) "171"
+string(3) "172"
+string(3) "173"
+string(3) "174"
+string(3) "175"
+string(3) "176"
+string(3) "177"
+string(3) "178"
+string(3) "179"
+string(3) "180"
+string(3) "181"
+string(3) "182"
+string(3) "183"
+string(3) "184"
+string(3) "185"
+string(3) "186"
+string(3) "187"
+string(3) "188"
+string(3) "189"
+string(3) "190"
+string(3) "191"
+string(3) "192"
+string(3) "193"
+string(3) "194"
+string(3) "195"
+string(3) "196"
+string(3) "197"
+string(3) "198"
+string(3) "199"
Done