diff options
author | Tim Potter <tpot@samba.org> | 2004-06-27 12:01:03 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 12:56:47 -0500 |
commit | 638d3324952f44d97229cbd05bcfd58bc9ee2dc9 (patch) | |
tree | ae537716d551ffe53e384aa6cff3f294f571cc4c /source4/librpc/ndr/ndr.c | |
parent | 37fcf2236433bc5e74f19d2afac3d1d0055dcd01 (diff) | |
download | samba-638d3324952f44d97229cbd05bcfd58bc9ee2dc9.tar.gz samba-638d3324952f44d97229cbd05bcfd58bc9ee2dc9.tar.bz2 samba-638d3324952f44d97229cbd05bcfd58bc9ee2dc9.zip |
r1269: Add a 'base' field to the ndr_ofs_list structure which is the base to
which the offset applies to. In an array of structures containing
relative members, the offset applies to the start of the array element
being marshalled. Previously, there was no way to access the relevant
structure start as by the time we have hit buffers, the head of the
offset list will be the last structure being marshalled.
Interestingly enough, this makes relstrs go away. I think we thought
they were a special case in samba 3 but it turns out they are just
regular relative elements in the idl. This makes spoolss a lot simpler
than I thought it would be.
I've run the samr and lsa tests and this doesn't seem to break anything.
It looks like security descriptors are the only structures that contain
relative members.
Oh yeah, this will probably require a 'make clean && make' otherwise you
will get bizzare errors.
(This used to be commit d379dcdfd5f41e7cf7668354c3011b8ace190953)
Diffstat (limited to 'source4/librpc/ndr/ndr.c')
-rw-r--r-- | source4/librpc/ndr/ndr.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/source4/librpc/ndr/ndr.c b/source4/librpc/ndr/ndr.c index a3a2df3f59..6b89cb4cd2 100644 --- a/source4/librpc/ndr/ndr.c +++ b/source4/librpc/ndr/ndr.c @@ -608,6 +608,7 @@ NTSTATUS ndr_pull_struct_start(struct ndr_pull *ndr) NDR_ALLOC(ndr, ofs); ofs->offset = ndr->offset; ofs->next = ndr->ofs_list; + ofs->base = 0; ndr->ofs_list = ofs; return NT_STATUS_OK; } @@ -629,6 +630,7 @@ NTSTATUS ndr_push_struct_start(struct ndr_push *ndr) NDR_PUSH_ALLOC(ndr, ofs); ofs->offset = ndr->offset; ofs->next = ndr->ofs_list; + ofs->base = 0; ndr->ofs_list = ofs; return NT_STATUS_OK; } @@ -688,6 +690,7 @@ NTSTATUS ndr_push_relative(struct ndr_push *ndr, int ndr_flags, const void *p, NDR_PUSH_ALLOC(ndr, ofs); NDR_CHECK(ndr_push_align(ndr, 4)); ofs->offset = ndr->offset; + ofs->base = ndr->ofs_list->offset; NDR_CHECK(ndr_push_uint32(ndr, 0xFFFFFFFF)); ofs->next = NULL; if (ndr->relative_list_end) { @@ -713,7 +716,7 @@ NTSTATUS ndr_push_relative(struct ndr_push *ndr, int ndr_flags, const void *p, NDR_CHECK(ndr_push_align(ndr, 4)); ndr_push_save(ndr, &save); ndr->offset = ofs->offset; - NDR_CHECK(ndr_push_uint32(ndr, save.offset - ndr->ofs_list->offset)); + NDR_CHECK(ndr_push_uint32(ndr, save.offset - ofs->base)); ndr_push_restore(ndr, &save); NDR_CHECK(fn(ndr, NDR_SCALARS|NDR_BUFFERS, p)); } |