Skip to content

Commit 771b0bd

Browse files
committed
Remove free_chunk API
This API only works in very limited circumstances -- relying on it will invariably lead to leaks. The correct way to "free" something from the pool is to use the checkpoint API.
1 parent 6e6d6bb commit 771b0bd

File tree

3 files changed

+2
-54
lines changed

3 files changed

+2
-54
lines changed

ext/mysqlnd/mysqlnd_block_alloc.c

Lines changed: 1 addition & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -22,38 +22,12 @@
2222
#include "mysqlnd_debug.h"
2323
#include "mysqlnd_priv.h"
2424

25-
/* {{{ mysqlnd_mempool_free_chunk */
26-
static void
27-
mysqlnd_mempool_free_chunk(MYSQLND_MEMORY_POOL * pool, void * ptr)
28-
{
29-
DBG_ENTER("mysqlnd_mempool_free_chunk");
30-
/* Try to back-off and guess if this is the last block allocated */
31-
#ifndef ZEND_TRACK_ARENA_ALLOC
32-
if (ptr == pool->last) {
33-
/*
34-
This was the last allocation. Lucky us, we can free
35-
a bit of memory from the pool. Next time we will return from the same ptr.
36-
*/
37-
pool->arena->ptr = (char*)ptr;
38-
pool->last = NULL;
39-
}
40-
#endif
41-
DBG_VOID_RETURN;
42-
}
43-
/* }}} */
44-
45-
4625
/* {{{ mysqlnd_mempool_get_chunk */
4726
static void *
4827
mysqlnd_mempool_get_chunk(MYSQLND_MEMORY_POOL * pool, size_t size)
4928
{
50-
void *ptr = NULL;
5129
DBG_ENTER("mysqlnd_mempool_get_chunk");
52-
53-
ptr = zend_arena_alloc(&pool->arena, size);
54-
pool->last = ptr;
55-
56-
DBG_RETURN(ptr);
30+
DBG_RETURN(zend_arena_alloc(&pool->arena, size));
5731
}
5832
/* }}} */
5933

@@ -69,10 +43,8 @@ mysqlnd_mempool_create(size_t arena_size)
6943
arena = zend_arena_create(MAX(arena_size, ZEND_MM_ALIGNED_SIZE(sizeof(zend_arena))));
7044
ret = zend_arena_alloc(&arena, sizeof(MYSQLND_MEMORY_POOL));
7145
ret->arena = arena;
72-
ret->last = NULL;
7346
ret->checkpoint = NULL;
7447
ret->get_chunk = mysqlnd_mempool_get_chunk;
75-
ret->free_chunk = mysqlnd_mempool_free_chunk;
7648
DBG_RETURN(ret);
7749
}
7850
/* }}} */
@@ -109,7 +81,6 @@ mysqlnd_mempool_restore_state(MYSQLND_MEMORY_POOL * pool)
10981
#endif
11082
if (pool->checkpoint) {
11183
zend_arena_release(&pool->arena, pool->checkpoint);
112-
pool->last = NULL;
11384
pool->checkpoint = NULL;
11485
}
11586
DBG_VOID_RETURN;

ext/mysqlnd/mysqlnd_structs.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,11 +51,9 @@ typedef struct st_mysqlnd_memory_pool MYSQLND_MEMORY_POOL;
5151
struct st_mysqlnd_memory_pool
5252
{
5353
zend_arena *arena;
54-
void *last;
5554
void *checkpoint;
5655

5756
void* (*get_chunk)(MYSQLND_MEMORY_POOL * pool, size_t size);
58-
void (*free_chunk)(MYSQLND_MEMORY_POOL * pool, void * ptr);
5957
};
6058

6159

ext/mysqlnd/mysqlnd_wireprotocol.c

Lines changed: 1 addition & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1416,10 +1416,6 @@ php_mysqlnd_read_row_ex(MYSQLND_PFC * pfc,
14161416
set_packet_error(error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE, mysqlnd_server_gone);
14171417
}
14181418
}
1419-
if (ret == FAIL && buffer->ptr) {
1420-
pool->free_chunk(pool, buffer->ptr);
1421-
buffer->ptr = NULL;
1422-
}
14231419
DBG_RETURN(ret);
14241420
}
14251421
/* }}} */
@@ -1733,23 +1729,6 @@ php_mysqlnd_rowp_read(MYSQLND_CONN_DATA * conn, void * _packet)
17331729
/* }}} */
17341730

17351731

1736-
/* {{{ php_mysqlnd_rowp_free_mem */
1737-
static void
1738-
php_mysqlnd_rowp_free_mem(void * _packet)
1739-
{
1740-
MYSQLND_PACKET_ROW *p;
1741-
1742-
DBG_ENTER("php_mysqlnd_rowp_free_mem");
1743-
p = (MYSQLND_PACKET_ROW *) _packet;
1744-
if (p->row_buffer.ptr) {
1745-
p->result_set_memory_pool->free_chunk(p->result_set_memory_pool, p->row_buffer.ptr);
1746-
p->row_buffer.ptr = NULL;
1747-
}
1748-
DBG_VOID_RETURN;
1749-
}
1750-
/* }}} */
1751-
1752-
17531732
/* {{{ php_mysqlnd_stats_read */
17541733
static enum_func_status
17551734
php_mysqlnd_stats_read(MYSQLND_CONN_DATA * conn, void * _packet)
@@ -2196,7 +2175,7 @@ mysqlnd_packet_methods packet_methods[PROT_LAST] =
21962175
{
21972176
php_mysqlnd_rowp_read, /* read */
21982177
NULL, /* write */
2199-
php_mysqlnd_rowp_free_mem,
2178+
NULL,
22002179
}, /* PROT_ROW_PACKET */
22012180
{
22022181
php_mysqlnd_stats_read, /* read */

0 commit comments

Comments
 (0)