Exemple #1
0
NTSTATUS ndr_check_string_terminator(struct ndr_pull *ndr, uint32_t count, uint32_t element_size)
{
	uint32_t i;
	struct ndr_pull_save save_offset;

	ndr_pull_save(ndr, &save_offset);
	ndr_pull_advance(ndr, (count - 1) * element_size);
	NDR_PULL_NEED_BYTES(ndr, element_size);

	for (i = 0; i < element_size; i++) {
		 if (ndr->data[ndr->offset+i] != 0) {
			ndr_pull_restore(ndr, &save_offset);

			return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "String terminator not present or outside string boundaries");
		 }
	}

	ndr_pull_restore(ndr, &save_offset);

	return NT_STATUS_OK;
}
Exemple #2
0
_PUBLIC_ NTSTATUS ndr_pull_WbemQualifier(struct ndr_pull *ndr, int ndr_flags, struct WbemQualifier *r)
{
        uint32_t _ptr_name;
        TALLOC_CTX *_mem_save_name_0;
        if (ndr_flags & NDR_SCALARS) {
                NDR_CHECK(ndr_pull_align(ndr, 4));
                NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_name));
                if (_ptr_name != 0xFFFFFFFF) {
                        NDR_PULL_ALLOC(ndr, r->name);
                        NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->name, _ptr_name));
                } else {
                        r->name = NULL;
                }
                NDR_CHECK(ndr_pull_WBEM_FLAVOR_TYPE(ndr, NDR_SCALARS, &r->flavors));
                NDR_CHECK(ndr_pull_CIMTYPE_ENUMERATION(ndr, NDR_SCALARS, &r->cimtype));
                NDR_CHECK(ndr_pull_set_switch_value(ndr, &r->value, r->cimtype & CIM_TYPEMASK));
                NDR_CHECK(ndr_pull_CIMVAR(ndr, NDR_SCALARS, &r->value));
        }
        if (ndr_flags & NDR_BUFFERS) {
		uint32_t relofs;
		relofs = ndr_token_peek(&ndr->relative_list, r->name);
		if (relofs & 0x80000000) {
			relofs &= 0xFF;
			if ((relofs < sizeof(qualifier_keys)/sizeof(qualifier_keys[0])) && qualifier_keys[relofs]) {
				r->name = talloc_strdup(ndr->current_mem_ctx, qualifier_keys[relofs]);
			} else {
				r->name = talloc_asprintf(ndr->current_mem_ctx, "%s%d", qn_unknown, relofs);
			}
		} else if (r->name) {
                        struct ndr_pull_save _relative_save;
                        ndr_pull_save(ndr, &_relative_save);
                        NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->name));
                        _mem_save_name_0 = NDR_PULL_GET_MEM_CTX(ndr);
                        NDR_PULL_SET_MEM_CTX(ndr, r->name, 0);
                        NDR_CHECK(ndr_pull_CIMSTRING(ndr, NDR_SCALARS, &r->name));
                        NDR_PULL_SET_MEM_CTX(ndr, _mem_save_name_0, 0);
                        ndr_pull_restore(ndr, &_relative_save);
                }
                NDR_CHECK(ndr_pull_CIMVAR(ndr, NDR_BUFFERS, &r->value));
        }
        return NT_STATUS_OK;
}
NTSTATUS ndr_pull_security_descriptor(struct ndr_pull *ndr, int ndr_flags, struct security_descriptor *r)
{
    uint32_t _ptr_owner_sid;
    TALLOC_CTX *_mem_save_owner_sid_0;
    uint32_t _ptr_group_sid;
    TALLOC_CTX *_mem_save_group_sid_0;
    uint32_t _ptr_sacl;
    TALLOC_CTX *_mem_save_sacl_0;
    uint32_t _ptr_dacl;
    TALLOC_CTX *_mem_save_dacl_0;
    {
        uint32_t _flags_save_STRUCT = ndr->flags;
        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_LITTLE_ENDIAN);
        if (ndr_flags & NDR_SCALARS) {
            NDR_CHECK(ndr_pull_align(ndr, 4));
            NDR_CHECK(ndr_pull_security_descriptor_revision(ndr, NDR_SCALARS, &r->revision));
            NDR_CHECK(ndr_pull_security_descriptor_type(ndr, NDR_SCALARS, &r->type));
            NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_owner_sid));
            if (_ptr_owner_sid) {
                NDR_PULL_ALLOC(ndr, r->owner_sid);
                NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->owner_sid, _ptr_owner_sid));
            } else {
                r->owner_sid = NULL;
            }
            NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_group_sid));
            if (_ptr_group_sid) {
                NDR_PULL_ALLOC(ndr, r->group_sid);
                NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->group_sid, _ptr_group_sid));
            } else {
                r->group_sid = NULL;
            }
            NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_sacl));
            if (_ptr_sacl) {
                NDR_PULL_ALLOC(ndr, r->sacl);
                NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->sacl, _ptr_sacl));
            } else {
                r->sacl = NULL;
            }
            NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_dacl));
            if (_ptr_dacl) {
                NDR_PULL_ALLOC(ndr, r->dacl);
                NDR_CHECK(ndr_pull_relative_ptr1(ndr, r->dacl, _ptr_dacl));
            } else {
                r->dacl = NULL;
            }
        }
        if (ndr_flags & NDR_BUFFERS) {
            if (r->owner_sid) {
                struct ndr_pull_save _relative_save;
                ndr_pull_save(ndr, &_relative_save);
                NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->owner_sid));
                _mem_save_owner_sid_0 = NDR_PULL_GET_MEM_CTX(ndr);
                NDR_PULL_SET_MEM_CTX(ndr, r->owner_sid, 0);
                NDR_CHECK(ndr_pull_dom_sid(ndr, NDR_SCALARS, r->owner_sid));
                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_owner_sid_0, 0);
                ndr_pull_restore(ndr, &_relative_save);
            }
            if (r->group_sid) {
                struct ndr_pull_save _relative_save;
                ndr_pull_save(ndr, &_relative_save);
                NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->group_sid));
                _mem_save_group_sid_0 = NDR_PULL_GET_MEM_CTX(ndr);
                NDR_PULL_SET_MEM_CTX(ndr, r->group_sid, 0);
                NDR_CHECK(ndr_pull_dom_sid(ndr, NDR_SCALARS, r->group_sid));
                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_group_sid_0, 0);
                ndr_pull_restore(ndr, &_relative_save);
            }
            if (r->sacl) {
                struct ndr_pull_save _relative_save;
                ndr_pull_save(ndr, &_relative_save);
                NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->sacl));
                _mem_save_sacl_0 = NDR_PULL_GET_MEM_CTX(ndr);
                NDR_PULL_SET_MEM_CTX(ndr, r->sacl, 0);
                NDR_CHECK(ndr_pull_security_acl(ndr, NDR_SCALARS|NDR_BUFFERS, r->sacl));
                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_sacl_0, 0);
                ndr_pull_restore(ndr, &_relative_save);
            }
            if (r->dacl) {
                struct ndr_pull_save _relative_save;
                ndr_pull_save(ndr, &_relative_save);
                NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->dacl));
                _mem_save_dacl_0 = NDR_PULL_GET_MEM_CTX(ndr);
                NDR_PULL_SET_MEM_CTX(ndr, r->dacl, 0);
                NDR_CHECK(ndr_pull_security_acl(ndr, NDR_SCALARS|NDR_BUFFERS, r->dacl));
                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_dacl_0, 0);
                ndr_pull_restore(ndr, &_relative_save);
            }
        }
        ndr->flags = _flags_save_STRUCT;
    }
    return NT_STATUS_OK;
}