/* -1 means "Off" */
connection->next_ping = 0;
}
+
+ /* mark password as unchanged by PHP during the duration of the database session */
+ connection->passwd_changed = 0;
smart_str_free_ex(&hashed_details, 0);
/* mark it as open */
connection->is_open = 1;
-
+
/* add to the appropriate hash */
if (connection->is_persistent) {
new_le.ptr = connection;
PHP_OCI_HANDLE_ERROR(connection, connection->errcode);
return 1;
}
+ connection->passwd_changed = 1;
return 0;
} /* }}} */
if (connection->used_this_request) {
if ((PG(connection_status) & PHP_CONNECTION_TIMEOUT) || OCI_G(in_call)) {
- return 1;
+ return ZEND_HASH_APPLY_REMOVE;
}
if (connection->descriptors) {
php_oci_connection_rollback(connection TSRMLS_CC);
}
+ /* If oci_password_change() changed the password of a
+ * persistent connection, close the connection and remove
+ * it from the persistent connection cache. This means
+ * subsequent scripts will be prevented from being able to
+ * present the old (now invalid) password to a usable
+ * connection to the database; they must use the new
+ * password.
+ */
+ if (connection->passwd_changed) {
+ return ZEND_HASH_APPLY_REMOVE;
+ }
+
if (OCI_G(persistent_timeout) > 0) {
connection->idle_expiry = timestamp + OCI_G(persistent_timeout);
}
}
connection->used_this_request = 0;
+
} else if (OCI_G(persistent_timeout) != -1) {
if (connection->idle_expiry < timestamp) {
/* connection has timed out */
- return 1;
+ return ZEND_HASH_APPLY_REMOVE;
}
}
}
- return 0;
+ return ZEND_HASH_APPLY_KEEP;
} /* }}} */
#ifdef ZTS
unsigned is_persistent:1; /* self-descriptive */
unsigned used_this_request:1; /* helps to determine if we should reset connection's next ping time and check its timeout */
unsigned needs_commit:1; /* helps to determine if we should rollback this connection on close/shutdown */
+ unsigned passwd_changed:1; /* helps determine if a persistent connection hash should be invalidated after a password change */
int rsrc_id; /* resource ID */
time_t idle_expiry; /* time when the connection will be considered as expired */
time_t next_ping; /* time of the next ping */