From e3728942dcde89f4b321174dd695d7ee660143d6 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 7 Sep 2018 11:35:00 +0530 Subject: [PATCH] Fix a small memory leak when creating a new child process --- kitty/child.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/kitty/child.c b/kitty/child.c index e3c533d2a..6df761523 100644 --- a/kitty/child.c +++ b/kitty/child.c @@ -16,6 +16,7 @@ static inline char** serialize_string_tuple(PyObject *src) { Py_ssize_t sz = PyTuple_GET_SIZE(src); + char **ans = calloc(sz + 1, sizeof(char*)); if (!ans) fatal("Out of memory"); for (Py_ssize_t i = 0; i < sz; i++) { @@ -28,6 +29,13 @@ serialize_string_tuple(PyObject *src) { return ans; } +static inline void +free_string_tuple(char** data) { + size_t i = 0; + while(data[i++]) free(data[i-1]); + free(data); +} + extern char **environ; static inline void @@ -125,8 +133,8 @@ spawn(PyObject *self UNUSED, PyObject *args) { break; } #undef exit_on_err - free(argv); - free(env); + free_string_tuple(argv); + free_string_tuple(env); if (PyErr_Occurred()) return NULL; return PyLong_FromLong(pid); }