summaryrefslogtreecommitdiff
path: root/source3/librpc/gen_ndr/ndr_winreg.c
diff options
context:
space:
mode:
authorGerald Carter <jerry@samba.org>2006-09-21 17:51:06 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 12:00:57 -0500
commiteab57a0a0fe90be464f5061691f57ca1da150885 (patch)
tree86901f417c88e954f13e75a1ca060f0cf7b93b0c /source3/librpc/gen_ndr/ndr_winreg.c
parent20b9cd5354702f86572781accfd5fcb977f7f5f2 (diff)
downloadsamba-eab57a0a0fe90be464f5061691f57ca1da150885.tar.gz
samba-eab57a0a0fe90be464f5061691f57ca1da150885.tar.bz2
samba-eab57a0a0fe90be464f5061691f57ca1da150885.zip
r18789: Replace the winreg server code with the libndr parsing code.
Many things work (OpenHKLM, etc...) but some still don't. This shouldn't block anyone so I'm checking it in. Will probably move to a bzr tree after this for longer dev cycles between checkins. (This used to be commit cf1404a0d7538288b9370ba80df328f81b713ce0)
Diffstat (limited to 'source3/librpc/gen_ndr/ndr_winreg.c')
-rw-r--r--source3/librpc/gen_ndr/ndr_winreg.c166
1 files changed, 97 insertions, 69 deletions
diff --git a/source3/librpc/gen_ndr/ndr_winreg.c b/source3/librpc/gen_ndr/ndr_winreg.c
index c85aa57f02..5dd8fc49be 100644
--- a/source3/librpc/gen_ndr/ndr_winreg.c
+++ b/source3/librpc/gen_ndr/ndr_winreg.c
@@ -2281,13 +2281,14 @@ NTSTATUS ndr_push_winreg_QueryValue(struct ndr_push *ndr, int flags, const struc
if (r->in.type) {
NDR_CHECK(ndr_push_winreg_Type(ndr, NDR_SCALARS, *r->in.type));
}
- if (r->in.data == NULL) return NT_STATUS_INVALID_PARAMETER_MIX;
- NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, *r->in.size));
- NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
- NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, *r->in.length));
- for (cntr_data_1 = 0; cntr_data_1 < *r->in.length; cntr_data_1++) {
- if (r->in.data[cntr_data_1] == NULL) return NT_STATUS_INVALID_PARAMETER_MIX;
- NDR_CHECK(ndr_push_ref_ptr(ndr));
+ NDR_CHECK(ndr_push_unique_ptr(ndr, r->in.data));
+ if (r->in.data) {
+ NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, *r->in.size));
+ NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+ NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, *r->in.length));
+ for (cntr_data_1 = 0; cntr_data_1 < *r->in.length; cntr_data_1++) {
+ NDR_CHECK(ndr_push_unique_ptr(ndr, r->in.data[cntr_data_1]));
+ }
}
NDR_CHECK(ndr_push_unique_ptr(ndr, r->in.size));
if (r->in.size) {
@@ -2303,13 +2304,14 @@ NTSTATUS ndr_push_winreg_QueryValue(struct ndr_push *ndr, int flags, const struc
if (r->out.type) {
NDR_CHECK(ndr_push_winreg_Type(ndr, NDR_SCALARS, *r->out.type));
}
- if (r->out.data == NULL) return NT_STATUS_INVALID_PARAMETER_MIX;
- NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, *r->out.size));
- NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
- NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, *r->out.length));
- for (cntr_data_1 = 0; cntr_data_1 < *r->out.length; cntr_data_1++) {
- if (r->out.data[cntr_data_1] == NULL) return NT_STATUS_INVALID_PARAMETER_MIX;
- NDR_CHECK(ndr_push_ref_ptr(ndr));
+ NDR_CHECK(ndr_push_unique_ptr(ndr, r->out.data));
+ if (r->out.data) {
+ NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, *r->out.size));
+ NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+ NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, *r->out.length));
+ for (cntr_data_1 = 0; cntr_data_1 < *r->out.length; cntr_data_1++) {
+ NDR_CHECK(ndr_push_unique_ptr(ndr, r->out.data[cntr_data_1]));
+ }
}
NDR_CHECK(ndr_push_unique_ptr(ndr, r->out.size));
if (r->out.size) {
@@ -2333,6 +2335,7 @@ NTSTATUS ndr_pull_winreg_QueryValue(struct ndr_pull *ndr, int flags, struct winr
uint32_t _ptr_length;
TALLOC_CTX *_mem_save_handle_0;
TALLOC_CTX *_mem_save_type_0;
+ TALLOC_CTX *_mem_save_data_0;
TALLOC_CTX *_mem_save_data_1;
TALLOC_CTX *_mem_save_data_2;
TALLOC_CTX *_mem_save_size_0;
@@ -2360,24 +2363,34 @@ NTSTATUS ndr_pull_winreg_QueryValue(struct ndr_pull *ndr, int flags, struct winr
NDR_CHECK(ndr_pull_winreg_Type(ndr, NDR_SCALARS, r->in.type));
NDR_PULL_SET_MEM_CTX(ndr, _mem_save_type_0, 0);
}
- NDR_CHECK(ndr_pull_array_size(ndr, &r->in.data));
- NDR_CHECK(ndr_pull_array_length(ndr, &r->in.data));
- if (ndr_get_array_length(ndr, &r->in.data) > ndr_get_array_size(ndr, &r->in.data)) {
- return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->in.data), ndr_get_array_length(ndr, &r->in.data));
+ NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_data));
+ if (_ptr_data) {
+ NDR_PULL_ALLOC(ndr, r->in.data);
+ } else {
+ r->in.data = NULL;
}
- if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
+ if (r->in.data) {
+ _mem_save_data_0 = NDR_PULL_GET_MEM_CTX(ndr);
+ NDR_PULL_SET_MEM_CTX(ndr, r->in.data, 0);
+ NDR_CHECK(ndr_pull_array_size(ndr, &r->in.data));
+ NDR_CHECK(ndr_pull_array_length(ndr, &r->in.data));
+ if (ndr_get_array_length(ndr, &r->in.data) > ndr_get_array_size(ndr, &r->in.data)) {
+ return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->in.data), ndr_get_array_length(ndr, &r->in.data));
+ }
NDR_PULL_ALLOC_N(ndr, r->in.data, ndr_get_array_size(ndr, &r->in.data));
- }
- memcpy(r->out.data,r->in.data,ndr_get_array_size(ndr, &r->in.data) * sizeof(*r->in.data));
- _mem_save_data_1 = NDR_PULL_GET_MEM_CTX(ndr);
- NDR_PULL_SET_MEM_CTX(ndr, r->in.data, 0);
- for (cntr_data_1 = 0; cntr_data_1 < *r->in.length; cntr_data_1++) {
- NDR_CHECK(ndr_pull_ref_ptr(ndr, &_ptr_data));
- if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
- NDR_PULL_ALLOC(ndr, r->in.data[cntr_data_1]);
+ _mem_save_data_1 = NDR_PULL_GET_MEM_CTX(ndr);
+ NDR_PULL_SET_MEM_CTX(ndr, r->in.data, 0);
+ for (cntr_data_1 = 0; cntr_data_1 < *r->in.length; cntr_data_1++) {
+ NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_data));
+ if (_ptr_data) {
+ NDR_PULL_ALLOC(ndr, r->in.data[cntr_data_1]);
+ } else {
+ r->in.data[cntr_data_1] = NULL;
+ }
}
+ NDR_PULL_SET_MEM_CTX(ndr, _mem_save_data_1, 0);
+ NDR_PULL_SET_MEM_CTX(ndr, _mem_save_data_0, 0);
}
- NDR_PULL_SET_MEM_CTX(ndr, _mem_save_data_1, 0);
NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_size));
if (_ptr_size) {
NDR_PULL_ALLOC(ndr, r->in.size);
@@ -2402,9 +2415,6 @@ NTSTATUS ndr_pull_winreg_QueryValue(struct ndr_pull *ndr, int flags, struct winr
NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, r->in.length));
NDR_PULL_SET_MEM_CTX(ndr, _mem_save_length_0, 0);
}
- if (r->in.size == NULL) return NT_STATUS_INVALID_PARAMETER_MIX;
- NDR_PULL_ALLOC_N(ndr, r->out.data, *r->in.size);
- memcpy(r->out.data, r->in.data, *r->in.size * sizeof(*r->in.data));
if (r->in.data) {
if (r->in.size == NULL) return NT_STATUS_INVALID_PARAMETER_MIX;
NDR_CHECK(ndr_check_array_size(ndr, (void*)&r->in.data, *r->in.size));
@@ -2427,24 +2437,34 @@ NTSTATUS ndr_pull_winreg_QueryValue(struct ndr_pull *ndr, int flags, struct winr
NDR_CHECK(ndr_pull_winreg_Type(ndr, NDR_SCALARS, r->out.type));
NDR_PULL_SET_MEM_CTX(ndr, _mem_save_type_0, 0);
}
- NDR_CHECK(ndr_pull_array_size(ndr, &r->out.data));
- NDR_CHECK(ndr_pull_array_length(ndr, &r->out.data));
- if (ndr_get_array_length(ndr, &r->out.data) > ndr_get_array_size(ndr, &r->out.data)) {
- return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->out.data), ndr_get_array_length(ndr, &r->out.data));
+ NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_data));
+ if (_ptr_data) {
+ NDR_PULL_ALLOC(ndr, r->out.data);
+ } else {
+ r->out.data = NULL;
}
- if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
+ if (r->out.data) {
+ _mem_save_data_0 = NDR_PULL_GET_MEM_CTX(ndr);
+ NDR_PULL_SET_MEM_CTX(ndr, r->out.data, 0);
+ NDR_CHECK(ndr_pull_array_size(ndr, &r->out.data));
+ NDR_CHECK(ndr_pull_array_length(ndr, &r->out.data));
+ if (ndr_get_array_length(ndr, &r->out.data) > ndr_get_array_size(ndr, &r->out.data)) {
+ return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->out.data), ndr_get_array_length(ndr, &r->out.data));
+ }
NDR_PULL_ALLOC_N(ndr, r->out.data, ndr_get_array_size(ndr, &r->out.data));
- }
- memcpy(r->out.data,r->in.data,ndr_get_array_size(ndr, &r->out.data) * sizeof(*r->in.data));
- _mem_save_data_1 = NDR_PULL_GET_MEM_CTX(ndr);
- NDR_PULL_SET_MEM_CTX(ndr, r->out.data, 0);
- for (cntr_data_1 = 0; cntr_data_1 < *r->out.length; cntr_data_1++) {
- NDR_CHECK(ndr_pull_ref_ptr(ndr, &_ptr_data));
- if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
- NDR_PULL_ALLOC(ndr, r->out.data[cntr_data_1]);
+ _mem_save_data_1 = NDR_PULL_GET_MEM_CTX(ndr);
+ NDR_PULL_SET_MEM_CTX(ndr, r->out.data, 0);
+ for (cntr_data_1 = 0; cntr_data_1 < *r->out.length; cntr_data_1++) {
+ NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_data));
+ if (_ptr_data) {
+ NDR_PULL_ALLOC(ndr, r->out.data[cntr_data_1]);
+ } else {
+ r->out.data[cntr_data_1] = NULL;
+ }
}
+ NDR_PULL_SET_MEM_CTX(ndr, _mem_save_data_1, 0);
+ NDR_PULL_SET_MEM_CTX(ndr, _mem_save_data_0, 0);
}
- NDR_PULL_SET_MEM_CTX(ndr, _mem_save_data_1, 0);
NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_size));
if (_ptr_size) {
NDR_PULL_ALLOC(ndr, r->out.size);
@@ -2506,21 +2526,25 @@ _PUBLIC_ void ndr_print_winreg_QueryValue(struct ndr_print *ndr, const char *nam
ndr->depth--;
ndr_print_ptr(ndr, "data", r->in.data);
ndr->depth++;
- ndr->print(ndr, "%s: ARRAY(%d)", "data", *r->in.length);
- ndr->depth++;
- for (cntr_data_1=0;cntr_data_1<*r->in.length;cntr_data_1++) {
- char *idx_1=NULL;
- asprintf(&idx_1, "[%d]", cntr_data_1);
- if (idx_1) {
- ndr_print_ptr(ndr, "data", r->in.data[cntr_data_1]);
- ndr->depth++;
- ndr_print_uint8(ndr, "data", *r->in.data[cntr_data_1]);
- ndr->depth--;
- free(idx_1);
+ if (r->in.data) {
+ ndr->print(ndr, "%s: ARRAY(%d)", "data", *r->in.length);
+ ndr->depth++;
+ for (cntr_data_1=0;cntr_data_1<*r->in.length;cntr_data_1++) {
+ char *idx_1=NULL;
+ asprintf(&idx_1, "[%d]", cntr_data_1);
+ if (idx_1) {
+ ndr_print_ptr(ndr, "data", r->in.data[cntr_data_1]);
+ ndr->depth++;
+ if (r->in.data[cntr_data_1]) {
+ ndr_print_uint8(ndr, "data", *r->in.data[cntr_data_1]);
+ }
+ ndr->depth--;
+ free(idx_1);
+ }
}
+ ndr->depth--;
}
ndr->depth--;
- ndr->depth--;
ndr_print_ptr(ndr, "size", r->in.size);
ndr->depth++;
if (r->in.size) {
@@ -2546,21 +2570,25 @@ _PUBLIC_ void ndr_print_winreg_QueryValue(struct ndr_print *ndr, const char *nam
ndr->depth--;
ndr_print_ptr(ndr, "data", r->out.data);
ndr->depth++;
- ndr->print(ndr, "%s: ARRAY(%d)", "data", *r->out.length);
- ndr->depth++;
- for (cntr_data_1=0;cntr_data_1<*r->out.length;cntr_data_1++) {
- char *idx_1=NULL;
- asprintf(&idx_1, "[%d]", cntr_data_1);
- if (idx_1) {
- ndr_print_ptr(ndr, "data", r->out.data[cntr_data_1]);
- ndr->depth++;
- ndr_print_uint8(ndr, "data", *r->out.data[cntr_data_1]);
- ndr->depth--;
- free(idx_1);
+ if (r->out.data) {
+ ndr->print(ndr, "%s: ARRAY(%d)", "data", *r->out.length);
+ ndr->depth++;
+ for (cntr_data_1=0;cntr_data_1<*r->out.length;cntr_data_1++) {
+ char *idx_1=NULL;
+ asprintf(&idx_1, "[%d]", cntr_data_1);
+ if (idx_1) {
+ ndr_print_ptr(ndr, "data", r->out.data[cntr_data_1]);
+ ndr->depth++;
+ if (r->out.data[cntr_data_1]) {
+ ndr_print_uint8(ndr, "data", *r->out.data[cntr_data_1]);
+ }
+ ndr->depth--;
+ free(idx_1);
+ }
}
+ ndr->depth--;
}
ndr->depth--;
- ndr->depth--;
ndr_print_ptr(ndr, "size", r->out.size);
ndr->depth++;
if (r->out.size) {