mirror of
https://github.com/postgres/postgres.git
synced 2025-07-15 19:21:59 +03:00
Fix memory leaks in PL/Python.
Previously, plpython was in the habit of allocating a lot of stuff in TopMemoryContext, and it was very slipshod about making sure that stuff got cleaned up; in particular, use of TopMemoryContext as fn_mcxt for function calls represents an unfixable leak, since we generally don't know what the called function might have allocated in fn_mcxt. This results in session-lifespan leakage in certain usage scenarios, as for example in a case reported by Ed Behn back in July. To fix, get rid of all the retail allocations in TopMemoryContext. All long-lived allocations are now made in sub-contexts that are associated with specific objects (either pl/python procedures, or Python-visible objects such as cursors and plans). We can clean these up when the associated object is deleted. I went so far as to get rid of PLy_malloc completely. There were a couple of places where it could still have been used safely, but on the whole it was just an invitation to bad coding. Haribabu Kommi, based on a draft patch by Heikki Linnakangas; some further work by me
This commit is contained in:
@ -17,42 +17,6 @@
|
||||
#include "plpy_elog.h"
|
||||
|
||||
|
||||
void *
|
||||
PLy_malloc(size_t bytes)
|
||||
{
|
||||
/* We need our allocations to be long-lived, so use TopMemoryContext */
|
||||
return MemoryContextAlloc(TopMemoryContext, bytes);
|
||||
}
|
||||
|
||||
void *
|
||||
PLy_malloc0(size_t bytes)
|
||||
{
|
||||
void *ptr = PLy_malloc(bytes);
|
||||
|
||||
MemSet(ptr, 0, bytes);
|
||||
return ptr;
|
||||
}
|
||||
|
||||
char *
|
||||
PLy_strdup(const char *str)
|
||||
{
|
||||
char *result;
|
||||
size_t len;
|
||||
|
||||
len = strlen(str) + 1;
|
||||
result = PLy_malloc(len);
|
||||
memcpy(result, str, len);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/* define this away */
|
||||
void
|
||||
PLy_free(void *ptr)
|
||||
{
|
||||
pfree(ptr);
|
||||
}
|
||||
|
||||
/*
|
||||
* Convert a Python unicode object to a Python string/bytes object in
|
||||
* PostgreSQL server encoding. Reference ownership is passed to the
|
||||
|
Reference in New Issue
Block a user