From: Volker Lendecke Date: Tue, 20 Jun 2017 13:31:18 +0000 (+0200) Subject: pidl: Fix array range checks in python output X-Git-Tag: tevent-0.9.32~45 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=67040cf61232dd1cdcc820237919ac1e073c31c2;p=thirdparty%2Fsamba.git pidl: Fix array range checks in python output 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 Reviewed-by: Jeremy Allison --- diff --git a/pidl/lib/Parse/Pidl/Samba4/Python.pm b/pidl/lib/Parse/Pidl/Samba4/Python.pm index 79beb2e75ed..f418ac489ae 100644 --- a/pidl/lib/Parse/Pidl/Samba4/Python.pm +++ b/pidl/lib/Parse/Pidl/Samba4/Python.pm @@ -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;");