s4/messaging/py: Add more helpful error message for a wrongly-sized tuple
authorJoseph Sutton <josephsutton@catalyst.net.nz>
Fri, 19 May 2023 00:54:11 +0000 (12:54 +1200)
committerAndrew Bartlett <abartlet@samba.org>
Wed, 24 May 2023 00:50:31 +0000 (00:50 +0000)
>>> m = Messaging((1,2,3,4,5))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: function takes exactly 1 argument (5 given)

Signed-off-by: Joseph Sutton <josephsutton@catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
source4/lib/messaging/pymessaging.c

index 4ab6a4baf03d229fa503ae8ba7e8dfcd3eca2966..203f2d14a834457ea389241312150cb8949d7731 100644 (file)
@@ -42,6 +42,8 @@ extern PyTypeObject imessaging_Type;
 
 static bool server_id_from_py(PyObject *object, struct server_id *server_id)
 {
+       Py_ssize_t tuple_size;
+
        if (!PyTuple_Check(object)) {
                if (!py_check_dcerpc_type(object, "samba.dcerpc.server_id", "server_id")) {
 
@@ -51,7 +53,9 @@ static bool server_id_from_py(PyObject *object, struct server_id *server_id)
                *server_id = *pytalloc_get_type(object, struct server_id);
                return true;
        }
-       if (PyTuple_Size(object) == 3) {
+
+       tuple_size = PyTuple_Size(object);
+       if (tuple_size == 3) {
                unsigned long long pid;
                int task_id, vnn;
 
@@ -62,20 +66,23 @@ static bool server_id_from_py(PyObject *object, struct server_id *server_id)
                server_id->task_id = task_id;
                server_id->vnn = vnn;
                return true;
-       } else if (PyTuple_Size(object) == 2) {
+       } else if (tuple_size == 2) {
                unsigned long long pid;
                int task_id;
                if (!PyArg_ParseTuple(object, "Ki", &pid, &task_id))
                        return false;
                *server_id = cluster_id(pid, task_id);
                return true;
-       } else {
+       } else if (tuple_size == 1) {
                unsigned long long pid = getpid();
                int task_id;
                if (!PyArg_ParseTuple(object, "i", &task_id))
                        return false;
                *server_id = cluster_id(pid, task_id);
                return true;
+       } else {
+               PyErr_SetString(PyExc_ValueError, "Expected tuple containing one, two, or three elements");
+               return false;
        }
 }