From: novicky at aarongroup dot cz
Operating system: all
PHP version: 4.3.7RC1
PHP Bug Type: Informix related
Bug description: connection id is not thread safe, possible crash during module
shutdown
Description:
------------
Identification strings used for connections, statements and descriptors
are not thread safe. There is a possible mix-up of identifications under
multithread webservers.
There is a possible memory allocation during module shutdown in function
ifx_do_close which can lead crash.
Here is a patch for ifx.ec
--- php-4.3.7RC1.orig/ext/informix/ifx.ec 2003-11-03 00:14:06.000000000
+0100
+++ php-4.3.7RC1/ext/informix/ifx.ec 2004-05-29 18:14:16.000000000 +0200
@@ -297,30 +297,13 @@
if (ifx_check() == 0) {
/* DISCONNECT again, after rollback */
EXEC SQL DISCONNECT :link;
- if (ifx_check() < 0) {
- IFXG(sv_sqlcode) = SQLCODE;
- php_error_docref(NULL TSRMLS_CC, E_WARNING,
"Disconnect link %s
after Automatic Rollback fails (%s)", link, ifx_error(link));
- }
}
- if (ifx_check() < 0) {
+ else if (ifx_check() < 0) {
/* CLOSE database if rollback or disconnect fails */
EXEC SQL CLOSE DATABASE;
- if (ifx_check() < 0) {
- IFXG(sv_sqlcode) = SQLCODE;
- php_error_docref(NULL TSRMLS_CC, E_WARNING,
"Close database fails %s
(%s)", link, ifx_error(link));
- }
- }
- }
- else if (SQLCODE < 0) {
- IFXG(sv_sqlcode) = SQLCODE;
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Disconnect link
%s fails
(%s)", link, ifx_error(link));
}
}
- else {
- IFXG(sv_sqlcode) = SQLCODE;
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Set connection %s fails
(%s)", link, ifx_error(link));
}
-
}
static void _close_ifx_link(zend_rsrc_list_entry *rsrc TSRMLS_DC)
@@ -532,7 +515,11 @@
/* create the link */
ifx = (char *) malloc(sizeof(IFX));
IFXG(connectionid)++;
+#ifdef ZTS
+ sprintf(ifx, "%s%x_%x", SAFE_STRING(user), tsrm_thread_id(),
IFXG(connectionid));
+#else
sprintf(ifx, "%s%x", SAFE_STRING(user), IFXG(connectionid));
+#endif
EXEC SQL CONNECT TO :host AS :ifx USER :user USING :passwd WITH
CONCURRENT TRANSACTION;
@@ -629,7 +616,11 @@
ifx = (char *) emalloc(sizeof(IFX));
IFXG(connectionid)++;
+#ifdef ZTS
+ sprintf(ifx, "connec%x_%x", tsrm_thread_id(), IFXG(connectionid));
+#else
sprintf(ifx, "connec%x", IFXG(connectionid));
+#endif
EXEC SQL CONNECT TO :host AS :ifx USER :user USING :passwd WITH
CONCURRENT TRANSACTION;
@@ -800,10 +791,17 @@
statement = Z_STRVAL_PP(query);
IFXG(cursorid)++;
+#ifdef ZTS
+ sprintf(statemid, "statem%x_%x", tsrm_thread_id(), IFXG(cursorid));
+ sprintf(cursorid, "cursor%x_%x", tsrm_thread_id(), IFXG(cursorid));
+ sprintf(descrpid, "descrp%x_%x", tsrm_thread_id(), IFXG(cursorid));
+ sprintf(i_descrpid, "i_descrp%x_%x", tsrm_thread_id(), IFXG(cursorid));
+#else
sprintf(statemid, "statem%x", IFXG(cursorid));
sprintf(cursorid, "cursor%x", IFXG(cursorid));
sprintf(descrpid, "descrp%x", IFXG(cursorid));
sprintf(i_descrpid, "i_descrp%x", IFXG(cursorid));
+#endif
EXEC SQL set connection :ifx;
PHP_IFX_CHECK_CONNECTION(ifx);
@@ -1206,10 +1204,17 @@
statement = Z_STRVAL_PP(query);
IFXG(cursorid)++;
+#ifdef ZTS
+ sprintf(statemid, "statem%x_%x", tsrm_thread_id(), IFXG(cursorid));
+ sprintf(cursorid, "cursor%x_%x", tsrm_thread_id(), IFXG(cursorid));
+ sprintf(descrpid, "descrp%x_%x", tsrm_thread_id(), IFXG(cursorid));
+ sprintf(i_descrpid, "i_descrp%x_%x", tsrm_thread_id(), IFXG(cursorid));
+#else
sprintf(statemid, "statem%x", IFXG(cursorid));
sprintf(cursorid, "cursor%x", IFXG(cursorid));
sprintf(descrpid, "descrp%x", IFXG(cursorid));
sprintf(i_descrpid, "i_descrp%x", IFXG(cursorid));
+#endif
EXEC SQL set connection :ifx;
PHP_IFX_CHECK_CONNECTION(ifx);
Moreover there is a memory leak in all php_error_docref calls where
ifx_error(ifx) is used. There are 64 bytes allocated which are never
free.
--
Edit bug report at http://bugs.php.net/?id=28569&edit=1
--
Try a CVS snapshot (php4): http://bugs.php.net/fix.php?id=28569&r=trysnapshot4
Try a CVS snapshot (php5): http://bugs.php.net/fix.php?id=28569&r=trysnapshot5
Fixed in CVS: http://bugs.php.net/fix.php?id=28569&r=fixedcvs
Fixed in release: http://bugs.php.net/fix.php?id=28569&r=alreadyfixed
Need backtrace: http://bugs.php.net/fix.php?id=28569&r=needtrace
Need Reproduce Script: http://bugs.php.net/fix.php?id=28569&r=needscript
Try newer version: http://bugs.php.net/fix.php?id=28569&r=oldversion
Not developer issue: http://bugs.php.net/fix.php?id=28569&r=support
Expected behavior: http://bugs.php.net/fix.php?id=28569&r=notwrong
Not enough info: http://bugs.php.net/fix.php?id=28569&r=notenoughinfo
Submitted twice: http://bugs.php.net/fix.php?id=28569&r=submittedtwice
register_globals: http://bugs.php.net/fix.php?id=28569&r=globals
PHP 3 support discontinued: http://bugs.php.net/fix.php?id=28569&r=php3
Daylight Savings: http://bugs.php.net/fix.php?id=28569&r=dst
IIS Stability: http://bugs.php.net/fix.php?id=28569&r=isapi
Install GNU Sed: http://bugs.php.net/fix.php?id=28569&r=gnused
Floating point limitations: http://bugs.php.net/fix.php?id=28569&r=float