summaryrefslogtreecommitdiff
path: root/python
diff options
context:
space:
mode:
authorArend van Spriel <arend@broadcom.com>2013-09-30 10:21:46 +0200
committerThomas Graf <tgraf@suug.ch>2013-10-07 09:45:56 +0200
commitae7f8cc988d9d5abfaf1639c218e450d015e2ad0 (patch)
treec012b1896032bbaa1d58e25ca48b9846637dca48 /python
parentb9284bcded445a7d245a9c92ffcf3f94d549b621 (diff)
downloadlibnl-ae7f8cc988d9d5abfaf1639c218e450d015e2ad0.tar.gz
python: remove use of PyArg_ParseTuple() for callback result
The message receive callback handler in the netlink api processes the result object from the python callback. It used PyArg_ParseTuple() to get the value, but this does not work as intended (see ref [1]). Instead check the type and convert it accordingly. refs: [1] http://stackoverflow.com/questions/13636711/what-is-the-proper-usage-of-pyarg-parsetuple Reported-by: Teto <mattator@gmail.com> Signed-off-by: Arend van Spriel <arend@broadcom.com> Signed-off-by: Thomas Graf <tgraf@suug.ch>
Diffstat (limited to 'python')
-rw-r--r--python/examples/wiphy.py2
-rw-r--r--python/netlink/capi.i27
2 files changed, 17 insertions, 12 deletions
diff --git a/python/examples/wiphy.py b/python/examples/wiphy.py
index fc222052..73e2d4dc 100644
--- a/python/examples/wiphy.py
+++ b/python/examples/wiphy.py
@@ -127,7 +127,7 @@ try:
family = genl.genl_ctrl_resolve(s, 'nl80211')
m = nl.nlmsg_alloc()
genl.genlmsg_put(m, 0, 0, family, 0, 0, nl80211.NL80211_CMD_GET_WIPHY, 0)
- nl.nla_put_u32(m, nl80211.NL80211_ATTR_WIPHY, 0)
+ nl.nla_put_u32(m, nl80211.NL80211_ATTR_WIPHY, 7)
err = nl.nl_send_auto_complete(s, m);
if err < 0:
diff --git a/python/netlink/capi.i b/python/netlink/capi.i
index 1e13d46f..e5d8a536 100644
--- a/python/netlink/capi.i
+++ b/python/netlink/capi.i
@@ -599,8 +599,10 @@ static int nl_recv_msg_handler(struct nl_msg *msg, void *arg)
PyObject *funcobj;
int result;
- if (!cbd)
- return NL_STOP;
+ if (!cbd) {
+ result = NL_STOP;
+ goto done;
+ }
msgobj = SWIG_NewPointerObj(SWIG_as_voidptr(msg),
SWIGTYPE_p_nl_msg, 0 | 0 );
/* add selfobj if callback is a method */
@@ -618,11 +620,13 @@ static int nl_recv_msg_handler(struct nl_msg *msg, void *arg)
}
resobj = PyObject_CallObject(funcobj, cbparobj);
Py_DECREF(cbparobj);
- if (resobj == NULL)
- return NL_STOP;
- if (!PyArg_ParseTuple(resobj, "i:nl_recv_msg_handler", &result))
+ if (resobj && PyInt_Check(resobj))
+ result = (int)PyInt_AsLong(resobj);
+ else
result = NL_STOP;
- Py_DECREF(resobj);
+ Py_XDECREF(resobj);
+done:
+ pynl_dbg("result=%d\n", result);
return result;
}
@@ -652,11 +656,12 @@ static int nl_recv_err_handler(struct sockaddr_nl *nla, struct nlmsgerr *err,
}
resobj = PyObject_CallObject(funcobj, cbparobj);
Py_DECREF(cbparobj);
- if (resobj == NULL)
- return NL_STOP;
- result = (int)PyInt_AsLong(resobj);
- Py_DECREF(resobj);
- printf("error: err=%d ret=%d\n", err->error, result);
+ if (resobj && PyInt_Check(resobj))
+ result = (int)PyInt_AsLong(resobj);
+ else
+ result = NL_STOP;
+ Py_XDECREF(resobj);
+ pynl_dbg("error: err=%d ret=%d\n", err->error, result);
return result;
}