summaryrefslogtreecommitdiff
path: root/source4/librpc/ndr/ndr.c
diff options
context:
space:
mode:
authorTim Potter <tpot@samba.org>2004-06-27 12:01:03 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 12:56:47 -0500
commit638d3324952f44d97229cbd05bcfd58bc9ee2dc9 (patch)
treeae537716d551ffe53e384aa6cff3f294f571cc4c /source4/librpc/ndr/ndr.c
parent37fcf2236433bc5e74f19d2afac3d1d0055dcd01 (diff)
downloadsamba-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.c5
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));
}