From: Nikita Popov Date: Tue, 23 Feb 2021 10:46:34 +0000 (+0100) Subject: Remove free_chunk API X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=771b0bd1df4d6e5c38001c6309a5064846e7d326;p=php 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. --- diff --git a/ext/mysqlnd/mysqlnd_block_alloc.c b/ext/mysqlnd/mysqlnd_block_alloc.c index 9ff96d0374..5c80ad028b 100644 --- a/ext/mysqlnd/mysqlnd_block_alloc.c +++ b/ext/mysqlnd/mysqlnd_block_alloc.c @@ -22,38 +22,12 @@ #include "mysqlnd_debug.h" #include "mysqlnd_priv.h" -/* {{{ mysqlnd_mempool_free_chunk */ -static void -mysqlnd_mempool_free_chunk(MYSQLND_MEMORY_POOL * pool, void * ptr) -{ - DBG_ENTER("mysqlnd_mempool_free_chunk"); - /* Try to back-off and guess if this is the last block allocated */ -#ifndef ZEND_TRACK_ARENA_ALLOC - if (ptr == pool->last) { - /* - This was the last allocation. Lucky us, we can free - a bit of memory from the pool. Next time we will return from the same ptr. - */ - pool->arena->ptr = (char*)ptr; - pool->last = NULL; - } -#endif - DBG_VOID_RETURN; -} -/* }}} */ - - /* {{{ mysqlnd_mempool_get_chunk */ static void * mysqlnd_mempool_get_chunk(MYSQLND_MEMORY_POOL * pool, size_t size) { - void *ptr = NULL; DBG_ENTER("mysqlnd_mempool_get_chunk"); - - ptr = zend_arena_alloc(&pool->arena, size); - pool->last = ptr; - - DBG_RETURN(ptr); + DBG_RETURN(zend_arena_alloc(&pool->arena, size)); } /* }}} */ @@ -69,10 +43,8 @@ mysqlnd_mempool_create(size_t arena_size) arena = zend_arena_create(MAX(arena_size, ZEND_MM_ALIGNED_SIZE(sizeof(zend_arena)))); ret = zend_arena_alloc(&arena, sizeof(MYSQLND_MEMORY_POOL)); ret->arena = arena; - ret->last = NULL; ret->checkpoint = NULL; ret->get_chunk = mysqlnd_mempool_get_chunk; - ret->free_chunk = mysqlnd_mempool_free_chunk; DBG_RETURN(ret); } /* }}} */ @@ -109,7 +81,6 @@ mysqlnd_mempool_restore_state(MYSQLND_MEMORY_POOL * pool) #endif if (pool->checkpoint) { zend_arena_release(&pool->arena, pool->checkpoint); - pool->last = NULL; pool->checkpoint = NULL; } DBG_VOID_RETURN; diff --git a/ext/mysqlnd/mysqlnd_structs.h b/ext/mysqlnd/mysqlnd_structs.h index 3a9b1fb340..7929cc1153 100644 --- a/ext/mysqlnd/mysqlnd_structs.h +++ b/ext/mysqlnd/mysqlnd_structs.h @@ -51,11 +51,9 @@ typedef struct st_mysqlnd_memory_pool MYSQLND_MEMORY_POOL; struct st_mysqlnd_memory_pool { zend_arena *arena; - void *last; void *checkpoint; void* (*get_chunk)(MYSQLND_MEMORY_POOL * pool, size_t size); - void (*free_chunk)(MYSQLND_MEMORY_POOL * pool, void * ptr); }; diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c index c345e5d7ec..635ef3f6e8 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.c +++ b/ext/mysqlnd/mysqlnd_wireprotocol.c @@ -1416,10 +1416,6 @@ php_mysqlnd_read_row_ex(MYSQLND_PFC * pfc, set_packet_error(error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE, mysqlnd_server_gone); } } - if (ret == FAIL && buffer->ptr) { - pool->free_chunk(pool, buffer->ptr); - buffer->ptr = NULL; - } DBG_RETURN(ret); } /* }}} */ @@ -1733,23 +1729,6 @@ end: /* }}} */ -/* {{{ php_mysqlnd_rowp_free_mem */ -static void -php_mysqlnd_rowp_free_mem(void * _packet) -{ - MYSQLND_PACKET_ROW *p; - - DBG_ENTER("php_mysqlnd_rowp_free_mem"); - p = (MYSQLND_PACKET_ROW *) _packet; - if (p->row_buffer.ptr) { - p->result_set_memory_pool->free_chunk(p->result_set_memory_pool, p->row_buffer.ptr); - p->row_buffer.ptr = NULL; - } - DBG_VOID_RETURN; -} -/* }}} */ - - /* {{{ php_mysqlnd_stats_read */ static enum_func_status php_mysqlnd_stats_read(MYSQLND_CONN_DATA * conn, void * _packet) @@ -2196,7 +2175,7 @@ mysqlnd_packet_methods packet_methods[PROT_LAST] = { php_mysqlnd_rowp_read, /* read */ NULL, /* write */ - php_mysqlnd_rowp_free_mem, + NULL, }, /* PROT_ROW_PACKET */ { php_mysqlnd_stats_read, /* read */