mirror of
https://github.com/samba-team/samba.git
synced 2025-01-26 10:04:02 +03:00
* added levels 4, 200 and 300 to NetDfsEnum. 200 and 300 don't work
properly, I'm still investigating that. * changed dcerpc fault status code to NT_STATUS_NETWORK_WRITE_FAULT, which I think is a better mapping (This used to be commit 9ad28f6ddbb777de7cac11e71c392b508c81b741)
This commit is contained in:
parent
57529207ca
commit
15b258051c
@ -88,10 +88,48 @@
|
|||||||
[size_is(count)] dfs_Info3 *s;
|
[size_is(count)] dfs_Info3 *s;
|
||||||
} dfs_EnumArray3;
|
} dfs_EnumArray3;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
unistr *path;
|
||||||
|
unistr *comment;
|
||||||
|
uint32 state;
|
||||||
|
uint32 timeout;
|
||||||
|
GUID guid;
|
||||||
|
uint32 num_stores;
|
||||||
|
[size_is(num_stores)] dfs_StorageInfo *stores;
|
||||||
|
} dfs_Info4;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint32 count;
|
||||||
|
[size_is(count)] dfs_Info4 *s;
|
||||||
|
} dfs_EnumArray4;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
unistr *dom_root;
|
||||||
|
} dfs_Info200;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint32 count;
|
||||||
|
[size_is(count)] dfs_Info200 *s;
|
||||||
|
} dfs_EnumArray200;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint32 flags;
|
||||||
|
unistr *dom_root;
|
||||||
|
} dfs_Info300;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint32 count;
|
||||||
|
[size_is(count)] dfs_Info300 *s;
|
||||||
|
} dfs_EnumArray300;
|
||||||
|
|
||||||
|
|
||||||
typedef union {
|
typedef union {
|
||||||
case(1) dfs_EnumArray1 *info1;
|
case(1) dfs_EnumArray1 *info1;
|
||||||
case(2) dfs_EnumArray2 *info2;
|
case(2) dfs_EnumArray2 *info2;
|
||||||
case(3) dfs_EnumArray3 *info3;
|
case(3) dfs_EnumArray3 *info3;
|
||||||
|
case(4) dfs_EnumArray4 *info4;
|
||||||
|
case(200) dfs_EnumArray200 *info200;
|
||||||
|
case(300) dfs_EnumArray300 *info300;
|
||||||
} dfs_EnumInfo;
|
} dfs_EnumInfo;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -397,9 +397,12 @@ NTSTATUS ndr_push_offset_ptr(struct ndr_push *ndr,
|
|||||||
/*
|
/*
|
||||||
push a GUID
|
push a GUID
|
||||||
*/
|
*/
|
||||||
NTSTATUS ndr_push_GUID(struct ndr_push *ndr, GUID *guid)
|
NTSTATUS ndr_push_GUID(struct ndr_push *ndr, int ndr_flags, GUID *guid)
|
||||||
{
|
{
|
||||||
return ndr_push_bytes(ndr, guid->info, GUID_SIZE);
|
if (ndr_flags & NDR_SCALARS) {
|
||||||
|
return ndr_push_bytes(ndr, guid->info, GUID_SIZE);
|
||||||
|
}
|
||||||
|
return NT_STATUS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -194,6 +194,111 @@ done:
|
|||||||
return NT_STATUS_OK;
|
return NT_STATUS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static NTSTATUS ndr_push_dfs_Info4(struct ndr_push *ndr, int ndr_flags, struct dfs_Info4 *r)
|
||||||
|
{
|
||||||
|
NDR_CHECK(ndr_push_align(ndr, 4));
|
||||||
|
if (!(ndr_flags & NDR_SCALARS)) goto buffers;
|
||||||
|
NDR_CHECK(ndr_push_ptr(ndr, r->path));
|
||||||
|
NDR_CHECK(ndr_push_ptr(ndr, r->comment));
|
||||||
|
NDR_CHECK(ndr_push_uint32(ndr, r->state));
|
||||||
|
NDR_CHECK(ndr_push_uint32(ndr, r->timeout));
|
||||||
|
NDR_CHECK(ndr_push_GUID(ndr, NDR_SCALARS, &r->guid));
|
||||||
|
NDR_CHECK(ndr_push_uint32(ndr, r->num_stores));
|
||||||
|
NDR_CHECK(ndr_push_ptr(ndr, r->stores));
|
||||||
|
buffers:
|
||||||
|
if (!(ndr_flags & NDR_BUFFERS)) goto done;
|
||||||
|
if (r->path) {
|
||||||
|
NDR_CHECK(ndr_push_unistr(ndr, r->path));
|
||||||
|
}
|
||||||
|
if (r->comment) {
|
||||||
|
NDR_CHECK(ndr_push_unistr(ndr, r->comment));
|
||||||
|
}
|
||||||
|
NDR_CHECK(ndr_push_GUID(ndr, ndr_flags, &r->guid));
|
||||||
|
if (r->stores) {
|
||||||
|
NDR_CHECK(ndr_push_uint32(ndr, r->num_stores));
|
||||||
|
NDR_CHECK(ndr_push_array(ndr, ndr_flags, r->stores, sizeof(r->stores[0]), r->num_stores, (ndr_push_flags_fn_t)ndr_push_dfs_StorageInfo));
|
||||||
|
}
|
||||||
|
done:
|
||||||
|
return NT_STATUS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static NTSTATUS ndr_push_dfs_EnumArray4(struct ndr_push *ndr, int ndr_flags, struct dfs_EnumArray4 *r)
|
||||||
|
{
|
||||||
|
NDR_CHECK(ndr_push_align(ndr, 4));
|
||||||
|
if (!(ndr_flags & NDR_SCALARS)) goto buffers;
|
||||||
|
NDR_CHECK(ndr_push_uint32(ndr, r->count));
|
||||||
|
NDR_CHECK(ndr_push_ptr(ndr, r->s));
|
||||||
|
buffers:
|
||||||
|
if (!(ndr_flags & NDR_BUFFERS)) goto done;
|
||||||
|
if (r->s) {
|
||||||
|
NDR_CHECK(ndr_push_uint32(ndr, r->count));
|
||||||
|
NDR_CHECK(ndr_push_array(ndr, ndr_flags, r->s, sizeof(r->s[0]), r->count, (ndr_push_flags_fn_t)ndr_push_dfs_Info4));
|
||||||
|
}
|
||||||
|
done:
|
||||||
|
return NT_STATUS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static NTSTATUS ndr_push_dfs_Info200(struct ndr_push *ndr, int ndr_flags, struct dfs_Info200 *r)
|
||||||
|
{
|
||||||
|
NDR_CHECK(ndr_push_align(ndr, 4));
|
||||||
|
if (!(ndr_flags & NDR_SCALARS)) goto buffers;
|
||||||
|
NDR_CHECK(ndr_push_ptr(ndr, r->dom_root));
|
||||||
|
buffers:
|
||||||
|
if (!(ndr_flags & NDR_BUFFERS)) goto done;
|
||||||
|
if (r->dom_root) {
|
||||||
|
NDR_CHECK(ndr_push_unistr(ndr, r->dom_root));
|
||||||
|
}
|
||||||
|
done:
|
||||||
|
return NT_STATUS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static NTSTATUS ndr_push_dfs_EnumArray200(struct ndr_push *ndr, int ndr_flags, struct dfs_EnumArray200 *r)
|
||||||
|
{
|
||||||
|
NDR_CHECK(ndr_push_align(ndr, 4));
|
||||||
|
if (!(ndr_flags & NDR_SCALARS)) goto buffers;
|
||||||
|
NDR_CHECK(ndr_push_uint32(ndr, r->count));
|
||||||
|
NDR_CHECK(ndr_push_ptr(ndr, r->s));
|
||||||
|
buffers:
|
||||||
|
if (!(ndr_flags & NDR_BUFFERS)) goto done;
|
||||||
|
if (r->s) {
|
||||||
|
NDR_CHECK(ndr_push_uint32(ndr, r->count));
|
||||||
|
NDR_CHECK(ndr_push_array(ndr, ndr_flags, r->s, sizeof(r->s[0]), r->count, (ndr_push_flags_fn_t)ndr_push_dfs_Info200));
|
||||||
|
}
|
||||||
|
done:
|
||||||
|
return NT_STATUS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static NTSTATUS ndr_push_dfs_Info300(struct ndr_push *ndr, int ndr_flags, struct dfs_Info300 *r)
|
||||||
|
{
|
||||||
|
NDR_CHECK(ndr_push_align(ndr, 4));
|
||||||
|
if (!(ndr_flags & NDR_SCALARS)) goto buffers;
|
||||||
|
NDR_CHECK(ndr_push_uint32(ndr, r->flags));
|
||||||
|
NDR_CHECK(ndr_push_ptr(ndr, r->dom_root));
|
||||||
|
buffers:
|
||||||
|
if (!(ndr_flags & NDR_BUFFERS)) goto done;
|
||||||
|
if (r->dom_root) {
|
||||||
|
NDR_CHECK(ndr_push_unistr(ndr, r->dom_root));
|
||||||
|
}
|
||||||
|
done:
|
||||||
|
return NT_STATUS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static NTSTATUS ndr_push_dfs_EnumArray300(struct ndr_push *ndr, int ndr_flags, struct dfs_EnumArray300 *r)
|
||||||
|
{
|
||||||
|
NDR_CHECK(ndr_push_align(ndr, 4));
|
||||||
|
if (!(ndr_flags & NDR_SCALARS)) goto buffers;
|
||||||
|
NDR_CHECK(ndr_push_uint32(ndr, r->count));
|
||||||
|
NDR_CHECK(ndr_push_ptr(ndr, r->s));
|
||||||
|
buffers:
|
||||||
|
if (!(ndr_flags & NDR_BUFFERS)) goto done;
|
||||||
|
if (r->s) {
|
||||||
|
NDR_CHECK(ndr_push_uint32(ndr, r->count));
|
||||||
|
NDR_CHECK(ndr_push_array(ndr, ndr_flags, r->s, sizeof(r->s[0]), r->count, (ndr_push_flags_fn_t)ndr_push_dfs_Info300));
|
||||||
|
}
|
||||||
|
done:
|
||||||
|
return NT_STATUS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
static NTSTATUS ndr_push_dfs_EnumInfo(struct ndr_push *ndr, int ndr_flags, uint16 level, union dfs_EnumInfo *r)
|
static NTSTATUS ndr_push_dfs_EnumInfo(struct ndr_push *ndr, int ndr_flags, uint16 level, union dfs_EnumInfo *r)
|
||||||
{
|
{
|
||||||
if (!(ndr_flags & NDR_SCALARS)) goto buffers;
|
if (!(ndr_flags & NDR_SCALARS)) goto buffers;
|
||||||
@ -211,6 +316,18 @@ static NTSTATUS ndr_push_dfs_EnumInfo(struct ndr_push *ndr, int ndr_flags, uint1
|
|||||||
NDR_CHECK(ndr_push_ptr(ndr, r->info3));
|
NDR_CHECK(ndr_push_ptr(ndr, r->info3));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 4:
|
||||||
|
NDR_CHECK(ndr_push_ptr(ndr, r->info4));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 200:
|
||||||
|
NDR_CHECK(ndr_push_ptr(ndr, r->info200));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 300:
|
||||||
|
NDR_CHECK(ndr_push_ptr(ndr, r->info300));
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return ndr_push_error(ndr, NDR_ERR_BAD_SWITCH, "Bad switch value %u", level);
|
return ndr_push_error(ndr, NDR_ERR_BAD_SWITCH, "Bad switch value %u", level);
|
||||||
}
|
}
|
||||||
@ -235,6 +352,24 @@ buffers:
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 4:
|
||||||
|
if (r->info4) {
|
||||||
|
NDR_CHECK(ndr_push_dfs_EnumArray4(ndr, ndr_flags, r->info4));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 200:
|
||||||
|
if (r->info200) {
|
||||||
|
NDR_CHECK(ndr_push_dfs_EnumArray200(ndr, ndr_flags, r->info200));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 300:
|
||||||
|
if (r->info300) {
|
||||||
|
NDR_CHECK(ndr_push_dfs_EnumArray300(ndr, ndr_flags, r->info300));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return ndr_push_error(ndr, NDR_ERR_BAD_SWITCH, "Bad switch value %u", level);
|
return ndr_push_error(ndr, NDR_ERR_BAD_SWITCH, "Bad switch value %u", level);
|
||||||
}
|
}
|
||||||
@ -530,6 +665,187 @@ done:
|
|||||||
return NT_STATUS_OK;
|
return NT_STATUS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static NTSTATUS ndr_pull_dfs_Info4(struct ndr_pull *ndr, int ndr_flags, struct dfs_Info4 *r)
|
||||||
|
{
|
||||||
|
uint32 _ptr_path;
|
||||||
|
uint32 _ptr_comment;
|
||||||
|
uint32 _ptr_stores;
|
||||||
|
NDR_CHECK(ndr_pull_align(ndr, 4));
|
||||||
|
if (!(ndr_flags & NDR_SCALARS)) goto buffers;
|
||||||
|
NDR_CHECK(ndr_pull_uint32(ndr, &_ptr_path));
|
||||||
|
if (_ptr_path) {
|
||||||
|
NDR_ALLOC(ndr, r->path);
|
||||||
|
} else {
|
||||||
|
r->path = NULL;
|
||||||
|
}
|
||||||
|
NDR_CHECK(ndr_pull_uint32(ndr, &_ptr_comment));
|
||||||
|
if (_ptr_comment) {
|
||||||
|
NDR_ALLOC(ndr, r->comment);
|
||||||
|
} else {
|
||||||
|
r->comment = NULL;
|
||||||
|
}
|
||||||
|
NDR_CHECK(ndr_pull_uint32(ndr, &r->state));
|
||||||
|
NDR_CHECK(ndr_pull_uint32(ndr, &r->timeout));
|
||||||
|
NDR_CHECK(ndr_pull_GUID(ndr, NDR_SCALARS, &r->guid));
|
||||||
|
NDR_CHECK(ndr_pull_uint32(ndr, &r->num_stores));
|
||||||
|
NDR_CHECK(ndr_pull_uint32(ndr, &_ptr_stores));
|
||||||
|
if (_ptr_stores) {
|
||||||
|
NDR_ALLOC(ndr, r->stores);
|
||||||
|
} else {
|
||||||
|
r->stores = NULL;
|
||||||
|
}
|
||||||
|
buffers:
|
||||||
|
if (!(ndr_flags & NDR_BUFFERS)) goto done;
|
||||||
|
if (r->path) {
|
||||||
|
NDR_CHECK(ndr_pull_unistr(ndr, &r->path));
|
||||||
|
}
|
||||||
|
if (r->comment) {
|
||||||
|
NDR_CHECK(ndr_pull_unistr(ndr, &r->comment));
|
||||||
|
}
|
||||||
|
NDR_CHECK(ndr_pull_GUID(ndr, ndr_flags, &r->guid));
|
||||||
|
if (r->stores) {
|
||||||
|
{
|
||||||
|
uint32 _array_size;
|
||||||
|
NDR_CHECK(ndr_pull_uint32(ndr, &_array_size));
|
||||||
|
if (r->num_stores > _array_size) {
|
||||||
|
return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should be %u", _array_size, r->num_stores);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
NDR_ALLOC_N_SIZE(ndr, r->stores, r->num_stores, sizeof(r->stores[0]));
|
||||||
|
NDR_CHECK(ndr_pull_array(ndr, NDR_SCALARS|NDR_BUFFERS, (void **)r->stores, sizeof(r->stores[0]), r->num_stores, (ndr_pull_flags_fn_t)ndr_pull_dfs_StorageInfo));
|
||||||
|
}
|
||||||
|
done:
|
||||||
|
return NT_STATUS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static NTSTATUS ndr_pull_dfs_EnumArray4(struct ndr_pull *ndr, int ndr_flags, struct dfs_EnumArray4 *r)
|
||||||
|
{
|
||||||
|
uint32 _ptr_s;
|
||||||
|
NDR_CHECK(ndr_pull_align(ndr, 4));
|
||||||
|
if (!(ndr_flags & NDR_SCALARS)) goto buffers;
|
||||||
|
NDR_CHECK(ndr_pull_uint32(ndr, &r->count));
|
||||||
|
NDR_CHECK(ndr_pull_uint32(ndr, &_ptr_s));
|
||||||
|
if (_ptr_s) {
|
||||||
|
NDR_ALLOC(ndr, r->s);
|
||||||
|
} else {
|
||||||
|
r->s = NULL;
|
||||||
|
}
|
||||||
|
buffers:
|
||||||
|
if (!(ndr_flags & NDR_BUFFERS)) goto done;
|
||||||
|
if (r->s) {
|
||||||
|
{
|
||||||
|
uint32 _array_size;
|
||||||
|
NDR_CHECK(ndr_pull_uint32(ndr, &_array_size));
|
||||||
|
if (r->count > _array_size) {
|
||||||
|
return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should be %u", _array_size, r->count);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
NDR_ALLOC_N_SIZE(ndr, r->s, r->count, sizeof(r->s[0]));
|
||||||
|
NDR_CHECK(ndr_pull_array(ndr, NDR_SCALARS|NDR_BUFFERS, (void **)r->s, sizeof(r->s[0]), r->count, (ndr_pull_flags_fn_t)ndr_pull_dfs_Info4));
|
||||||
|
}
|
||||||
|
done:
|
||||||
|
return NT_STATUS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static NTSTATUS ndr_pull_dfs_Info200(struct ndr_pull *ndr, int ndr_flags, struct dfs_Info200 *r)
|
||||||
|
{
|
||||||
|
uint32 _ptr_dom_root;
|
||||||
|
NDR_CHECK(ndr_pull_align(ndr, 4));
|
||||||
|
if (!(ndr_flags & NDR_SCALARS)) goto buffers;
|
||||||
|
NDR_CHECK(ndr_pull_uint32(ndr, &_ptr_dom_root));
|
||||||
|
if (_ptr_dom_root) {
|
||||||
|
NDR_ALLOC(ndr, r->dom_root);
|
||||||
|
} else {
|
||||||
|
r->dom_root = NULL;
|
||||||
|
}
|
||||||
|
buffers:
|
||||||
|
if (!(ndr_flags & NDR_BUFFERS)) goto done;
|
||||||
|
if (r->dom_root) {
|
||||||
|
NDR_CHECK(ndr_pull_unistr(ndr, &r->dom_root));
|
||||||
|
}
|
||||||
|
done:
|
||||||
|
return NT_STATUS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static NTSTATUS ndr_pull_dfs_EnumArray200(struct ndr_pull *ndr, int ndr_flags, struct dfs_EnumArray200 *r)
|
||||||
|
{
|
||||||
|
uint32 _ptr_s;
|
||||||
|
NDR_CHECK(ndr_pull_align(ndr, 4));
|
||||||
|
if (!(ndr_flags & NDR_SCALARS)) goto buffers;
|
||||||
|
NDR_CHECK(ndr_pull_uint32(ndr, &r->count));
|
||||||
|
NDR_CHECK(ndr_pull_uint32(ndr, &_ptr_s));
|
||||||
|
if (_ptr_s) {
|
||||||
|
NDR_ALLOC(ndr, r->s);
|
||||||
|
} else {
|
||||||
|
r->s = NULL;
|
||||||
|
}
|
||||||
|
buffers:
|
||||||
|
if (!(ndr_flags & NDR_BUFFERS)) goto done;
|
||||||
|
if (r->s) {
|
||||||
|
{
|
||||||
|
uint32 _array_size;
|
||||||
|
NDR_CHECK(ndr_pull_uint32(ndr, &_array_size));
|
||||||
|
if (r->count > _array_size) {
|
||||||
|
return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should be %u", _array_size, r->count);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
NDR_ALLOC_N_SIZE(ndr, r->s, r->count, sizeof(r->s[0]));
|
||||||
|
NDR_CHECK(ndr_pull_array(ndr, NDR_SCALARS|NDR_BUFFERS, (void **)r->s, sizeof(r->s[0]), r->count, (ndr_pull_flags_fn_t)ndr_pull_dfs_Info200));
|
||||||
|
}
|
||||||
|
done:
|
||||||
|
return NT_STATUS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static NTSTATUS ndr_pull_dfs_Info300(struct ndr_pull *ndr, int ndr_flags, struct dfs_Info300 *r)
|
||||||
|
{
|
||||||
|
uint32 _ptr_dom_root;
|
||||||
|
NDR_CHECK(ndr_pull_align(ndr, 4));
|
||||||
|
if (!(ndr_flags & NDR_SCALARS)) goto buffers;
|
||||||
|
NDR_CHECK(ndr_pull_uint32(ndr, &r->flags));
|
||||||
|
NDR_CHECK(ndr_pull_uint32(ndr, &_ptr_dom_root));
|
||||||
|
if (_ptr_dom_root) {
|
||||||
|
NDR_ALLOC(ndr, r->dom_root);
|
||||||
|
} else {
|
||||||
|
r->dom_root = NULL;
|
||||||
|
}
|
||||||
|
buffers:
|
||||||
|
if (!(ndr_flags & NDR_BUFFERS)) goto done;
|
||||||
|
if (r->dom_root) {
|
||||||
|
NDR_CHECK(ndr_pull_unistr(ndr, &r->dom_root));
|
||||||
|
}
|
||||||
|
done:
|
||||||
|
return NT_STATUS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static NTSTATUS ndr_pull_dfs_EnumArray300(struct ndr_pull *ndr, int ndr_flags, struct dfs_EnumArray300 *r)
|
||||||
|
{
|
||||||
|
uint32 _ptr_s;
|
||||||
|
NDR_CHECK(ndr_pull_align(ndr, 4));
|
||||||
|
if (!(ndr_flags & NDR_SCALARS)) goto buffers;
|
||||||
|
NDR_CHECK(ndr_pull_uint32(ndr, &r->count));
|
||||||
|
NDR_CHECK(ndr_pull_uint32(ndr, &_ptr_s));
|
||||||
|
if (_ptr_s) {
|
||||||
|
NDR_ALLOC(ndr, r->s);
|
||||||
|
} else {
|
||||||
|
r->s = NULL;
|
||||||
|
}
|
||||||
|
buffers:
|
||||||
|
if (!(ndr_flags & NDR_BUFFERS)) goto done;
|
||||||
|
if (r->s) {
|
||||||
|
{
|
||||||
|
uint32 _array_size;
|
||||||
|
NDR_CHECK(ndr_pull_uint32(ndr, &_array_size));
|
||||||
|
if (r->count > _array_size) {
|
||||||
|
return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should be %u", _array_size, r->count);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
NDR_ALLOC_N_SIZE(ndr, r->s, r->count, sizeof(r->s[0]));
|
||||||
|
NDR_CHECK(ndr_pull_array(ndr, NDR_SCALARS|NDR_BUFFERS, (void **)r->s, sizeof(r->s[0]), r->count, (ndr_pull_flags_fn_t)ndr_pull_dfs_Info300));
|
||||||
|
}
|
||||||
|
done:
|
||||||
|
return NT_STATUS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
static NTSTATUS ndr_pull_dfs_EnumInfo(struct ndr_pull *ndr, int ndr_flags, uint16 *level, union dfs_EnumInfo *r)
|
static NTSTATUS ndr_pull_dfs_EnumInfo(struct ndr_pull *ndr, int ndr_flags, uint16 *level, union dfs_EnumInfo *r)
|
||||||
{
|
{
|
||||||
if (!(ndr_flags & NDR_SCALARS)) goto buffers;
|
if (!(ndr_flags & NDR_SCALARS)) goto buffers;
|
||||||
@ -565,6 +881,36 @@ static NTSTATUS ndr_pull_dfs_EnumInfo(struct ndr_pull *ndr, int ndr_flags, uint1
|
|||||||
}
|
}
|
||||||
break; }
|
break; }
|
||||||
|
|
||||||
|
case 4: {
|
||||||
|
uint32 _ptr_info4;
|
||||||
|
NDR_CHECK(ndr_pull_uint32(ndr, &_ptr_info4));
|
||||||
|
if (_ptr_info4) {
|
||||||
|
NDR_ALLOC(ndr, r->info4);
|
||||||
|
} else {
|
||||||
|
r->info4 = NULL;
|
||||||
|
}
|
||||||
|
break; }
|
||||||
|
|
||||||
|
case 200: {
|
||||||
|
uint32 _ptr_info200;
|
||||||
|
NDR_CHECK(ndr_pull_uint32(ndr, &_ptr_info200));
|
||||||
|
if (_ptr_info200) {
|
||||||
|
NDR_ALLOC(ndr, r->info200);
|
||||||
|
} else {
|
||||||
|
r->info200 = NULL;
|
||||||
|
}
|
||||||
|
break; }
|
||||||
|
|
||||||
|
case 300: {
|
||||||
|
uint32 _ptr_info300;
|
||||||
|
NDR_CHECK(ndr_pull_uint32(ndr, &_ptr_info300));
|
||||||
|
if (_ptr_info300) {
|
||||||
|
NDR_ALLOC(ndr, r->info300);
|
||||||
|
} else {
|
||||||
|
r->info300 = NULL;
|
||||||
|
}
|
||||||
|
break; }
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return ndr_pull_error(ndr, NDR_ERR_BAD_SWITCH, "Bad switch value %u", *level);
|
return ndr_pull_error(ndr, NDR_ERR_BAD_SWITCH, "Bad switch value %u", *level);
|
||||||
}
|
}
|
||||||
@ -589,6 +935,24 @@ buffers:
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 4:
|
||||||
|
if (r->info4) {
|
||||||
|
NDR_CHECK(ndr_pull_dfs_EnumArray4(ndr, NDR_SCALARS|NDR_BUFFERS, r->info4));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 200:
|
||||||
|
if (r->info200) {
|
||||||
|
NDR_CHECK(ndr_pull_dfs_EnumArray200(ndr, NDR_SCALARS|NDR_BUFFERS, r->info200));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 300:
|
||||||
|
if (r->info300) {
|
||||||
|
NDR_CHECK(ndr_pull_dfs_EnumArray300(ndr, NDR_SCALARS|NDR_BUFFERS, r->info300));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return ndr_pull_error(ndr, NDR_ERR_BAD_SWITCH, "Bad switch value %u", *level);
|
return ndr_pull_error(ndr, NDR_ERR_BAD_SWITCH, "Bad switch value %u", *level);
|
||||||
}
|
}
|
||||||
@ -765,6 +1129,104 @@ void ndr_print_dfs_EnumArray3(struct ndr_print *ndr, const char *name, struct df
|
|||||||
ndr->depth--;
|
ndr->depth--;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ndr_print_dfs_Info4(struct ndr_print *ndr, const char *name, struct dfs_Info4 *r)
|
||||||
|
{
|
||||||
|
ndr_print_struct(ndr, name, "dfs_Info4");
|
||||||
|
ndr->depth++;
|
||||||
|
ndr_print_ptr(ndr, "path", r->path);
|
||||||
|
ndr->depth++;
|
||||||
|
if (r->path) {
|
||||||
|
ndr_print_unistr(ndr, "path", r->path);
|
||||||
|
}
|
||||||
|
ndr->depth--;
|
||||||
|
ndr_print_ptr(ndr, "comment", r->comment);
|
||||||
|
ndr->depth++;
|
||||||
|
if (r->comment) {
|
||||||
|
ndr_print_unistr(ndr, "comment", r->comment);
|
||||||
|
}
|
||||||
|
ndr->depth--;
|
||||||
|
ndr_print_uint32(ndr, "state", r->state);
|
||||||
|
ndr_print_uint32(ndr, "timeout", r->timeout);
|
||||||
|
ndr_print_GUID(ndr, "guid", &r->guid);
|
||||||
|
ndr_print_uint32(ndr, "num_stores", r->num_stores);
|
||||||
|
ndr_print_ptr(ndr, "stores", r->stores);
|
||||||
|
ndr->depth++;
|
||||||
|
if (r->stores) {
|
||||||
|
ndr_print_array(ndr, "stores", r->stores, sizeof(r->stores[0]), r->num_stores, (ndr_print_fn_t)ndr_print_dfs_StorageInfo);
|
||||||
|
}
|
||||||
|
ndr->depth--;
|
||||||
|
ndr->depth--;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ndr_print_dfs_EnumArray4(struct ndr_print *ndr, const char *name, struct dfs_EnumArray4 *r)
|
||||||
|
{
|
||||||
|
ndr_print_struct(ndr, name, "dfs_EnumArray4");
|
||||||
|
ndr->depth++;
|
||||||
|
ndr_print_uint32(ndr, "count", r->count);
|
||||||
|
ndr_print_ptr(ndr, "s", r->s);
|
||||||
|
ndr->depth++;
|
||||||
|
if (r->s) {
|
||||||
|
ndr_print_array(ndr, "s", r->s, sizeof(r->s[0]), r->count, (ndr_print_fn_t)ndr_print_dfs_Info4);
|
||||||
|
}
|
||||||
|
ndr->depth--;
|
||||||
|
ndr->depth--;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ndr_print_dfs_Info200(struct ndr_print *ndr, const char *name, struct dfs_Info200 *r)
|
||||||
|
{
|
||||||
|
ndr_print_struct(ndr, name, "dfs_Info200");
|
||||||
|
ndr->depth++;
|
||||||
|
ndr_print_ptr(ndr, "dom_root", r->dom_root);
|
||||||
|
ndr->depth++;
|
||||||
|
if (r->dom_root) {
|
||||||
|
ndr_print_unistr(ndr, "dom_root", r->dom_root);
|
||||||
|
}
|
||||||
|
ndr->depth--;
|
||||||
|
ndr->depth--;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ndr_print_dfs_EnumArray200(struct ndr_print *ndr, const char *name, struct dfs_EnumArray200 *r)
|
||||||
|
{
|
||||||
|
ndr_print_struct(ndr, name, "dfs_EnumArray200");
|
||||||
|
ndr->depth++;
|
||||||
|
ndr_print_uint32(ndr, "count", r->count);
|
||||||
|
ndr_print_ptr(ndr, "s", r->s);
|
||||||
|
ndr->depth++;
|
||||||
|
if (r->s) {
|
||||||
|
ndr_print_array(ndr, "s", r->s, sizeof(r->s[0]), r->count, (ndr_print_fn_t)ndr_print_dfs_Info200);
|
||||||
|
}
|
||||||
|
ndr->depth--;
|
||||||
|
ndr->depth--;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ndr_print_dfs_Info300(struct ndr_print *ndr, const char *name, struct dfs_Info300 *r)
|
||||||
|
{
|
||||||
|
ndr_print_struct(ndr, name, "dfs_Info300");
|
||||||
|
ndr->depth++;
|
||||||
|
ndr_print_uint32(ndr, "flags", r->flags);
|
||||||
|
ndr_print_ptr(ndr, "dom_root", r->dom_root);
|
||||||
|
ndr->depth++;
|
||||||
|
if (r->dom_root) {
|
||||||
|
ndr_print_unistr(ndr, "dom_root", r->dom_root);
|
||||||
|
}
|
||||||
|
ndr->depth--;
|
||||||
|
ndr->depth--;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ndr_print_dfs_EnumArray300(struct ndr_print *ndr, const char *name, struct dfs_EnumArray300 *r)
|
||||||
|
{
|
||||||
|
ndr_print_struct(ndr, name, "dfs_EnumArray300");
|
||||||
|
ndr->depth++;
|
||||||
|
ndr_print_uint32(ndr, "count", r->count);
|
||||||
|
ndr_print_ptr(ndr, "s", r->s);
|
||||||
|
ndr->depth++;
|
||||||
|
if (r->s) {
|
||||||
|
ndr_print_array(ndr, "s", r->s, sizeof(r->s[0]), r->count, (ndr_print_fn_t)ndr_print_dfs_Info300);
|
||||||
|
}
|
||||||
|
ndr->depth--;
|
||||||
|
ndr->depth--;
|
||||||
|
}
|
||||||
|
|
||||||
void ndr_print_dfs_EnumInfo(struct ndr_print *ndr, const char *name, uint16 level, union dfs_EnumInfo *r)
|
void ndr_print_dfs_EnumInfo(struct ndr_print *ndr, const char *name, uint16 level, union dfs_EnumInfo *r)
|
||||||
{
|
{
|
||||||
ndr_print_union(ndr, name, level, "dfs_EnumInfo");
|
ndr_print_union(ndr, name, level, "dfs_EnumInfo");
|
||||||
@ -796,6 +1258,33 @@ void ndr_print_dfs_EnumInfo(struct ndr_print *ndr, const char *name, uint16 leve
|
|||||||
ndr->depth--;
|
ndr->depth--;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 4:
|
||||||
|
ndr_print_ptr(ndr, "info4", r->info4);
|
||||||
|
ndr->depth++;
|
||||||
|
if (r->info4) {
|
||||||
|
ndr_print_dfs_EnumArray4(ndr, "info4", r->info4);
|
||||||
|
}
|
||||||
|
ndr->depth--;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 200:
|
||||||
|
ndr_print_ptr(ndr, "info200", r->info200);
|
||||||
|
ndr->depth++;
|
||||||
|
if (r->info200) {
|
||||||
|
ndr_print_dfs_EnumArray200(ndr, "info200", r->info200);
|
||||||
|
}
|
||||||
|
ndr->depth--;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 300:
|
||||||
|
ndr_print_ptr(ndr, "info300", r->info300);
|
||||||
|
ndr->depth++;
|
||||||
|
if (r->info300) {
|
||||||
|
ndr_print_dfs_EnumArray300(ndr, "info300", r->info300);
|
||||||
|
}
|
||||||
|
ndr->depth--;
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
ndr_print_bad_level(ndr, name, level);
|
ndr_print_bad_level(ndr, name, level);
|
||||||
}
|
}
|
||||||
|
@ -102,10 +102,47 @@ struct dfs_EnumArray3 {
|
|||||||
struct dfs_Info3 *s;
|
struct dfs_Info3 *s;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct dfs_Info4 {
|
||||||
|
const char *path;
|
||||||
|
const char *comment;
|
||||||
|
uint32 state;
|
||||||
|
uint32 timeout;
|
||||||
|
struct GUID guid;
|
||||||
|
uint32 num_stores;
|
||||||
|
struct dfs_StorageInfo *stores;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct dfs_EnumArray4 {
|
||||||
|
uint32 count;
|
||||||
|
struct dfs_Info4 *s;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct dfs_Info200 {
|
||||||
|
const char *dom_root;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct dfs_EnumArray200 {
|
||||||
|
uint32 count;
|
||||||
|
struct dfs_Info200 *s;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct dfs_Info300 {
|
||||||
|
uint32 flags;
|
||||||
|
const char *dom_root;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct dfs_EnumArray300 {
|
||||||
|
uint32 count;
|
||||||
|
struct dfs_Info300 *s;
|
||||||
|
};
|
||||||
|
|
||||||
union dfs_EnumInfo {
|
union dfs_EnumInfo {
|
||||||
/* [case(1)] */ struct dfs_EnumArray1 *info1;
|
/* [case(1)] */ struct dfs_EnumArray1 *info1;
|
||||||
/* [case(2)] */ struct dfs_EnumArray2 *info2;
|
/* [case(2)] */ struct dfs_EnumArray2 *info2;
|
||||||
/* [case(3)] */ struct dfs_EnumArray3 *info3;
|
/* [case(3)] */ struct dfs_EnumArray3 *info3;
|
||||||
|
/* [case(4)] */ struct dfs_EnumArray4 *info4;
|
||||||
|
/* [case(200)] */ struct dfs_EnumArray200 *info200;
|
||||||
|
/* [case(300)] */ struct dfs_EnumArray300 *info300;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct dfs_EnumStruct {
|
struct dfs_EnumStruct {
|
||||||
|
@ -203,10 +203,10 @@ NTSTATUS ndr_push_security_ace(struct ndr_push *ndr, struct security_ace *ace)
|
|||||||
if (sec_ace_object(ace->type)) {
|
if (sec_ace_object(ace->type)) {
|
||||||
NDR_CHECK(ndr_push_uint32(ndr, ace->obj->flags));
|
NDR_CHECK(ndr_push_uint32(ndr, ace->obj->flags));
|
||||||
if (ace->obj->flags & SEC_ACE_OBJECT_PRESENT) {
|
if (ace->obj->flags & SEC_ACE_OBJECT_PRESENT) {
|
||||||
NDR_CHECK(ndr_push_GUID(ndr, &ace->obj->object_guid));
|
NDR_CHECK(ndr_push_GUID(ndr, NDR_SCALARS, &ace->obj->object_guid));
|
||||||
}
|
}
|
||||||
if (ace->obj->flags & SEC_ACE_OBJECT_INHERITED_PRESENT) {
|
if (ace->obj->flags & SEC_ACE_OBJECT_INHERITED_PRESENT) {
|
||||||
NDR_CHECK(ndr_push_GUID(ndr, &ace->obj->inherit_guid));
|
NDR_CHECK(ndr_push_GUID(ndr, NDR_SCALARS, &ace->obj->inherit_guid));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -331,7 +331,7 @@ NTSTATUS dcerpc_pull(DATA_BLOB *blob, TALLOC_CTX *mem_ctx, struct dcerpc_packet
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return NT_STATUS_INVALID_LEVEL;
|
return NT_STATUS_NET_WRITE_FAULT;
|
||||||
}
|
}
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
@ -478,7 +478,7 @@ NTSTATUS dcerpc_push(DATA_BLOB *blob, TALLOC_CTX *mem_ctx, struct dcerpc_packet
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
status = NT_STATUS_INVALID_LEVEL;
|
status = NT_STATUS_NET_WRITE_FAULT;
|
||||||
}
|
}
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
|
@ -41,28 +41,26 @@ static BOOL test_Exist(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx)
|
|||||||
return True;
|
return True;
|
||||||
}
|
}
|
||||||
|
|
||||||
static BOOL test_Enum(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx)
|
static BOOL test_EnumLevel(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, uint16 level)
|
||||||
{
|
{
|
||||||
NTSTATUS status;
|
NTSTATUS status;
|
||||||
struct dfs_Enum r;
|
struct dfs_Enum r;
|
||||||
uint32 total=0;
|
uint32 total=0;
|
||||||
struct dfs_EnumStruct e;
|
struct dfs_EnumStruct e;
|
||||||
uint32 i = 0;
|
|
||||||
struct dfs_Info1 s;
|
struct dfs_Info1 s;
|
||||||
struct dfs_EnumArray1 e2;
|
struct dfs_EnumArray1 e1;
|
||||||
|
|
||||||
r.in.level = 3;
|
r.in.level = level;
|
||||||
r.in.bufsize = (uint32)-1;
|
r.in.bufsize = (uint32)-1;
|
||||||
r.in.total = &total;
|
r.in.total = &total;
|
||||||
r.in.unknown = NULL;
|
r.in.unknown = &total;
|
||||||
r.in.info = &e;
|
r.in.info = &e;
|
||||||
|
|
||||||
e.level = r.in.level;
|
e.level = r.in.level;
|
||||||
e.e.info1 = &e2;
|
e.e.info1 = &e1;
|
||||||
e.e.info1->count = 0;
|
e.e.info1->count = 0;
|
||||||
e.e.info1->s = &s;
|
e.e.info1->s = &s;
|
||||||
s.path = NULL;
|
s.path = NULL;
|
||||||
|
|
||||||
|
|
||||||
status = dcerpc_dfs_Enum(p, mem_ctx, &r);
|
status = dcerpc_dfs_Enum(p, mem_ctx, &r);
|
||||||
if (!NT_STATUS_IS_OK(status)) {
|
if (!NT_STATUS_IS_OK(status)) {
|
||||||
@ -70,13 +68,26 @@ static BOOL test_Enum(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx)
|
|||||||
return False;
|
return False;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
printf("Received %d records\n", r.out.total?*r.out.total:-1);
|
||||||
|
|
||||||
NDR_PRINT_DEBUG(dfs_EnumStruct, r.out.info);
|
NDR_PRINT_DEBUG(dfs_EnumStruct, r.out.info);
|
||||||
|
|
||||||
printf("total=%d\n", r.out.total?*r.out.total:-1);
|
|
||||||
|
|
||||||
return True;
|
return True;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static BOOL test_Enum(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx)
|
||||||
|
{
|
||||||
|
BOOL ret = True;
|
||||||
|
uint16 levels[] = {1, 2, 3, 4, 200, 300};
|
||||||
|
int i;
|
||||||
|
for (i=0;i<ARRAY_SIZE(levels);i++) {
|
||||||
|
if (!test_EnumLevel(p, mem_ctx, levels[i])) {
|
||||||
|
ret = False;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
BOOL torture_rpc_dfs(int dummy)
|
BOOL torture_rpc_dfs(int dummy)
|
||||||
{
|
{
|
||||||
NTSTATUS status;
|
NTSTATUS status;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user