From 36630235d80d0746c29b8bd556aa3e3b3c39ede3 Mon Sep 17 00:00:00 2001 From: Dries De Maesschalck Date: Thu, 20 Feb 2020 09:31:35 +0100 Subject: [PATCH 1/3] (PyKDL) Prevent segfault when asking for nonexisting segment in chain --- python_orocos_kdl/PyKDL/kinfam.sip | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/python_orocos_kdl/PyKDL/kinfam.sip b/python_orocos_kdl/PyKDL/kinfam.sip index f66eba8ef..ed4ee2f3c 100644 --- a/python_orocos_kdl/PyKDL/kinfam.sip +++ b/python_orocos_kdl/PyKDL/kinfam.sip @@ -251,8 +251,15 @@ public: unsigned int getNrOfJoints()const; unsigned int getNrOfSegments()const; - - const Segment& getSegment(unsigned int nr)const /Factory/; + + const Segment* getSegment(unsigned int nr)const /Factory/; +%MethodCode + if (a0 < 0 || a0 >= (unsigned int)sipCpp->getNrOfSegments()) { + PyErr_SetString(PyExc_IndexError, "Chain index out of range"); + return 0; + } + sipRes = &(sipCpp->getSegment(a0)); +%End }; From 8698e7094578f2a57d591e4ee34a70e8787ae54e Mon Sep 17 00:00:00 2001 From: Matthijs van der Burgh Date: Fri, 7 Aug 2020 23:13:31 +0200 Subject: [PATCH 2/3] (PyKDL) throw index error in getSegment --- python_orocos_kdl/PyKDL/pybind11/kinfam.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/python_orocos_kdl/PyKDL/pybind11/kinfam.cpp b/python_orocos_kdl/PyKDL/pybind11/kinfam.cpp index b99515e6c..36b3ef261 100644 --- a/python_orocos_kdl/PyKDL/pybind11/kinfam.cpp +++ b/python_orocos_kdl/PyKDL/pybind11/kinfam.cpp @@ -175,8 +175,12 @@ void init_kinfam(pybind11::module &m) chain.def("addChain", &Chain::addChain); chain.def("getNrOfJoints", &Chain::getNrOfJoints); chain.def("getNrOfSegments", &Chain::getNrOfSegments); - chain.def("getSegment", (Segment& (Chain::*)(unsigned int)) &Chain::getSegment); - chain.def("getSegment", (const Segment& (Chain::*)(unsigned int) const) &Chain::getSegment); + chain.def("getSegment", [](const Chain &c, unsigned int nr) + { + if (nr >= c.getNrOfSegments()) + throw py::index_error("Chain index out of range"); + return c.getSegment(nr); + }); chain.def("__repr__", [](const Chain &c) { std::ostringstream oss; From 114bad42084b3efbf0170a3e76e6269f9822f12c Mon Sep 17 00:00:00 2001 From: Matthijs van der Burgh Date: Fri, 7 Aug 2020 23:34:02 +0200 Subject: [PATCH 3/3] (PyKDL)(sip) fix getSegments --- python_orocos_kdl/PyKDL/sip/kinfam.sip | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/python_orocos_kdl/PyKDL/sip/kinfam.sip b/python_orocos_kdl/PyKDL/sip/kinfam.sip index 83cffba19..3df44ef2b 100644 --- a/python_orocos_kdl/PyKDL/sip/kinfam.sip +++ b/python_orocos_kdl/PyKDL/sip/kinfam.sip @@ -177,13 +177,15 @@ public: unsigned int getNrOfJoints()const; unsigned int getNrOfSegments()const; - const Segment* getSegment(unsigned int nr)const /Factory/; + Segment& getSegment(unsigned int nr); %MethodCode - if (a0 < 0 || a0 >= (unsigned int)sipCpp->getNrOfSegments()) { + if (a0 < 0 || a0 >= sipCpp->getNrOfSegments()) { PyErr_SetString(PyExc_IndexError, "Chain index out of range"); - return 0; + sipError = sipErrorFail; + } + else { + sipRes = &(sipCpp->getSegment(a0)); } - sipRes = &(sipCpp->getSegment(a0)); %End const std::string* __repr__() const;