]> git.ipfire.org Git - pakfire.git/commitdiff
python: Pakfire.execute(): Fix parsing some arguments
authorMichael Tremer <michael.tremer@ipfire.org>
Fri, 26 Jan 2024 18:55:14 +0000 (18:55 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Fri, 26 Jan 2024 18:55:14 +0000 (18:55 +0000)
There have been a couple of problems here when no or invalid values have
been passed.

Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/_pakfire/pakfire.c

index 16b745a7258194e59f02c9dcb826f4357f92fb39..a5a45e54736c2b1fbe2091579f716879800a9555 100644 (file)
@@ -500,7 +500,7 @@ static PyObject* Pakfire_execute(PakfireObject* self, PyObject* args, PyObject*
 
                if (!PyUnicode_Check(item)) {
                        PyErr_Format(PyExc_TypeError, "Item %u in command is not a string", i);
-                       return NULL;
+                       goto ERROR;
                }
 
                // Copy to argv
@@ -526,12 +526,6 @@ static PyObject* Pakfire_execute(PakfireObject* self, PyObject* args, PyObject*
                goto ERROR;
        }
 
-       // Check callback
-       if (callback && !PyCallable_Check(callback)) {
-               PyErr_SetString(PyExc_TypeError, "callback must be callable\n");
-               goto ERROR;
-       }
-
        // Set nice
        if (nice) {
                r = pakfire_jail_nice(jail, nice);
@@ -569,32 +563,34 @@ static PyObject* Pakfire_execute(PakfireObject* self, PyObject* args, PyObject*
                }
        }
 
-       const Py_ssize_t num_bind = PySequence_Length(bind);
-
        // Bind
-       for (unsigned int i = 0; i < num_bind; i++) {
-               PyObject* b = PySequence_ITEM(bind, i);
-               if (!b)
-                       goto ERROR;
+       if (bind && PySequence_Check(bind)) {
+               const Py_ssize_t num_bind = PySequence_Length(bind);
 
-               // Check if this is a Unicode object
-               if (!PyUnicode_Check(b)) {
-                       PyErr_SetString(PyExc_ValueError, "bind contains a non-Unicode object");
-                       Py_DECREF(b);
-                       goto ERROR;
-               }
+               for (unsigned int i = 0; i < num_bind; i++) {
+                       PyObject* b = PySequence_ITEM(bind, i);
+                       if (!b)
+                               goto ERROR;
 
-               const char* path = PyUnicode_AsUTF8(b);
+                       // Check if this is a Unicode object
+                       if (!PyUnicode_Check(b)) {
+                               PyErr_SetString(PyExc_ValueError, "bind contains a non-Unicode object");
+                               Py_DECREF(b);
+                               goto ERROR;
+                       }
+
+                       const char* path = PyUnicode_AsUTF8(b);
+
+                       // Perform bind
+                       r = pakfire_jail_bind(jail, path, path, 0);
+                       if (r) {
+                               PyErr_SetFromErrno(PyExc_OSError);
+                               Py_DECREF(b);
+                               goto ERROR;
+                       }
 
-               // Perform bind
-               r = pakfire_jail_bind(jail, path, path, 0);
-               if (r) {
-                       PyErr_SetFromErrno(PyExc_OSError);
                        Py_DECREF(b);
-                       goto ERROR;
                }
-
-               Py_DECREF(b);
        }
 
        Py_BEGIN_ALLOW_THREADS