]> jfr.im git - irc/evilnet/x3.git/commitdiff
mod-python: improve error logic for pyobj_from_usernode
authorhstuart <redacted>
Tue, 6 Oct 2009 12:10:27 +0000 (12:10 +0000)
committerhstuart <redacted>
Tue, 6 Oct 2009 12:10:27 +0000 (12:10 +0000)
ChangeLog
src/mod-python.c

index 4b2b76e90e77d82a6262e5f99690d6a4c9fe9808..3799d10b725397955df91d6fcb585270cc79b003 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,10 @@
 /***********************************************************************
 X3 ChangeLog
 
+2009-10-06  Henrik Stuart <evilnet@hstuart.dk>
+
+       * src/mod-python.c: improve error logic for pyobj_from_usernode.
+
 2009-10-06  Henrik Stuart <evilnet@hstuart.dk>
 
        * src/mod-python.c: improve error logic for emb_get_servers.
index e486b359455a936f923301d37c9d505cbe2ea1aa..17c2c595bc8104aa8ff57a0c41928172ebdc294c 100644 (file)
@@ -315,16 +315,21 @@ emb_send_target_notice(UNUSED_ARG(PyObject *self), PyObject *args)
 
 static PyObject*
 pyobj_from_usernode(struct userNode* user) {
-    unsigned int n;
+    unsigned int n, i;
     struct modeNode *mn;
+    PyObject* retval = NULL;
     PyObject* pChanList = PyTuple_New(user->channels.used);
 
+    if (pChanList == NULL)
+        return NULL;
+
     for (n=0; n < user->channels.used; n++) {
         mn = user->channels.list[n];
-        PyTuple_SetItem(pChanList, n, Py_BuildValue("s", mn->channel->name));
+        if (PyTuple_SetItem(pChanList, n, Py_BuildValue("s", mn->channel->name)))
+            goto cleanup;
     }
 
-    return Py_BuildValue("{"
+    retval = Py_BuildValue("{"
             "s: s, " /* nick */
             "s: s, " /* ident */
             "s: s, " /* info */
@@ -357,6 +362,22 @@ pyobj_from_usernode(struct userNode* user) {
             "version_reply", user->version_reply,
             "account", user->handle_info ? user->handle_info->handle : NULL,
             "channels", pChanList);
+
+    if (retval == NULL)
+        goto cleanup;
+
+    return retval;
+
+cleanup:
+    Py_XDECREF(retval);
+    for (i = 0; i < n; ++i) {
+        retval = PyTuple_GetItem(pChanList, i);
+        PyTuple_SET_ITEM(pChanList, i, NULL);
+        Py_XDECREF(retval);
+    }
+    Py_DECREF(pChanList);
+
+    return NULL;
 }
 
 static PyObject*