[PHP-CVS] svn: /php/php-src/ branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c trunk/ext/mysqlnd/mysqlnd_ps.c

2011-02-01 Thread Andrey Hristov
andrey   Tue, 01 Feb 2011 16:55:20 +

Revision: http://svn.php.net/viewvc?view=revisionrevision=307921

Log:
fix warnings. These checks are not needed because
param_no is unsigned, it wasn't in the beginning.

Changed paths:
U   php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c
U   php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c

Modified: php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c
===
--- php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c   2011-02-01 
16:35:26 UTC (rev 307920)
+++ php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c   2011-02-01 
16:55:20 UTC (rev 307921)
@@ -1477,7 +1477,7 @@
DBG_RETURN(FAIL);
}

-   if (param_no  0 || param_no = stmt-param_count) {
+   if (param_no = stmt-param_count) {
SET_STMT_ERROR(stmt, CR_INVALID_PARAMETER_NO, UNKNOWN_SQLSTATE, 
Invalid parameter number);
DBG_ERR(invalid param_no);
DBG_RETURN(FAIL);
@@ -1617,7 +1617,7 @@
DBG_RETURN(FAIL);
}

-   if (param_no  0 || param_no = stmt-field_count) {
+   if (param_no = stmt-field_count) {
SET_STMT_ERROR(stmt, CR_INVALID_PARAMETER_NO, UNKNOWN_SQLSTATE, 
Invalid parameter number);
DBG_ERR(invalid param_no);
DBG_RETURN(FAIL);

Modified: php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c
===
--- php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c  2011-02-01 16:35:26 UTC (rev 
307920)
+++ php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c  2011-02-01 16:55:20 UTC (rev 
307921)
@@ -1477,7 +1477,7 @@
DBG_RETURN(FAIL);
}

-   if (param_no  0 || param_no = stmt-param_count) {
+   if (param_no = stmt-param_count) {
SET_STMT_ERROR(stmt, CR_INVALID_PARAMETER_NO, UNKNOWN_SQLSTATE, 
Invalid parameter number);
DBG_ERR(invalid param_no);
DBG_RETURN(FAIL);
@@ -1617,7 +1617,7 @@
DBG_RETURN(FAIL);
}

-   if (param_no  0 || param_no = stmt-field_count) {
+   if (param_no = stmt-field_count) {
SET_STMT_ERROR(stmt, CR_INVALID_PARAMETER_NO, UNKNOWN_SQLSTATE, 
Invalid parameter number);
DBG_ERR(invalid param_no);
DBG_RETURN(FAIL);

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Re: [PHP-CVS] svn: /php/php-src/ branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c trunk/ext/mysqlnd/mysqlnd_ps.c

2011-01-18 Thread Andrey Hristov
On 01/17/2011 03:01 PM, Pierre Joye wrote:
 pajoye   Mon, 17 Jan 2011 14:01:01 +
 
 Revision: http://svn.php.net/viewvc?view=revisionrevision=307537
 
 Log:
 - fix NULL derefencing
 
 Changed paths:
 U   php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c
 U   php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c
 
 Modified: php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c
 ===
 --- php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c 2011-01-17 
 13:44:54 UTC (rev 307536)
 +++ php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c 2011-01-17 
 14:01:01 UTC (rev 307537)
 @@ -735,7 +735,7 @@
 
   DBG_ENTER(mysqlnd_fetch_stmt_row_buffered);
   *fetched_anything = FALSE;
 - DBG_INF_FMT(stmt=%lu, stmt-stmt_id);
 + DBG_INF_FMT(stmt=%lu, stmt != NULL ? stmt-stmt_id : 0L);
 
   /* If we haven't read everything */
   if (set-data_cursor 
 @@ -2223,9 +2223,9 @@
  static enum_func_status
  MYSQLND_METHOD(mysqlnd_stmt, dtor)(MYSQLND_STMT * const s, zend_bool 
 implicit TSRMLS_DC)
  {
 - MYSQLND_STMT_DATA * stmt = s? s-data:NULL;
 + MYSQLND_STMT_DATA * stmt = (s == NULL) ? s-data:NULL;
   enum_func_status ret = FAIL;
 - zend_bool persistent = s-persistent;
 + zend_bool persistent = (s == NULL) ? s-persistent : 0;

This breaks mysqlnd. Why? Because you turn around the meaning. s? means
s!=NULL and you change it to s==NULL but leave the rest of the ternary
intact. Did you run the tests, because 117 more failing test, out of
432. This is hard to oversee if you run the test suite!

Best,
Andrey

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



[PHP-CVS] svn: /php/php-src/ branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c trunk/ext/mysqlnd/mysqlnd_ps.c

2011-01-18 Thread Pierre Joye
pajoye   Tue, 18 Jan 2011 10:29:26 +

Revision: http://svn.php.net/viewvc?view=revisionrevision=307558

Log:
- fix the fix (wrong test)

Changed paths:
U   php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c
U   php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c

Modified: php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c
===
--- php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c   2011-01-18 
07:28:30 UTC (rev 307557)
+++ php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c   2011-01-18 
10:29:26 UTC (rev 307558)
@@ -2223,9 +2223,9 @@
 static enum_func_status
 MYSQLND_METHOD(mysqlnd_stmt, dtor)(MYSQLND_STMT * const s, zend_bool implicit 
TSRMLS_DC)
 {
-   MYSQLND_STMT_DATA * stmt = (s == NULL) ? s-data:NULL;
+   MYSQLND_STMT_DATA * stmt = (s != NULL) ? s-data:NULL;
enum_func_status ret = FAIL;
-   zend_bool persistent = (s == NULL) ? s-persistent : 0;
+   zend_bool persistent = (s != NULL) ? s-persistent : 0;

DBG_ENTER(mysqlnd_stmt::dtor);
if (stmt) {

Modified: php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c
===
--- php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c  2011-01-18 07:28:30 UTC (rev 
307557)
+++ php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c  2011-01-18 10:29:26 UTC (rev 
307558)
@@ -2223,9 +2223,9 @@
 static enum_func_status
 MYSQLND_METHOD(mysqlnd_stmt, dtor)(MYSQLND_STMT * const s, zend_bool implicit 
TSRMLS_DC)
 {
-   MYSQLND_STMT_DATA * stmt = (s == NULL) ? s-data:NULL;
+   MYSQLND_STMT_DATA * stmt = (s != NULL) ? s-data:NULL;
enum_func_status ret = FAIL;
-   zend_bool persistent = (s == NULL) ? s-persistent : 0;
+   zend_bool persistent = (s != NULL) ? s-persistent : 0;

DBG_ENTER(mysqlnd_stmt::dtor);
if (stmt) {

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Re: [PHP-CVS] svn: /php/php-src/ branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c trunk/ext/mysqlnd/mysqlnd_ps.c

2011-01-18 Thread Pierre Joye
fixed

On Tue, Jan 18, 2011 at 11:20 AM, Andrey Hristov p...@hristov.com wrote:
 On 01/17/2011 03:01 PM, Pierre Joye wrote:
 pajoye                                   Mon, 17 Jan 2011 14:01:01 +

 Revision: http://svn.php.net/viewvc?view=revisionrevision=307537

 Log:
 - fix NULL derefencing

 Changed paths:
     U   php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c
     U   php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c

 Modified: php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c
 ===
 --- php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c     2011-01-17 
 13:44:54 UTC (rev 307536)
 +++ php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c     2011-01-17 
 14:01:01 UTC (rev 307537)
 @@ -735,7 +735,7 @@

       DBG_ENTER(mysqlnd_fetch_stmt_row_buffered);
       *fetched_anything = FALSE;
 -     DBG_INF_FMT(stmt=%lu, stmt-stmt_id);
 +     DBG_INF_FMT(stmt=%lu, stmt != NULL ? stmt-stmt_id : 0L);

       /* If we haven't read everything */
       if (set-data_cursor 
 @@ -2223,9 +2223,9 @@
  static enum_func_status
  MYSQLND_METHOD(mysqlnd_stmt, dtor)(MYSQLND_STMT * const s, zend_bool 
 implicit TSRMLS_DC)
  {
 -     MYSQLND_STMT_DATA * stmt = s? s-data:NULL;
 +     MYSQLND_STMT_DATA * stmt = (s == NULL) ? s-data:NULL;
       enum_func_status ret = FAIL;
 -     zend_bool persistent = s-persistent;
 +     zend_bool persistent = (s == NULL) ? s-persistent : 0;

 This breaks mysqlnd. Why? Because you turn around the meaning. s? means
 s!=NULL and you change it to s==NULL but leave the rest of the ternary
 intact. Did you run the tests, because 117 more failing test, out of
 432. This is hard to oversee if you run the test suite!

 Best,
 Andrey




-- 
Pierre

@pierrejoye | http://blog.thepimp.net | http://www.libgd.org

--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



[PHP-CVS] svn: /php/php-src/ branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c trunk/ext/mysqlnd/mysqlnd_ps.c

2011-01-17 Thread Pierre Joye
pajoye   Mon, 17 Jan 2011 14:01:01 +

Revision: http://svn.php.net/viewvc?view=revisionrevision=307537

Log:
- fix NULL derefencing

Changed paths:
U   php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c
U   php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c

Modified: php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c
===
--- php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c   2011-01-17 
13:44:54 UTC (rev 307536)
+++ php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c   2011-01-17 
14:01:01 UTC (rev 307537)
@@ -735,7 +735,7 @@

DBG_ENTER(mysqlnd_fetch_stmt_row_buffered);
*fetched_anything = FALSE;
-   DBG_INF_FMT(stmt=%lu, stmt-stmt_id);
+   DBG_INF_FMT(stmt=%lu, stmt != NULL ? stmt-stmt_id : 0L);

/* If we haven't read everything */
if (set-data_cursor 
@@ -2223,9 +2223,9 @@
 static enum_func_status
 MYSQLND_METHOD(mysqlnd_stmt, dtor)(MYSQLND_STMT * const s, zend_bool implicit 
TSRMLS_DC)
 {
-   MYSQLND_STMT_DATA * stmt = s? s-data:NULL;
+   MYSQLND_STMT_DATA * stmt = (s == NULL) ? s-data:NULL;
enum_func_status ret = FAIL;
-   zend_bool persistent = s-persistent;
+   zend_bool persistent = (s == NULL) ? s-persistent : 0;

DBG_ENTER(mysqlnd_stmt::dtor);
if (stmt) {

Modified: php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c
===
--- php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c  2011-01-17 13:44:54 UTC (rev 
307536)
+++ php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c  2011-01-17 14:01:01 UTC (rev 
307537)
@@ -735,7 +735,7 @@

DBG_ENTER(mysqlnd_fetch_stmt_row_buffered);
*fetched_anything = FALSE;
-   DBG_INF_FMT(stmt=%lu, stmt-stmt_id);
+   DBG_INF_FMT(stmt=%lu, stmt != NULL ? stmt-stmt_id : 0L);

/* If we haven't read everything */
if (set-data_cursor 
@@ -2223,9 +2223,9 @@
 static enum_func_status
 MYSQLND_METHOD(mysqlnd_stmt, dtor)(MYSQLND_STMT * const s, zend_bool implicit 
TSRMLS_DC)
 {
-   MYSQLND_STMT_DATA * stmt = s? s-data:NULL;
+   MYSQLND_STMT_DATA * stmt = (s == NULL) ? s-data:NULL;
enum_func_status ret = FAIL;
-   zend_bool persistent = s-persistent;
+   zend_bool persistent = (s == NULL) ? s-persistent : 0;

DBG_ENTER(mysqlnd_stmt::dtor);
if (stmt) {

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

[PHP-CVS] svn: /php/php-src/ branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c trunk/ext/mysqlnd/mysqlnd_ps.c

2010-12-06 Thread Andrey Hristov
andrey   Mon, 06 Dec 2010 13:59:14 +

Revision: http://svn.php.net/viewvc?view=revisionrevision=306009

Log:
Skip additional result sets sent by MySQL 5.5 servers
which break the Protocol API
(see http://bugs.mysql.com/bug.php?id=58700)

Changed paths:
U   php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c
U   php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c

Modified: php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c
===
--- php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c   2010-12-06 
13:50:51 UTC (rev 306008)
+++ php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c   2010-12-06 
13:59:14 UTC (rev 306009)
@@ -225,10 +225,15 @@
DBG_RETURN(FAIL);
}

+   DBG_INF_FMT(server_status=%u cursor=%u, 
stmt-upsert_status.server_status, stmt-upsert_status.server_status  
SERVER_STATUS_CURSOR_EXISTS);
+   DBG_INF_FMT(server_status=%u cursor=%u, 
conn-upsert_status.server_status, conn-upsert_status.server_status  
SERVER_STATUS_CURSOR_EXISTS);
+
/* Free space for next result */
s-m-free_stmt_content(s TSRMLS_CC);
-
-   DBG_RETURN(s-m-parse_execute_response(s TSRMLS_CC));
+   {
+   enum_func_status ret = s-m-parse_execute_response(s 
TSRMLS_CC);
+   DBG_RETURN(ret);
+   }
 }
 /* }}} */

@@ -556,6 +561,14 @@
}
}
}
+#ifndef MYSQLND_DONT_SKIP_OUT_PARAMS_RESULTSET
+   if (stmt-upsert_status.server_status  SERVER_PS_OUT_PARAMS) {
+   s-m-free_stmt_content(s TSRMLS_CC);
+   DBG_INF(PS OUT Variable RSet, skipping);
+   /* OUT params result set. Skip for now to retain compatibility 
*/
+   ret = mysqlnd_stmt_execute_parse_response(s TSRMLS_CC);
+   }
+#endif

DBG_INF(ret == PASS? PASS:FAIL);
DBG_RETURN(ret);
@@ -701,6 +714,8 @@

ret = s-m-parse_execute_response(s TSRMLS_CC);

+   DBG_INF_FMT(server_status=%u cursor=%u, 
stmt-upsert_status.server_status, stmt-upsert_status.server_status  
SERVER_STATUS_CURSOR_EXISTS);
+
if (ret == PASS  conn-last_query_type == QUERY_UPSERT  
stmt-upsert_status.affected_rows) {
MYSQLND_INC_CONN_STATISTIC_W_VALUE(conn-stats, 
STAT_ROWS_AFFECTED_PS, stmt-upsert_status.affected_rows);
}

Modified: php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c
===
--- php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c  2010-12-06 13:50:51 UTC (rev 
306008)
+++ php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c  2010-12-06 13:59:14 UTC (rev 
306009)
@@ -225,10 +225,15 @@
DBG_RETURN(FAIL);
}

+   DBG_INF_FMT(server_status=%u cursor=%u, 
stmt-upsert_status.server_status, stmt-upsert_status.server_status  
SERVER_STATUS_CURSOR_EXISTS);
+   DBG_INF_FMT(server_status=%u cursor=%u, 
conn-upsert_status.server_status, conn-upsert_status.server_status  
SERVER_STATUS_CURSOR_EXISTS);
+
/* Free space for next result */
s-m-free_stmt_content(s TSRMLS_CC);
-
-   DBG_RETURN(s-m-parse_execute_response(s TSRMLS_CC));
+   {
+   enum_func_status ret = s-m-parse_execute_response(s 
TSRMLS_CC);
+   DBG_RETURN(ret);
+   }
 }
 /* }}} */

@@ -556,6 +561,14 @@
}
}
}
+#ifndef MYSQLND_DONT_SKIP_OUT_PARAMS_RESULTSET
+   if (stmt-upsert_status.server_status  SERVER_PS_OUT_PARAMS) {
+   s-m-free_stmt_content(s TSRMLS_CC);
+   DBG_INF(PS OUT Variable RSet, skipping);
+   /* OUT params result set. Skip for now to retain compatibility 
*/
+   ret = mysqlnd_stmt_execute_parse_response(s TSRMLS_CC);
+   }
+#endif

DBG_INF(ret == PASS? PASS:FAIL);
DBG_RETURN(ret);
@@ -701,6 +714,8 @@

ret = s-m-parse_execute_response(s TSRMLS_CC);

+   DBG_INF_FMT(server_status=%u cursor=%u, 
stmt-upsert_status.server_status, stmt-upsert_status.server_status  
SERVER_STATUS_CURSOR_EXISTS);
+
if (ret == PASS  conn-last_query_type == QUERY_UPSERT  
stmt-upsert_status.affected_rows) {
MYSQLND_INC_CONN_STATISTIC_W_VALUE(conn-stats, 
STAT_ROWS_AFFECTED_PS, stmt-upsert_status.affected_rows);
}

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

[PHP-CVS] svn: /php/php-src/ branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c trunk/ext/mysqlnd/mysqlnd_ps.c

2010-09-29 Thread Andrey Hristov
andrey   Wed, 29 Sep 2010 13:18:07 +

Revision: http://svn.php.net/viewvc?view=revisionrevision=303855

Log:
Fix a problem that leads to leaks in plugins that
use stmt local data - no free is called for statements
that are over-prepared

Changed paths:
U   php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c
U   php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c

Modified: php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c
===
--- php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c   2010-09-29 
11:40:57 UTC (rev 303854)
+++ php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c   2010-09-29 
13:18:07 UTC (rev 303855)
@@ -433,13 +433,19 @@
}

if (stmt_to_prepare != stmt) {
-   /* Free old buffers, binding and resources on server */
-   s-m-net_close(s, TRUE TSRMLS_CC);
-
-   memcpy(stmt, stmt_to_prepare, sizeof(MYSQLND_STMT_DATA));
-
-   /* Now we will have a clean new statement object */
-   mnd_pefree(stmt_to_prepare, stmt_to_prepare-persistent);
+   /* swap */
+   size_t real_size = sizeof(MYSQLND_STMT) + 
mysqlnd_plugin_count() * sizeof(void *);
+   char * tmp_swap = mnd_malloc(real_size);
+   memcpy(tmp_swap, s, real_size);
+   memcpy(s, s_to_prepare, real_size);
+   memcpy(s_to_prepare, tmp_swap, real_size);
+   mnd_free(tmp_swap);
+   {
+   MYSQLND_STMT_DATA * tmp_swap_data = stmt_to_prepare;
+   stmt_to_prepare = stmt;
+   stmt = tmp_swap_data;
+   }
+   s_to_prepare-m-dtor(s_to_prepare, TRUE TSRMLS_CC);
}
stmt-state = MYSQLND_STMT_PREPARED;
DBG_INF(PASS);

Modified: php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c
===
--- php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c  2010-09-29 11:40:57 UTC (rev 
303854)
+++ php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c  2010-09-29 13:18:07 UTC (rev 
303855)
@@ -433,13 +433,19 @@
}

if (stmt_to_prepare != stmt) {
-   /* Free old buffers, binding and resources on server */
-   s-m-net_close(s, TRUE TSRMLS_CC);
-
-   memcpy(stmt, stmt_to_prepare, sizeof(MYSQLND_STMT_DATA));
-
-   /* Now we will have a clean new statement object */
-   mnd_pefree(stmt_to_prepare, stmt_to_prepare-persistent);
+   /* swap */
+   size_t real_size = sizeof(MYSQLND_STMT) + 
mysqlnd_plugin_count() * sizeof(void *);
+   char * tmp_swap = mnd_malloc(real_size);
+   memcpy(tmp_swap, s, real_size);
+   memcpy(s, s_to_prepare, real_size);
+   memcpy(s_to_prepare, tmp_swap, real_size);
+   mnd_free(tmp_swap);
+   {
+   MYSQLND_STMT_DATA * tmp_swap_data = stmt_to_prepare;
+   stmt_to_prepare = stmt;
+   stmt = tmp_swap_data;
+   }
+   s_to_prepare-m-dtor(s_to_prepare, TRUE TSRMLS_CC);
}
stmt-state = MYSQLND_STMT_PREPARED;
DBG_INF(PASS);

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

[PHP-CVS] svn: /php/php-src/ branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c trunk/ext/mysqlnd/mysqlnd_ps.c

2010-06-10 Thread Andrey Hristov
andrey   Thu, 10 Jun 2010 09:37:58 +

Revision: http://svn.php.net/viewvc?view=revisionrevision=300346

Log:
void functions return nothing

Changed paths:
U   php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c
U   php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c

Modified: php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c
===
--- php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c   2010-06-10 
09:13:22 UTC (rev 300345)
+++ php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c   2010-06-10 
09:37:58 UTC (rev 300346)
@@ -2016,7 +2016,7 @@
MYSQLND_STMT_DATA * stmt = s? s-data:NULL;
DBG_ENTER(mysqlnd_stmt_separate_one_result_bind);
if (!stmt) {
-   DBG_RETURN(FAIL);
+   DBG_VOID_RETURN;
}
DBG_INF_FMT(stmt=%lu result_bind=%p field_count=%u param_no=%d,
stmt-stmt_id, stmt-result_bind, 
stmt-field_count, param_no);

Modified: php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c
===
--- php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c  2010-06-10 09:13:22 UTC (rev 
300345)
+++ php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c  2010-06-10 09:37:58 UTC (rev 
300346)
@@ -2016,7 +2016,7 @@
MYSQLND_STMT_DATA * stmt = s? s-data:NULL;
DBG_ENTER(mysqlnd_stmt_separate_one_result_bind);
if (!stmt) {
-   DBG_RETURN(FAIL);
+   DBG_VOID_RETURN;
}
DBG_INF_FMT(stmt=%lu result_bind=%p field_count=%u param_no=%d,
stmt-stmt_id, stmt-result_bind, 
stmt-field_count, param_no);

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

[PHP-CVS] svn: /php/php-src/ branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c trunk/ext/mysqlnd/mysqlnd_ps.c

2010-05-31 Thread Andrey Hristov
andrey   Mon, 31 May 2010 18:10:25 +

Revision: http://svn.php.net/viewvc?view=revisionrevision=29

Log:
Check if data is correct and initialize in a safe manner

Changed paths:
U   php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c
U   php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c

Modified: php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c
===
--- php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c	2010-05-31 17:57:03 UTC (rev 28)
+++ php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c	2010-05-31 18:10:25 UTC (rev 29)
@@ -62,7 +62,7 @@
 static MYSQLND_RES *
 MYSQLND_METHOD(mysqlnd_stmt, store_result)(MYSQLND_STMT * const s TSRMLS_DC)
 {
-	MYSQLND_STMT_DATA * stmt = s-data;
+	MYSQLND_STMT_DATA * stmt = s? s-data:NULL;
 	enum_func_status ret;
 	MYSQLND *conn = stmt-conn;
 	MYSQLND_RES *result;
@@ -127,7 +127,7 @@
 static MYSQLND_RES *
 MYSQLND_METHOD(mysqlnd_stmt, get_result)(MYSQLND_STMT * const s TSRMLS_DC)
 {
-	MYSQLND_STMT_DATA * stmt = s-data;
+	MYSQLND_STMT_DATA * stmt = s? s-data:NULL;
 	MYSQLND *conn = stmt-conn;
 	MYSQLND_RES *result;

@@ -192,7 +192,7 @@
 static zend_bool
 MYSQLND_METHOD(mysqlnd_stmt, more_results)(const MYSQLND_STMT * s TSRMLS_DC)
 {
-	MYSQLND_STMT_DATA * stmt = s-data;
+	MYSQLND_STMT_DATA * stmt = s? s-data:NULL;
 	DBG_ENTER(mysqlnd_stmt::more_results);
 	/* (conn-state == CONN_NEXT_RESULT_PENDING) too */
 	DBG_RETURN((stmt-conn  (stmt-conn-upsert_status.server_status 
@@ -207,7 +207,7 @@
 static enum_func_status
 MYSQLND_METHOD(mysqlnd_stmt, next_result)(MYSQLND_STMT * s TSRMLS_DC)
 {
-	MYSQLND_STMT_DATA * stmt = s-data;
+	MYSQLND_STMT_DATA * stmt = s? s-data:NULL;
 	MYSQLND *conn = stmt-conn;

 	DBG_ENTER(mysqlnd_stmt::next_result);
@@ -233,7 +233,7 @@
 static enum_func_status
 mysqlnd_stmt_skip_metadata(MYSQLND_STMT * s TSRMLS_DC)
 {
-	MYSQLND_STMT_DATA * stmt = s-data;
+	MYSQLND_STMT_DATA * stmt = s? s-data:NULL;
 	/* Follows parameter metadata, we have just to skip it, as libmysql does */
 	unsigned int i = 0;
 	enum_func_status ret = FAIL;
@@ -267,7 +267,7 @@
 static enum_func_status
 mysqlnd_stmt_read_prepare_response(MYSQLND_STMT * s TSRMLS_DC)
 {
-	MYSQLND_STMT_DATA * stmt = s-data;
+	MYSQLND_STMT_DATA * stmt = s? s-data:NULL;
 	MYSQLND_PACKET_PREPARE_RESPONSE * prepare_resp;
 	enum_func_status ret = FAIL;

@@ -306,7 +306,7 @@
 static enum_func_status
 mysqlnd_stmt_prepare_read_eof(MYSQLND_STMT * s TSRMLS_DC)
 {
-	MYSQLND_STMT_DATA * stmt = s-data;
+	MYSQLND_STMT_DATA * stmt = s? s-data:NULL;
 	MYSQLND_PACKET_EOF * fields_eof;
 	enum_func_status ret;

@@ -342,7 +342,7 @@
 static enum_func_status
 MYSQLND_METHOD(mysqlnd_stmt, prepare)(MYSQLND_STMT * const s, const char * const query, unsigned int query_len TSRMLS_DC)
 {
-	MYSQLND_STMT_DATA * stmt = s-data;
+	MYSQLND_STMT_DATA * stmt = s? s-data:NULL;
 	MYSQLND_STMT * s_to_prepare = s;
 	MYSQLND_STMT_DATA * stmt_to_prepare = stmt;

@@ -442,7 +442,7 @@
 static enum_func_status
 mysqlnd_stmt_execute_parse_response(MYSQLND_STMT * const s TSRMLS_DC)
 {
-	MYSQLND_STMT_DATA * stmt = s-data;
+	MYSQLND_STMT_DATA * stmt = s? s-data:NULL;
 	enum_func_status ret;
 	MYSQLND	* conn = stmt-conn;

@@ -532,7 +532,7 @@
 static enum_func_status
 MYSQLND_METHOD(mysqlnd_stmt, execute)(MYSQLND_STMT * const s TSRMLS_DC)
 {
-	MYSQLND_STMT_DATA * stmt = s-data;
+	MYSQLND_STMT_DATA * stmt = s? s-data:NULL;
 	enum_func_status ret;
 	MYSQLND *	conn = stmt-conn;
 	zend_uchar *request = NULL;
@@ -675,7 +675,7 @@
 mysqlnd_fetch_stmt_row_buffered(MYSQLND_RES *result, void *param, unsigned int flags, zend_bool *fetched_anything TSRMLS_DC)
 {
 	MYSQLND_STMT * s = (MYSQLND_STMT *) param;
-	MYSQLND_STMT_DATA * stmt = s-data;
+	MYSQLND_STMT_DATA * stmt = s? s-data:NULL;
 	MYSQLND_RES_BUFFERED *set = result-stored_data;
 	unsigned int field_count = result-meta-field_count;

@@ -900,7 +900,7 @@
 static MYSQLND_RES *
 MYSQLND_METHOD(mysqlnd_stmt, use_result)(MYSQLND_STMT * s TSRMLS_DC)
 {
-	MYSQLND_STMT_DATA * stmt = s-data;
+	MYSQLND_STMT_DATA * stmt = s? s-data:NULL;
 	MYSQLND_RES *result;
 	MYSQLND *conn = stmt-conn;

@@ -1087,7 +1087,7 @@
 static enum_func_status
 MYSQLND_METHOD(mysqlnd_stmt, fetch)(MYSQLND_STMT * const s, zend_bool * const fetched_anything TSRMLS_DC)
 {
-	MYSQLND_STMT_DATA * stmt = s-data;
+	MYSQLND_STMT_DATA * stmt = s? s-data:NULL;
 	enum_func_status ret;
 	DBG_ENTER(mysqlnd_stmt::fetch);
 	DBG_INF_FMT(stmt=%lu, stmt-stmt_id);
@@ -1138,7 +1138,7 @@
 static enum_func_status
 MYSQLND_METHOD(mysqlnd_stmt, reset)(MYSQLND_STMT * const s TSRMLS_DC)
 {
-	MYSQLND_STMT_DATA * stmt = s-data;
+	MYSQLND_STMT_DATA * stmt = s? s-data:NULL;
 	enum_func_status ret = PASS;
 	zend_uchar cmd_buf[STMT_ID_LENGTH /* statement id */];

@@ -1207,7 +1207,7 @@
 MYSQLND_METHOD(mysqlnd_stmt, send_long_data)(MYSQLND_STMT * const s, unsigned int param_no,
 			  const char * const data, unsigned long length TSRMLS_DC)
 {
-	

[PHP-CVS] svn: /php/php-src/ branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c trunk/ext/mysqlnd/mysqlnd_ps.c

2010-05-31 Thread Andrey Hristov
andrey   Mon, 31 May 2010 18:18:37 +

Revision: http://svn.php.net/viewvc?view=revisionrevision=30

Log:
Don't reference row_packet before checking if dereferencing is possible

Changed paths:
U   php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c
U   php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c

Modified: php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c
===
--- php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c   2010-05-31 
18:10:25 UTC (rev 29)
+++ php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c   2010-05-31 
18:18:37 UTC (rev 30)
@@ -308,7 +308,7 @@
 {
MYSQLND_STMT_DATA * stmt = s? s-data:NULL;
MYSQLND_PACKET_EOF * fields_eof;
-   enum_func_status ret;
+   enum_func_status ret = FAIL;

DBG_ENTER(mysqlnd_stmt_prepare_read_eof);
DBG_INF_FMT(stmt=%lu, stmt-stmt_id);
@@ -371,6 +371,9 @@
  fails, we will scrap it.
*/
s_to_prepare = stmt-conn-m-stmt_init(stmt-conn TSRMLS_CC);
+   if (!s_to_prepare) {
+   goto fail;
+   }
stmt_to_prepare = s_to_prepare-data;
}

@@ -427,7 +430,7 @@
DBG_RETURN(PASS);

 fail:
-   if (stmt_to_prepare != stmt) {
+   if (stmt_to_prepare != stmt  s_to_prepare) {
s_to_prepare-m-dtor(s_to_prepare, TRUE TSRMLS_CC);
}
stmt-state = MYSQLND_STMT_INITTED;
@@ -776,7 +779,7 @@
enum_func_status ret;
MYSQLND_STMT * s = (MYSQLND_STMT *) param;
MYSQLND_STMT_DATA * stmt = s? s-data:NULL;
-   MYSQLND_PACKET_ROW *row_packet = result-row_packet;
+   MYSQLND_PACKET_ROW * row_packet;

DBG_ENTER(mysqlnd_stmt_fetch_row_unbuffered);

@@ -793,6 +796,10 @@
DBG_ERR(command out of sync);
DBG_RETURN(FAIL);
}
+   if (!(row_packet = result-row_packet)) {
+   DBG_RETURN(FAIL);
+   }
+
/* Let the row packet fill our buffer and skip additional malloc + 
memcpy */
row_packet-skip_extraction = stmt  stmt-result_bind? FALSE:TRUE;

@@ -943,9 +950,9 @@
 {
enum_func_status ret;
MYSQLND_STMT * s = (MYSQLND_STMT *) param;
-   MYSQLND_STMT_DATA * stmt = s? s-data : NULL;
+   MYSQLND_STMT_DATA * stmt = s? s-data:NULL;
zend_uchar buf[STMT_ID_LENGTH /* statement id */ + 4 /* number of rows 
to fetch */];
-   MYSQLND_PACKET_ROW *row_packet = result-row_packet;
+   MYSQLND_PACKET_ROW * row_packet;

DBG_ENTER(mysqlnd_fetch_stmt_row_cursor);

@@ -963,6 +970,9 @@
DBG_ERR(command out of sync);
DBG_RETURN(FAIL);
}
+   if (!(row_packet = result-row_packet)) {
+   DBG_RETURN(FAIL);
+   }

SET_EMPTY_ERROR(stmt-error_info);
SET_EMPTY_ERROR(stmt-conn-error_info);
@@ -1466,7 +1476,6 @@
DBG_ENTER(mysqlnd_stmt::bind_result);
DBG_INF_FMT(stmt=%lu field_count=%u, stmt-stmt_id, 
stmt-field_count);

-
if (stmt-state  MYSQLND_STMT_PREPARED) {
SET_STMT_ERROR(stmt, CR_NO_PREPARE_STMT, UNKNOWN_SQLSTATE, 
mysqlnd_stmt_not_prepared);
if (result_bind) {
@@ -1673,7 +1682,6 @@
if (!stmt-param_count) {
return NULL;
}
-
return NULL;
 }
 /* }}} */

Modified: php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c
===
--- php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c  2010-05-31 18:10:25 UTC (rev 
29)
+++ php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c  2010-05-31 18:18:37 UTC (rev 
30)
@@ -308,7 +308,7 @@
 {
MYSQLND_STMT_DATA * stmt = s? s-data:NULL;
MYSQLND_PACKET_EOF * fields_eof;
-   enum_func_status ret;
+   enum_func_status ret = FAIL;

DBG_ENTER(mysqlnd_stmt_prepare_read_eof);
DBG_INF_FMT(stmt=%lu, stmt-stmt_id);
@@ -371,6 +371,9 @@
  fails, we will scrap it.
*/
s_to_prepare = stmt-conn-m-stmt_init(stmt-conn TSRMLS_CC);
+   if (!s_to_prepare) {
+   goto fail;
+   }
stmt_to_prepare = s_to_prepare-data;
}

@@ -427,7 +430,7 @@
DBG_RETURN(PASS);

 fail:
-   if (stmt_to_prepare != stmt) {
+   if (stmt_to_prepare != stmt  s_to_prepare) {
s_to_prepare-m-dtor(s_to_prepare, TRUE TSRMLS_CC);
}
stmt-state = MYSQLND_STMT_INITTED;
@@ -776,7 +779,7 @@
enum_func_status ret;
MYSQLND_STMT * s = (MYSQLND_STMT *) param;
MYSQLND_STMT_DATA * stmt = s? s-data:NULL;
-   MYSQLND_PACKET_ROW *row_packet = result-row_packet;
+   MYSQLND_PACKET_ROW * row_packet;

DBG_ENTER(mysqlnd_stmt_fetch_row_unbuffered);

@@ -793,6 +796,10 @@
DBG_ERR(command out of sync);
DBG_RETURN(FAIL);
}

[PHP-CVS] svn: /php/php-src/ branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c trunk/ext/mysqlnd/mysqlnd_ps.c

2010-05-31 Thread Andrey Hristov
andrey   Mon, 31 May 2010 18:26:19 +

Revision: http://svn.php.net/viewvc?view=revisionrevision=31

Log:
More check for valid MYSQLND_STMT before using it

Changed paths:
U   php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c
U   php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c

Modified: php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c
===
--- php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c	2010-05-31 18:18:37 UTC (rev 30)
+++ php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c	2010-05-31 18:26:19 UTC (rev 31)
@@ -195,7 +195,7 @@
 	MYSQLND_STMT_DATA * stmt = s? s-data:NULL;
 	DBG_ENTER(mysqlnd_stmt::more_results);
 	/* (conn-state == CONN_NEXT_RESULT_PENDING) too */
-	DBG_RETURN((stmt-conn  (stmt-conn-upsert_status.server_status 
+	DBG_RETURN((stmt  stmt-conn  (stmt-conn-upsert_status.server_status 
 			   SERVER_MORE_RESULTS_EXISTS))?
 	TRUE:
 	FALSE);
@@ -1569,7 +1569,7 @@
 MYSQLND_METHOD(mysqlnd_stmt, insert_id)(const MYSQLND_STMT * const s TSRMLS_DC)
 {
 	MYSQLND_STMT_DATA * stmt = s? s-data:NULL;
-	return stmt-upsert_status.last_insert_id;
+	return stmt? stmt-upsert_status.last_insert_id : 0;
 }
 /* }}} */

@@ -1579,7 +1579,7 @@
 MYSQLND_METHOD(mysqlnd_stmt, affected_rows)(const MYSQLND_STMT * const s TSRMLS_DC)
 {
 	MYSQLND_STMT_DATA * stmt = s? s-data:NULL;
-	return stmt-upsert_status.affected_rows;
+	return stmt? stmt-upsert_status.affected_rows : 0;
 }
 /* }}} */

@@ -1589,7 +1589,7 @@
 MYSQLND_METHOD(mysqlnd_stmt, num_rows)(const MYSQLND_STMT * const s TSRMLS_DC)
 {
 	MYSQLND_STMT_DATA * stmt = s? s-data:NULL;
-	return stmt-result? mysqlnd_num_rows(stmt-result):0;
+	return stmt  stmt-result? mysqlnd_num_rows(stmt-result):0;
 }
 /* }}} */

@@ -1599,7 +1599,7 @@
 MYSQLND_METHOD(mysqlnd_stmt, warning_count)(const MYSQLND_STMT * const s TSRMLS_DC)
 {
 	MYSQLND_STMT_DATA * stmt = s? s-data:NULL;
-	return stmt-upsert_status.warning_count;
+	return stmt? stmt-upsert_status.warning_count : 0;
 }
 /* }}} */

@@ -1609,7 +1609,7 @@
 MYSQLND_METHOD(mysqlnd_stmt, server_status)(const MYSQLND_STMT * const s TSRMLS_DC)
 {
 	MYSQLND_STMT_DATA * stmt = s? s-data:NULL;
-	return stmt-upsert_status.server_status;
+	return stmt? stmt-upsert_status.server_status : 0;
 }
 /* }}} */

@@ -1619,7 +1619,7 @@
 MYSQLND_METHOD(mysqlnd_stmt, field_count)(const MYSQLND_STMT * const s TSRMLS_DC)
 {
 	MYSQLND_STMT_DATA * stmt = s? s-data:NULL;
-	return stmt-field_count;
+	return stmt? stmt-field_count : 0;
 }
 /* }}} */

@@ -1629,7 +1629,7 @@
 MYSQLND_METHOD(mysqlnd_stmt, param_count)(const MYSQLND_STMT * const s TSRMLS_DC)
 {
 	MYSQLND_STMT_DATA * stmt = s? s-data:NULL;
-	return stmt-param_count;
+	return stmt? stmt-param_count : 0;
 }
 /* }}} */

@@ -1639,7 +1639,7 @@
 MYSQLND_METHOD(mysqlnd_stmt, errno)(const MYSQLND_STMT * const s TSRMLS_DC)
 {
 	MYSQLND_STMT_DATA * stmt = s? s-data:NULL;
-	return stmt-error_info.error_no;
+	return stmt? stmt-error_info.error_no : 0;
 }
 /* }}} */

@@ -1649,7 +1649,7 @@
 MYSQLND_METHOD(mysqlnd_stmt, error)(const MYSQLND_STMT * const s TSRMLS_DC)
 {
 	MYSQLND_STMT_DATA * stmt = s? s-data:NULL;
-	return stmt-error_info.error;
+	return stmt? stmt-error_info.error : 0;
 }
 /* }}} */

@@ -1659,7 +1659,7 @@
 MYSQLND_METHOD(mysqlnd_stmt, sqlstate)(const MYSQLND_STMT * const s TSRMLS_DC)
 {
 	MYSQLND_STMT_DATA * stmt = s? s-data:NULL;
-	return stmt-error_info.sqlstate[0] ? stmt-error_info.sqlstate:MYSQLND_SQLSTATE_NULL;
+	return stmt  stmt-error_info.sqlstate[0] ? stmt-error_info.sqlstate:MYSQLND_SQLSTATE_NULL;
 }
 /* }}} */

@@ -1669,7 +1669,7 @@
 MYSQLND_METHOD(mysqlnd_stmt, data_seek)(const MYSQLND_STMT * const s, uint64_t row TSRMLS_DC)
 {
 	MYSQLND_STMT_DATA * stmt = s? s-data:NULL;
-	return stmt-result? stmt-result-m.seek_data(stmt-result, row TSRMLS_CC) : FAIL;
+	return stmt  stmt-result? stmt-result-m.seek_data(stmt-result, row TSRMLS_CC) : FAIL;
 }
 /* }}} */

@@ -1679,7 +1679,7 @@
 MYSQLND_METHOD(mysqlnd_stmt, param_metadata)(MYSQLND_STMT * const s TSRMLS_DC)
 {
 	MYSQLND_STMT_DATA * stmt = s? s-data:NULL;
-	if (!stmt-param_count) {
+	if (!stmt || !stmt-param_count) {
 		return NULL;
 	}
 	return NULL;
@@ -2136,6 +2136,9 @@
 {
 	MYSQLND_STMT_DATA * stmt = s? s-data:NULL;
 	DBG_ENTER(mysqlnd_stmt::alloc_param_bind);
+	if (!stmt) {
+		DBG_RETURN(NULL);
+	}
 	DBG_RETURN(mnd_pecalloc(stmt-param_count, sizeof(MYSQLND_PARAM_BIND), stmt-persistent));
 }
 /* }}} */
@@ -2147,6 +2150,9 @@
 {
 	MYSQLND_STMT_DATA * stmt = s? s-data:NULL;
 	DBG_ENTER(mysqlnd_stmt::alloc_result_bind);
+	if (!stmt) {
+		DBG_RETURN(NULL);
+	}
 	DBG_RETURN(mnd_pecalloc(stmt-field_count, sizeof(MYSQLND_RESULT_BIND), stmt-persistent));
 }
 /* }}} */
@@ -2157,7 +2163,9 @@
 MYSQLND_METHOD(mysqlnd_stmt, free_parameter_bind)(MYSQLND_STMT * const s, MYSQLND_PARAM_BIND * param_bind TSRMLS_DC)
 {
 	MYSQLND_STMT_DATA * stmt = s? s-data:NULL;
-	mnd_pefree(param_bind, stmt-persistent);

[PHP-CVS] svn: /php/php-src/ branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c trunk/ext/mysqlnd/mysqlnd_ps.c

2010-05-25 Thread Andrey Hristov
andrey   Tue, 25 May 2010 22:42:25 +

Revision: http://svn.php.net/viewvc?view=revisionrevision=299762

Log:
Gracefully handle OOM in mysqlnd_stmt_init. Release the handle
and return NULL.

Changed paths:
U   php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c
U   php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c

Modified: php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c
===
--- php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c   2010-05-25 
22:40:47 UTC (rev 299761)
+++ php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_ps.c   2010-05-25 
22:42:25 UTC (rev 299762)
@@ -2194,25 +2194,45 @@
 {
size_t alloc_size = sizeof(MYSQLND_STMT) + mysqlnd_plugin_count() * 
sizeof(void *);
MYSQLND_STMT * ret = mnd_pecalloc(1, alloc_size, conn-persistent);
-   MYSQLND_STMT_DATA * stmt = ret-data = mnd_pecalloc(1, 
sizeof(MYSQLND_STMT_DATA), conn-persistent);
+   MYSQLND_STMT_DATA * stmt = NULL;

DBG_ENTER(_mysqlnd_stmt_init);
-   DBG_INF_FMT(stmt=%p, stmt);
+   do {
+   if (!ret) {
+   break;
+   }
+   ret-m = mysqlnd_stmt_methods;

-   ret-m = mysqlnd_stmt_methods;
-   stmt-persistent = conn-persistent;
-   stmt-state = MYSQLND_STMT_INITTED;
-   stmt-execute_cmd_buffer.length = 4096;
-   stmt-execute_cmd_buffer.buffer = 
mnd_pemalloc(stmt-execute_cmd_buffer.length, stmt-persistent);
+   stmt = ret-data = mnd_pecalloc(1, sizeof(MYSQLND_STMT_DATA), 
conn-persistent);
+   DBG_INF_FMT(stmt=%p, stmt);
+   if (!stmt) {
+   break;
+   }
+   stmt-persistent = conn-persistent;
+   stmt-state = MYSQLND_STMT_INITTED;
+   stmt-execute_cmd_buffer.length = 4096;
+   stmt-execute_cmd_buffer.buffer = 
mnd_pemalloc(stmt-execute_cmd_buffer.length, stmt-persistent);
+   if (!stmt-execute_cmd_buffer.buffer) {
+   break;
+   }

-   stmt-prefetch_rows = MYSQLND_DEFAULT_PREFETCH_ROWS;
-   /*
- Mark that we reference the connection, thus it won't be
- be destructed till there is open statements. The last statement
- or normal query result will close it then.
-   */
-   stmt-conn = conn-m-get_reference(conn TSRMLS_CC);
-   DBG_RETURN(ret);
+   stmt-prefetch_rows = MYSQLND_DEFAULT_PREFETCH_ROWS;
+   /*
+ Mark that we reference the connection, thus it won't be
+ be destructed till there is open statements. The last 
statement
+ or normal query result will close it then.
+   */
+   stmt-conn = conn-m-get_reference(conn TSRMLS_CC);
+
+   DBG_RETURN(ret);
+   } while (0);
+
+   SET_OOM_ERROR(conn-error_info);
+   if (ret) {
+   ret-m-dtor(ret, TRUE TSRMLS_CC);
+   ret = NULL;
+   }
+   DBG_RETURN(NULL);
 }
 /* }}} */


Modified: php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c
===
--- php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c  2010-05-25 22:40:47 UTC (rev 
299761)
+++ php/php-src/trunk/ext/mysqlnd/mysqlnd_ps.c  2010-05-25 22:42:25 UTC (rev 
299762)
@@ -2194,25 +2194,45 @@
 {
size_t alloc_size = sizeof(MYSQLND_STMT) + mysqlnd_plugin_count() * 
sizeof(void *);
MYSQLND_STMT * ret = mnd_pecalloc(1, alloc_size, conn-persistent);
-   MYSQLND_STMT_DATA * stmt = ret-data = mnd_pecalloc(1, 
sizeof(MYSQLND_STMT_DATA), conn-persistent);
+   MYSQLND_STMT_DATA * stmt = NULL;

DBG_ENTER(_mysqlnd_stmt_init);
-   DBG_INF_FMT(stmt=%p, stmt);
+   do {
+   if (!ret) {
+   break;
+   }
+   ret-m = mysqlnd_stmt_methods;

-   ret-m = mysqlnd_stmt_methods;
-   stmt-persistent = conn-persistent;
-   stmt-state = MYSQLND_STMT_INITTED;
-   stmt-execute_cmd_buffer.length = 4096;
-   stmt-execute_cmd_buffer.buffer = 
mnd_pemalloc(stmt-execute_cmd_buffer.length, stmt-persistent);
+   stmt = ret-data = mnd_pecalloc(1, sizeof(MYSQLND_STMT_DATA), 
conn-persistent);
+   DBG_INF_FMT(stmt=%p, stmt);
+   if (!stmt) {
+   break;
+   }
+   stmt-persistent = conn-persistent;
+   stmt-state = MYSQLND_STMT_INITTED;
+   stmt-execute_cmd_buffer.length = 4096;
+   stmt-execute_cmd_buffer.buffer = 
mnd_pemalloc(stmt-execute_cmd_buffer.length, stmt-persistent);
+   if (!stmt-execute_cmd_buffer.buffer) {
+   break;
+   }

-   stmt-prefetch_rows = MYSQLND_DEFAULT_PREFETCH_ROWS;
-   /*
- Mark that we reference the connection, thus it won't be
- be destructed till