MYSQLND_PACKET_HEADER header;
zend_uchar * p = NULL;
zend_bool first_iteration = TRUE;
++ size_t prealloc_more_bytes;
DBG_ENTER("php_mysqlnd_read_row_ex");
for next one if they have 2^24 - 1 sizes. But just read the header of a
zero-length byte, don't read the body, there is no such.
*/
- *data_size = 1;
+
+ /*
+ We're allocating an extra byte, as php_mysqlnd_rowp_read_text_protocol_aux
+ needs to be able to append a terminating \0 for atoi/atof.
+ */
++ prealloc_more_bytes = 1;
+ *data_size = 0;
while (1) {
- if (FAIL == mysqlnd_read_header(conn->net, &header, conn->stats, conn->error_info)) {
+ if (FAIL == mysqlnd_read_header(pfc, vio, &header, stats, error_info)) {
ret = FAIL;
break;
}
if (first_iteration) {
first_iteration = FALSE;
- *buffer = pool->get_chunk(pool, *data_size);
- *buffer = result_set_memory_pool->get_chunk(
- result_set_memory_pool, *data_size + prealloc_more_bytes);
++ *buffer = pool->get_chunk(pool, *data_size + prealloc_more_bytes);
if (!*buffer) {
ret = FAIL;
break;
/*
We have to realloc the buffer.
*/
- if (FAIL == pool->resize_chunk(pool, *buffer, *data_size)) {
- if (FAIL == (*buffer)->resize_chunk((*buffer), *data_size + prealloc_more_bytes)) {
- SET_OOM_ERROR(*conn->error_info);
++ if (FAIL == pool->resize_chunk(pool, *buffer, *data_size + prealloc_more_bytes)) {
+ SET_OOM_ERROR(error_info);
ret = FAIL;
break;
}
}
}
if (ret == FAIL && *buffer) {
- (*buffer)->free_chunk((*buffer));
+ pool->free_chunk(pool, *buffer);
*buffer = NULL;
}
- (*data_size)--;
DBG_RETURN(ret);
}
/* }}} */