From 7b9f5144f95837c62e4a133e3b9eaf9b05989f7e Mon Sep 17 00:00:00 2001 From: krangelov Date: Tue, 31 Aug 2021 18:38:17 +0200 Subject: [PATCH] functionsByCat now supports strings containing \0 --- src/runtime/python/pypgf.c | 30 ++++++++++++------------------ 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/src/runtime/python/pypgf.c b/src/runtime/python/pypgf.c index 931f20d3b..d0b2998be 100644 --- a/src/runtime/python/pypgf.c +++ b/src/runtime/python/pypgf.c @@ -2866,7 +2866,9 @@ static PyObject* PGF_getAbstractName(PGFObject *self, void *closure) { PgfText* txt = pgf_abstract_name(self->pgf); - return PyString_FromStringAndSize(txt->text, txt->size); + PyObject *name = PyString_FromStringAndSize(txt->text, txt->size); + free(txt); + return name; } // static void @@ -2967,16 +2969,13 @@ pgf_collect_cats(PgfItor* fn, PgfText* key, void* value, PgfExn *err) py_name = PyString_FromStringAndSize(name->text, name->size); if (py_name == NULL) { err->type = PGF_EXN_OTHER_ERROR; - goto end; + return; } if (PyList_Append((PyObject*) clo->collection, py_name) != 0) { err->type = PGF_EXN_OTHER_ERROR; - goto end; + Py_DECREF(py_name); } - -end: - Py_XDECREF(py_name); } static PyObject* @@ -3028,16 +3027,12 @@ pgf_collect_funs(PgfItor* fn, PgfText* key, void* value, PgfExn *err) py_name = PyString_FromStringAndSize(name->text, name->size); if (py_name == NULL) { err->type = PGF_EXN_OTHER_ERROR; - goto end; } if (PyList_Append((PyObject*) clo->collection, py_name) != 0) { err->type = PGF_EXN_OTHER_ERROR; - goto end; + Py_DECREF(py_name); } - -end: - Py_XDECREF(py_name); } static PyObject* @@ -3061,15 +3056,14 @@ PGF_getFunctions(PGFObject *self, void *closure) static PyObject* PGF_functionsByCat(PGFObject* self, PyObject *args) { - const char* c; - if (!PyArg_ParseTuple(args, "s", &c)) + const char* s; + Py_ssize_t size; + if (!PyArg_ParseTuple(args, "s#", &s, &size)) return NULL; - const size_t s = strlen(c); - - PgfText* catname = (PgfText*) alloca(sizeof(PgfText)+s); - strcpy(catname->text, c); - catname->size = s; + PgfText* catname = (PgfText*) alloca(sizeof(PgfText)+size+1); + memcpy(catname->text, s, size+1); + catname->size = size; PyObject* functions = PyList_New(0); if (functions == NULL) {