]> granicus.if.org Git - php/commitdiff
Fix Bug #63171 Script hangs after max_execution_time
authorRemi Collet <remi@php.net>
Thu, 17 Mar 2016 12:38:45 +0000 (13:38 +0100)
committerRemi Collet <remi@php.net>
Thu, 17 Mar 2016 12:38:45 +0000 (13:38 +0100)
If aborted via timer expiration, don't try to call any unixODBC function
which may hangs because of internal locks

ext/odbc/php_odbc.c

index bde6c1ed147eb659831d36928f8940169387cb84..0cd713598c882f240fec437b04f729f697fffcd5 100644 (file)
@@ -431,7 +431,8 @@ static void _free_odbc_result(zend_rsrc_list_entry *rsrc TSRMLS_DC)
                        efree(res->values);
                        res->values = NULL;
                }
-               if (res->stmt) {
+               /* If aborted via timer expiration, don't try to call any unixODBC function */
+               if (res->stmt && !(PG(connection_status) & PHP_CONNECTION_TIMEOUT)) {
 #if defined(HAVE_SOLID) || defined(HAVE_SOLID_30) || defined(HAVE_SOLID_35)
                        SQLTransact(res->conn_ptr->henv, res->conn_ptr->hdbc,
                                                (SQLUSMALLINT) SQL_COMMIT);
@@ -487,9 +488,12 @@ static void _close_odbc_conn(zend_rsrc_list_entry *rsrc TSRMLS_DC)
                }
        }
 
-       safe_odbc_disconnect(conn->hdbc);
-       SQLFreeConnect(conn->hdbc);
-       SQLFreeEnv(conn->henv);
+       /* If aborted via timer expiration, don't try to call any unixODBC function */
+       if (!(PG(connection_status) & PHP_CONNECTION_TIMEOUT)) {
+               safe_odbc_disconnect(conn->hdbc);
+               SQLFreeConnect(conn->hdbc);
+               SQLFreeEnv(conn->henv);
+       }
        efree(conn);
        ODBCG(num_links)--;
 }
@@ -515,9 +519,12 @@ static void _close_odbc_pconn(zend_rsrc_list_entry *rsrc TSRMLS_DC)
                }
        }
        
-       safe_odbc_disconnect(conn->hdbc);
-       SQLFreeConnect(conn->hdbc);
-       SQLFreeEnv(conn->henv);
+       /* If aborted via timer expiration, don't try to call any unixODBC function */
+       if (!(PG(connection_status) & PHP_CONNECTION_TIMEOUT)) {
+               safe_odbc_disconnect(conn->hdbc);
+               SQLFreeConnect(conn->hdbc);
+               SQLFreeEnv(conn->henv);
+       }
        free(conn);
 
        ODBCG(num_links)--;