From 334b8c5899c5b3afed0f28b1d2c831d26bb860b4 Mon Sep 17 00:00:00 2001 From: Joerg Wunsch Date: Thu, 7 Mar 2024 22:46:13 +0100 Subject: [PATCH] Protect AVRMEM* and AVRPART* typemaps agains NULL pointers Some library functions might return AVRMEM* and AVRPART* as NULL pointers. Prevent them from being dereferenced, and return a Python None object instead. --- src/libavrdude.i | 48 ++++++++++++++++++++++++++++-------------------- 1 file changed, 28 insertions(+), 20 deletions(-) diff --git a/src/libavrdude.i b/src/libavrdude.i index 0c645aa6..560dabe0 100644 --- a/src/libavrdude.i +++ b/src/libavrdude.i @@ -68,29 +68,37 @@ typedef struct avrmem AVRMEM; // needed there. %typemap(out) AVRPART* { - PyObject* dict = PyDict_New(); - PyDict_SetItem(dict, PyUnicode_FromString("desc"), - PyUnicode_FromString($1->desc)); - PyDict_SetItem(dict, PyUnicode_FromString("id"), - PyUnicode_FromString($1->id)); - PyDict_SetItem(dict, PyUnicode_FromString("signature"), - PyBytes_FromStringAndSize((const char *)($1->signature), 3)); - PyDict_SetItem(dict, PyUnicode_FromString("mem"), - SWIG_NewPointerObj($1->mem, SWIGTYPE_p_avrmem, 0)); - $result = dict; + if ($1 == NULL) { + $result = Py_None; + } else { + PyObject* dict = PyDict_New(); + PyDict_SetItem(dict, PyUnicode_FromString("desc"), + PyUnicode_FromString($1->desc)); + PyDict_SetItem(dict, PyUnicode_FromString("id"), + PyUnicode_FromString($1->id)); + PyDict_SetItem(dict, PyUnicode_FromString("signature"), + PyBytes_FromStringAndSize((const char *)($1->signature), 3)); + PyDict_SetItem(dict, PyUnicode_FromString("mem"), + SWIG_NewPointerObj($1->mem, SWIGTYPE_p_avrmem, 0)); + $result = dict; + } } %typemap(out) AVRMEM* { - PyObject* dict = PyDict_New(); - PyDict_SetItem(dict, PyUnicode_FromString("desc"), - PyUnicode_FromString($1->desc)); - PyDict_SetItem(dict, PyUnicode_FromString("paged"), - PyBool_FromLong($1->paged)); - PyDict_SetItem(dict, PyUnicode_FromString("size"), - PyLong_FromLong($1->size)); - PyDict_SetItem(dict, PyUnicode_FromString("page_size"), - PyLong_FromLong($1->page_size)); - $result = dict; + if ($1 == NULL) { + $result = Py_None; + } else { + PyObject* dict = PyDict_New(); + PyDict_SetItem(dict, PyUnicode_FromString("desc"), + PyUnicode_FromString($1->desc)); + PyDict_SetItem(dict, PyUnicode_FromString("paged"), + PyBool_FromLong($1->paged)); + PyDict_SetItem(dict, PyUnicode_FromString("size"), + PyLong_FromLong($1->size)); + PyDict_SetItem(dict, PyUnicode_FromString("page_size"), + PyLong_FromLong($1->page_size)); + $result = dict; + } } // Config file handling