From 2c388dabd2bd5b405e4cb21780a3abcba53ce873 Mon Sep 17 00:00:00 2001 From: Kefu Chai Date: Fri, 18 Jun 2021 21:26:25 +0800 Subject: [PATCH] mgr/PyOSDMap: check parameter in constructor * instead abort(), just return a failure, if the input parameter is missing * set a TypeError if the input parameter's type is not expected a typical session looks like: [mgr self-test eval] >>> osdmap = OSDMap() Traceback (most recent call last): File "", line 1, in TypeError: function missing required argument 'osdmap_capsule' (pos 1) [mgr self-test eval] >>> osdmap = OSDMap(1) Traceback (most recent call last): File "", line 1, in TypeError: BasePyOSDMap.__init__() requires a PyCapsule_Type not int Signed-off-by: Kefu Chai --- src/mgr/PyOSDMap.cc | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/mgr/PyOSDMap.cc b/src/mgr/PyOSDMap.cc index 70813ca52877..44be8e9423ce 100644 --- a/src/mgr/PyOSDMap.cc +++ b/src/mgr/PyOSDMap.cc @@ -191,13 +191,17 @@ BasePyOSDMap_init(BasePyOSDMap *self, PyObject *args, PyObject *kwds) PyObject *osdmap_capsule = nullptr; static const char *kwlist[] = {"osdmap_capsule", NULL}; - if (! PyArg_ParseTupleAndKeywords(args, kwds, "O", - const_cast(kwlist), - &osdmap_capsule)) { - ceph_abort(); + if (!PyArg_ParseTupleAndKeywords(args, kwds, "O", + const_cast(kwlist), + &osdmap_capsule)) { + return -1; + } + if (!PyObject_TypeCheck(osdmap_capsule, &PyCapsule_Type)) { + PyErr_Format(PyExc_TypeError, + "Expected a PyCapsule_Type, not %s", + Py_TYPE(osdmap_capsule)->tp_name); return -1; } - ceph_assert(PyObject_TypeCheck(osdmap_capsule, &PyCapsule_Type)); self->osdmap = (OSDMap*)PyCapsule_GetPointer( osdmap_capsule, nullptr); -- 2.47.3