pidl: Fix array range checks in python output
authorVolker Lendecke <vl@samba.org>
Tue, 20 Jun 2017 13:31:18 +0000 (15:31 +0200)
committerJeremy Allison <jra@samba.org>
Tue, 20 Jun 2017 16:50:06 +0000 (18:50 +0200)
Without this, we generated code like

if (ndr_table_dnsserver.num_calls < 0) {
        PyErr_SetString(PyExc_TypeError, "Internal Error, ndr_interface_call missing for py_DnssrvOperation_ndr_pack");
        return NULL;
}
call = &ndr_table_dnsserver.calls[0];

This does not really make sense, and Coverity found comparing the unsigned
num_calls against <0 a bit pointless.

Should fix 138 Coverity findings and make the code a bit more correct.

Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
pidl/lib/Parse/Pidl/Samba4/Python.pm

index 79beb2e75ed36d7825eb9be1b634abf9ba165e79..f418ac489aeace76bb60e2a875b5660f6955ba0a 100644 (file)
@@ -521,7 +521,8 @@ sub PythonFunctionStruct($$$$)
        $self->pidl("DATA_BLOB blob;");
        $self->pidl("enum ndr_err_code err;");
        $self->pidl("");
-       $self->pidl("if (ndr_table_$iface\.num_calls < $fn->{OPNUM}) {");
+       $self->pidl("if (ndr_table_$iface\.num_calls < " . ($fn->{OPNUM}+1) .
+                   ") {");
        $self->indent;
        $self->pidl("PyErr_SetString(PyExc_TypeError, \"Internal Error, ndr_interface_call missing for py_$name\_ndr_pack\");");
        $self->pidl("return NULL;");
@@ -633,7 +634,8 @@ sub PythonFunctionStruct($$$$)
        $self->pidl("struct ndr_pull *pull = NULL;");
        $self->pidl("enum ndr_err_code err;");
        $self->pidl("");
-       $self->pidl("if (ndr_table_$iface\.num_calls < $fn->{OPNUM}) {");
+       $self->pidl("if (ndr_table_$iface\.num_calls < " . ($fn->{OPNUM}+1) .
+                   ") {");
        $self->indent;
        $self->pidl("PyErr_SetString(PyExc_TypeError, \"Internal Error, ndr_interface_call missing for py_$name\_ndr_unpack\");");
        $self->pidl("return NULL;");
@@ -797,7 +799,8 @@ sub PythonFunctionStruct($$$$)
        $self->pidl("PyObject *ret;");
        $self->pidl("char *retstr;");
        $self->pidl("");
-       $self->pidl("if (ndr_table_$iface\.num_calls < $fn->{OPNUM}) {");
+       $self->pidl("if (ndr_table_$iface\.num_calls < " . ($fn->{OPNUM}+1) .
+                   ") {");
        $self->indent;
        $self->pidl("PyErr_SetString(PyExc_TypeError, \"Internal Error, ndr_interface_call missing for py_$name\_ndr_print\");");
        $self->pidl("return NULL;");