]> granicus.if.org Git - php/commitdiff
Remove free_chunk API
authorNikita Popov <nikita.ppv@gmail.com>
Tue, 23 Feb 2021 10:46:34 +0000 (11:46 +0100)
committerNikita Popov <nikita.ppv@gmail.com>
Tue, 23 Feb 2021 10:46:34 +0000 (11:46 +0100)
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.

ext/mysqlnd/mysqlnd_block_alloc.c
ext/mysqlnd/mysqlnd_structs.h
ext/mysqlnd/mysqlnd_wireprotocol.c

index 9ff96d0374e523722106d06fb9dac4c33fac3dfc..5c80ad028b070feb5f3fabd31e01a42562aaba1f 100644 (file)
 #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;
index 3a9b1fb3400bd6b31b2947aad49de78ec1bf1fcb..7929cc1153d9c5c30da5c94e7e1d6e8f5f340156 100644 (file)
@@ -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);
 };
 
 
index c345e5d7ec2b9350505534ec195d1ffa06f31873..635ef3f6e871295e188cc98a43606108afc6e558 100644 (file)
@@ -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 */