diff options
author | Andrew Bartlett <abartlet@samba.org> | 2009-02-25 17:43:07 +1100 |
---|---|---|
committer | Andrew Bartlett <abartlet@samba.org> | 2009-02-25 17:43:07 +1100 |
commit | c2cdb4ad5c9398ef0d3310613107999f8d33c7ce (patch) | |
tree | 9bf8b8a37f51b5927180b7ed8c92ee44b3337a53 /pidl/lib | |
parent | d8b70278e20b276566a3893d288101ff4826df61 (diff) | |
download | samba-c2cdb4ad5c9398ef0d3310613107999f8d33c7ce.tar.gz samba-c2cdb4ad5c9398ef0d3310613107999f8d33c7ce.tar.xz samba-c2cdb4ad5c9398ef0d3310613107999f8d33c7ce.zip |
Work around ndr_unpack failing on structures with relative pointers.
This disgusting hack works around the fact that
ndr_pull_struct_blob_all will always fail on structures with relative
pointers. So, map ndr_unpack to ndr_pull_struct_blob_all only if we
don't have any relative pointers in this structure.
Andrew Bartlett
Diffstat (limited to 'pidl/lib')
-rw-r--r-- | pidl/lib/Parse/Pidl/Samba4/Python.pm | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/pidl/lib/Parse/Pidl/Samba4/Python.pm b/pidl/lib/Parse/Pidl/Samba4/Python.pm index 48785f5b0ac..6099fe5caef 100644 --- a/pidl/lib/Parse/Pidl/Samba4/Python.pm +++ b/pidl/lib/Parse/Pidl/Samba4/Python.pm @@ -275,7 +275,24 @@ sub PythonStruct($$$$$$) $self->pidl("if (!PyArg_ParseTuple(args, \"s#:__ndr_unpack__\", &blob.data, &blob.length))"); $self->pidl("\treturn NULL;"); $self->pidl(""); - $self->pidl("err = ndr_pull_struct_blob_all(&blob, py_talloc_get_mem_ctx(py_obj), NULL, object, (ndr_pull_flags_fn_t)ndr_pull_$name);"); + + # This disgusting hack works around the fact that ndr_pull_struct_blob_all will always fail on structures with relative pointers. + # So, map ndr_unpack to ndr_pull_struct_blob_all only if we don't have any relative pointers in this + my $got_relative = 0; + if ($#{$d->{ELEMENTS}} > -1) { + foreach my $e (@{$d->{ELEMENTS}}) { + my $l = $e->{LEVELS}[0]; + if ($l->{TYPE} eq "POINTER" and ($l->{POINTER_TYPE} eq "relative")) { + $got_relative = 1; + last; + } + } + } + if ($got_relative == 0) { + $self->pidl("err = ndr_pull_struct_blob_all(&blob, py_talloc_get_mem_ctx(py_obj), NULL, object, (ndr_pull_flags_fn_t)ndr_pull_$name);"); + } else { + $self->pidl("err = ndr_pull_struct_blob(&blob, py_talloc_get_mem_ctx(py_obj), NULL, object, (ndr_pull_flags_fn_t)ndr_pull_$name);"); + } $self->pidl("if (err != NDR_ERR_SUCCESS) {"); $self->indent; $self->pidl("PyErr_SetNdrError(err);"); |