mirror of
https://github.com/samba-team/samba.git
synced 2024-12-23 17:34:34 +03:00
Merge branch 'master' of ssh://git.samba.org/data/git/samba
This commit is contained in:
commit
2ce72b5a69
@ -29,8 +29,9 @@
|
||||
#include "includes.h"
|
||||
#include "librpc/ndr/libndr.h"
|
||||
#include "../lib/util/dlinklist.h"
|
||||
#include "librpc/gen_ndr/dcerpc.h"
|
||||
#if _SAMBA_BUILD_ == 4
|
||||
#include "param/param.h"
|
||||
#endif
|
||||
|
||||
#define NDR_BASE_MARSHALL_SIZE 1024
|
||||
|
||||
@ -163,16 +164,20 @@ _PUBLIC_ enum ndr_err_code ndr_push_expand(struct ndr_push *ndr, uint32_t extra_
|
||||
return NDR_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
_PUBLIC_ void ndr_print_debug_helper(struct ndr_print *ndr, const char *format, ...)
|
||||
_PUBLIC_ void ndr_print_debug_helper(struct ndr_print *ndr, const char *format, ...)
|
||||
{
|
||||
va_list ap;
|
||||
char *s = NULL;
|
||||
int i;
|
||||
int i, ret;
|
||||
|
||||
va_start(ap, format);
|
||||
vasprintf(&s, format, ap);
|
||||
ret = vasprintf(&s, format, ap);
|
||||
va_end(ap);
|
||||
|
||||
if (ret == -1) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (i=0;i<ndr->depth;i++) {
|
||||
DEBUGADD(0,(" "));
|
||||
}
|
||||
@ -350,12 +355,17 @@ _PUBLIC_ enum ndr_err_code ndr_pull_error(struct ndr_pull *ndr,
|
||||
{
|
||||
char *s=NULL;
|
||||
va_list ap;
|
||||
int ret;
|
||||
|
||||
va_start(ap, format);
|
||||
vasprintf(&s, format, ap);
|
||||
ret = vasprintf(&s, format, ap);
|
||||
va_end(ap);
|
||||
|
||||
DEBUG(3,("ndr_pull_error(%u): %s\n", ndr_err, s));
|
||||
if (ret == -1) {
|
||||
return NDR_ERR_ALLOC;
|
||||
}
|
||||
|
||||
DEBUG(1,("ndr_pull_error(%u): %s\n", ndr_err, s));
|
||||
|
||||
free(s);
|
||||
|
||||
@ -367,16 +377,21 @@ _PUBLIC_ enum ndr_err_code ndr_pull_error(struct ndr_pull *ndr,
|
||||
*/
|
||||
_PUBLIC_ enum ndr_err_code ndr_push_error(struct ndr_push *ndr,
|
||||
enum ndr_err_code ndr_err,
|
||||
const char *format, ...)
|
||||
const char *format, ...)
|
||||
{
|
||||
char *s=NULL;
|
||||
va_list ap;
|
||||
int ret;
|
||||
|
||||
va_start(ap, format);
|
||||
vasprintf(&s, format, ap);
|
||||
ret = vasprintf(&s, format, ap);
|
||||
va_end(ap);
|
||||
|
||||
DEBUG(3,("ndr_push_error(%u): %s\n", ndr_err, s));
|
||||
if (ret == -1) {
|
||||
return NDR_ERR_ALLOC;
|
||||
}
|
||||
|
||||
DEBUG(1,("ndr_push_error(%u): %s\n", ndr_err, s));
|
||||
|
||||
free(s);
|
||||
|
@ -26,6 +26,8 @@
|
||||
#include "librpc/ndr/libndr.h"
|
||||
#include "librpc/ndr/ndr_table.h"
|
||||
#include "param/param.h"
|
||||
#else
|
||||
#define _NORETURN_
|
||||
#endif
|
||||
|
||||
static const struct ndr_interface_call *find_function(
|
@ -256,15 +256,16 @@ COMPRESSION_OBJ = ../lib/compression/mszip.o
|
||||
DRSUAPI_OBJ = $(LIBNDR_DRSUAPI_OBJ) \
|
||||
$(COMPRESSION_OBJ)
|
||||
|
||||
LIBNDR_OBJ = librpc/ndr/ndr_basic.o \
|
||||
librpc/ndr/ndr.o \
|
||||
librpc/ndr/ndr_misc.o \
|
||||
LIBNDR_OBJ = ../librpc/ndr/ndr_basic.o \
|
||||
../librpc/ndr/ndr.o \
|
||||
../librpc/ndr/ndr_misc.o \
|
||||
librpc/gen_ndr/ndr_misc.o \
|
||||
librpc/gen_ndr/ndr_security.o \
|
||||
librpc/ndr/ndr_sec_helper.o \
|
||||
librpc/ndr/ndr_string.o \
|
||||
librpc/ndr/sid.o \
|
||||
librpc/ndr/uuid.o
|
||||
../librpc/ndr/uuid.o \
|
||||
librpc/ndr/util.o
|
||||
|
||||
RPCCLIENT_NDR_OBJ = rpc_client/ndr.o
|
||||
|
||||
@ -967,7 +968,7 @@ REPLACETORT_OBJ = @libreplacedir@/test/testsuite.o \
|
||||
@libreplacedir@/test/main.o \
|
||||
$(LIBREPLACE_OBJ)
|
||||
|
||||
NDRDUMP_OBJ = librpc/tools/ndrdump.o \
|
||||
NDRDUMP_OBJ = ../librpc/tools/ndrdump.o \
|
||||
$(PARAM_OBJ) $(LIBNDR_GEN_OBJ) \
|
||||
$(LIBSAMBA_OBJ) $(LIB_NONSMBD_OBJ) $(POPT_LIB_OBJ) \
|
||||
librpc/gen_ndr/ndr_svcctl.o
|
||||
|
@ -1291,6 +1291,7 @@ enum remote_arch_types get_remote_arch(void);
|
||||
void print_asc(int level, const unsigned char *buf,int len);
|
||||
void dump_data(int level, const unsigned char *buf1,int len);
|
||||
void dump_data_pw(const char *msg, const uchar * data, size_t len);
|
||||
void dump_data_skip_zeros(int level, const uint8_t *buf, int len);
|
||||
const char *tab_depth(int level, int depth);
|
||||
int str_checksum(const char *s);
|
||||
void zero_free(void *p, size_t size);
|
||||
@ -3758,8 +3759,6 @@ NTSTATUS rpc_wkssvc_init(void);
|
||||
_PUBLIC_ size_t ndr_align_size(uint32_t offset, size_t n);
|
||||
_PUBLIC_ struct ndr_pull *ndr_pull_init_blob(const DATA_BLOB *blob, TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience);
|
||||
_PUBLIC_ enum ndr_err_code ndr_pull_advance(struct ndr_pull *ndr, uint32_t size);
|
||||
_PUBLIC_ void ndr_pull_save(struct ndr_pull *ndr, struct ndr_pull_save *save);
|
||||
_PUBLIC_ void ndr_pull_restore(struct ndr_pull *ndr, struct ndr_pull_save *save);
|
||||
_PUBLIC_ struct ndr_push *ndr_push_init_ctx(TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience);
|
||||
_PUBLIC_ DATA_BLOB ndr_push_blob(struct ndr_push *ndr);
|
||||
_PUBLIC_ enum ndr_err_code ndr_push_expand(struct ndr_push *ndr, uint32_t extra_size);
|
||||
@ -3822,13 +3821,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_struct_blob(const DATA_BLOB *blob, TALLOC_CT
|
||||
_PUBLIC_ enum ndr_err_code ndr_pull_struct_blob_all(const DATA_BLOB *blob, TALLOC_CTX *mem_ctx,
|
||||
struct smb_iconv_convenience *iconv_convenience,
|
||||
void *p, ndr_pull_flags_fn_t fn);
|
||||
_PUBLIC_ enum ndr_err_code ndr_pull_union_blob(const DATA_BLOB *blob, TALLOC_CTX *mem_ctx, void *p,
|
||||
uint32_t level, ndr_pull_flags_fn_t fn);
|
||||
_PUBLIC_ enum ndr_err_code ndr_pull_union_blob_all(const DATA_BLOB *blob, TALLOC_CTX *mem_ctx, void *p,
|
||||
uint32_t level, ndr_pull_flags_fn_t fn);
|
||||
_PUBLIC_ enum ndr_err_code ndr_push_struct_blob(DATA_BLOB *blob, TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience, const void *p, ndr_push_flags_fn_t fn);
|
||||
_PUBLIC_ enum ndr_err_code ndr_push_union_blob(DATA_BLOB *blob, TALLOC_CTX *mem_ctx, void *p,
|
||||
uint32_t level, ndr_push_flags_fn_t fn);
|
||||
_PUBLIC_ size_t ndr_size_struct(const void *p, int flags, ndr_push_flags_fn_t push);
|
||||
_PUBLIC_ size_t ndr_size_union(const void *p, int flags, uint32_t level, ndr_push_flags_fn_t push);
|
||||
_PUBLIC_ uint32_t ndr_push_get_relative_base_offset(struct ndr_push *ndr);
|
||||
@ -3884,8 +3877,6 @@ _PUBLIC_ enum ndr_err_code ndr_pull_align(struct ndr_pull *ndr, size_t size);
|
||||
_PUBLIC_ enum ndr_err_code ndr_push_bytes(struct ndr_push *ndr, const uint8_t *data, uint32_t n);
|
||||
_PUBLIC_ enum ndr_err_code ndr_push_zero(struct ndr_push *ndr, uint32_t n);
|
||||
_PUBLIC_ enum ndr_err_code ndr_push_array_uint8(struct ndr_push *ndr, int ndr_flags, const uint8_t *data, uint32_t n);
|
||||
_PUBLIC_ void ndr_push_save(struct ndr_push *ndr, struct ndr_push_save *save);
|
||||
_PUBLIC_ void ndr_push_restore(struct ndr_push *ndr, struct ndr_push_save *save);
|
||||
_PUBLIC_ enum ndr_err_code ndr_push_unique_ptr(struct ndr_push *ndr, const void *p);
|
||||
_PUBLIC_ enum ndr_err_code ndr_push_full_ptr(struct ndr_push *ndr, const void *p);
|
||||
_PUBLIC_ enum ndr_err_code ndr_push_ref_ptr(struct ndr_push *ndr);
|
||||
|
@ -2217,25 +2217,60 @@ void print_asc(int level, const unsigned char *buf,int len)
|
||||
DEBUG(level,("%c", isprint(buf[i])?buf[i]:'.'));
|
||||
}
|
||||
|
||||
void dump_data(int level, const unsigned char *buf1,int len)
|
||||
/**
|
||||
* Write dump of binary data to the log file.
|
||||
*
|
||||
* The data is only written if the log level is at least level.
|
||||
*/
|
||||
static void _dump_data(int level, const uint8_t *buf, int len,
|
||||
bool omit_zero_bytes)
|
||||
{
|
||||
const unsigned char *buf = (const unsigned char *)buf1;
|
||||
int i=0;
|
||||
const uint8_t empty[16];
|
||||
bool skipped = false;
|
||||
|
||||
if (len<=0) return;
|
||||
|
||||
if (!DEBUGLVL(level)) return;
|
||||
|
||||
DEBUGADD(level,("[%03X] ",i));
|
||||
|
||||
memset(&empty, '\0', 16);
|
||||
|
||||
for (i=0;i<len;) {
|
||||
|
||||
if (i%16 == 0) {
|
||||
if ((omit_zero_bytes == true) &&
|
||||
(i > 0) &&
|
||||
(len > i+16) &&
|
||||
(memcmp(&buf[i], &empty, 16) == 0))
|
||||
{
|
||||
i +=16;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (i<len) {
|
||||
DEBUGADD(level,("[%04X] ",i));
|
||||
}
|
||||
}
|
||||
|
||||
DEBUGADD(level,("%02X ",(int)buf[i]));
|
||||
i++;
|
||||
if (i%8 == 0) DEBUGADD(level,(" "));
|
||||
if (i%16 == 0) {
|
||||
if (i%8 == 0) DEBUGADD(level,(" "));
|
||||
if (i%16 == 0) {
|
||||
|
||||
print_asc(level,&buf[i-16],8); DEBUGADD(level,(" "));
|
||||
print_asc(level,&buf[i-8],8); DEBUGADD(level,("\n"));
|
||||
if (i<len) DEBUGADD(level,("[%03X] ",i));
|
||||
|
||||
if ((omit_zero_bytes == true) &&
|
||||
(len > i+16) &&
|
||||
(memcmp(&buf[i], &empty, 16) == 0)) {
|
||||
if (!skipped) {
|
||||
DEBUGADD(level,("skipping zero buffer bytes\n"));
|
||||
skipped = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (i%16) {
|
||||
int n;
|
||||
n = 16 - (i%16);
|
||||
@ -2248,8 +2283,32 @@ void dump_data(int level, const unsigned char *buf1,int len)
|
||||
if (n>0) print_asc(level,&buf[i-n],n);
|
||||
DEBUGADD(level,("\n"));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Write dump of binary data to the log file.
|
||||
*
|
||||
* The data is only written if the log level is at least level.
|
||||
*/
|
||||
_PUBLIC_ void dump_data(int level, const uint8_t *buf, int len)
|
||||
{
|
||||
_dump_data(level, buf, len, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Write dump of binary data to the log file.
|
||||
*
|
||||
* The data is only written if the log level is at least level.
|
||||
* 16 zero bytes in a row are ommited
|
||||
*/
|
||||
_PUBLIC_ void dump_data_skip_zeros(int level, const uint8_t *buf, int len)
|
||||
{
|
||||
_dump_data(level, buf, len, true);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void dump_data_pw(const char *msg, const uchar * data, size_t len)
|
||||
{
|
||||
#ifdef DEBUG_PASSWORD
|
||||
|
@ -1,6 +1,7 @@
|
||||
/*
|
||||
Unix SMB/CIFS implementation.
|
||||
rpc interface definitions
|
||||
|
||||
Copyright (C) Andrew Tridgell 2003
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
@ -25,6 +26,11 @@
|
||||
#include "librpc/gen_ndr/misc.h"
|
||||
#include "librpc/gen_ndr/security.h"
|
||||
|
||||
/* Samba 3 doesn't use iconv_convenience: */
|
||||
extern void *global_loadparm;
|
||||
extern void *cmdline_lp_ctx;
|
||||
struct smb_iconv_convenience *lp_iconv_convenience(void *lp_ctx);
|
||||
|
||||
/*
|
||||
this provides definitions for the libcli/rpc/ MSRPC library
|
||||
*/
|
||||
@ -53,6 +59,8 @@ struct ndr_pull {
|
||||
uint32_t data_size;
|
||||
uint32_t offset;
|
||||
|
||||
struct smb_iconv_convenience *iconv_convenience;
|
||||
|
||||
uint32_t relative_base_offset;
|
||||
struct ndr_token_list *relative_base_list;
|
||||
|
||||
@ -68,12 +76,6 @@ struct ndr_pull {
|
||||
uint32_t ptr_count;
|
||||
};
|
||||
|
||||
struct ndr_pull_save {
|
||||
uint32_t data_size;
|
||||
uint32_t offset;
|
||||
struct ndr_pull_save *next;
|
||||
};
|
||||
|
||||
/* structure passed to functions that generate NDR formatted data */
|
||||
struct ndr_push {
|
||||
uint32_t flags; /* LIBNDR_FLAG_* */
|
||||
@ -91,14 +93,10 @@ struct ndr_push {
|
||||
|
||||
/* this is used to ensure we generate unique reference IDs */
|
||||
uint32_t ptr_count;
|
||||
};
|
||||
|
||||
struct ndr_push_save {
|
||||
uint32_t offset;
|
||||
struct ndr_push_save *next;
|
||||
struct smb_iconv_convenience *iconv_convenience;
|
||||
};
|
||||
|
||||
|
||||
/* structure passed to functions that print IDL structures */
|
||||
struct ndr_print {
|
||||
uint32_t flags; /* LIBNDR_FLAG_* */
|
||||
@ -118,11 +116,9 @@ struct ndr_print {
|
||||
#define LIBNDR_FLAG_STR_NULLTERM (1<<6)
|
||||
#define LIBNDR_FLAG_STR_SIZE2 (1<<7)
|
||||
#define LIBNDR_FLAG_STR_BYTESIZE (1<<8)
|
||||
#define LIBNDR_FLAG_STR_FIXLEN32 (1<<9)
|
||||
#define LIBNDR_FLAG_STR_CONFORMANT (1<<10)
|
||||
#define LIBNDR_FLAG_STR_CHARLEN (1<<11)
|
||||
#define LIBNDR_FLAG_STR_UTF8 (1<<12)
|
||||
#define LIBNDR_FLAG_STR_FIXLEN15 (1<<13)
|
||||
#define LIBNDR_STRING_FLAGS (0x7FFC)
|
||||
|
||||
|
||||
@ -149,7 +145,7 @@ struct ndr_print {
|
||||
/* set to avoid recursion in ndr_size_*() calculation */
|
||||
#define LIBNDR_FLAG_NO_NDR_SIZE (1<<31)
|
||||
|
||||
/* useful macro for debugging with DEBUG */
|
||||
/* useful macro for debugging */
|
||||
#define NDR_PRINT_DEBUG(type, p) ndr_print_debug((ndr_print_fn_t)ndr_print_ ##type, #p, p)
|
||||
#define NDR_PRINT_UNION_DEBUG(type, level, p) ndr_print_union_debug((ndr_print_fn_t)ndr_print_ ##type, #p, level, p)
|
||||
#define NDR_PRINT_FUNCTION_DEBUG(type, flags, p) ndr_print_function_debug((ndr_print_function_t)ndr_print_ ##type, #type, flags, p)
|
||||
@ -337,18 +333,183 @@ struct ndr_interface_list {
|
||||
const struct ndr_interface_table *table;
|
||||
};
|
||||
|
||||
/* FIXME: Use represent_as instead */
|
||||
struct dom_sid;
|
||||
enum ndr_err_code ndr_push_dom_sid2(struct ndr_push *ndr, int ndr_flags, const struct dom_sid *sid);
|
||||
enum ndr_err_code ndr_pull_dom_sid2(struct ndr_pull *ndr, int ndr_flags, struct dom_sid *sid);
|
||||
void ndr_print_dom_sid2(struct ndr_print *ndr, const char *name, const struct dom_sid *sid);
|
||||
enum ndr_err_code ndr_push_dom_sid28(struct ndr_push *ndr, int ndr_flags, const struct dom_sid *sid);
|
||||
enum ndr_err_code ndr_pull_dom_sid28(struct ndr_pull *ndr, int ndr_flags, struct dom_sid *sid);
|
||||
void ndr_print_dom_sid28(struct ndr_print *ndr, const char *name, const struct dom_sid *sid);
|
||||
size_t ndr_size_dom_sid28(const struct dom_sid *sid, int flags);
|
||||
enum ndr_err_code ndr_push_dom_sid0(struct ndr_push *ndr, int ndr_flags, const struct dom_sid *sid);
|
||||
enum ndr_err_code ndr_pull_dom_sid0(struct ndr_pull *ndr, int ndr_flags, struct dom_sid *sid);
|
||||
void ndr_print_dom_sid0(struct ndr_print *ndr, const char *name, const struct dom_sid *sid);
|
||||
size_t ndr_size_dom_sid0(const struct dom_sid *sid, int flags);
|
||||
void ndr_print_ipv4_addr(struct ndr_print *ndr, const char *name, const struct in_addr *_ip);
|
||||
void ndr_print_GUID(struct ndr_print *ndr, const char *name, const struct GUID *guid);
|
||||
bool ndr_syntax_id_equal(const struct ndr_syntax_id *i1, const struct ndr_syntax_id *i2);
|
||||
enum ndr_err_code ndr_push_struct_blob(DATA_BLOB *blob, TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience, const void *p, ndr_push_flags_fn_t fn);
|
||||
enum ndr_err_code ndr_push_union_blob(DATA_BLOB *blob, TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience, void *p, uint32_t level, ndr_push_flags_fn_t fn);
|
||||
size_t ndr_size_struct(const void *p, int flags, ndr_push_flags_fn_t push);
|
||||
size_t ndr_size_union(const void *p, int flags, uint32_t level, ndr_push_flags_fn_t push);
|
||||
uint32_t ndr_push_get_relative_base_offset(struct ndr_push *ndr);
|
||||
void ndr_push_restore_relative_base_offset(struct ndr_push *ndr, uint32_t offset);
|
||||
enum ndr_err_code ndr_push_setup_relative_base_offset1(struct ndr_push *ndr, const void *p, uint32_t offset);
|
||||
enum ndr_err_code ndr_push_setup_relative_base_offset2(struct ndr_push *ndr, const void *p);
|
||||
enum ndr_err_code ndr_push_relative_ptr1(struct ndr_push *ndr, const void *p);
|
||||
enum ndr_err_code ndr_push_relative_ptr2(struct ndr_push *ndr, const void *p);
|
||||
uint32_t ndr_pull_get_relative_base_offset(struct ndr_pull *ndr);
|
||||
void ndr_pull_restore_relative_base_offset(struct ndr_pull *ndr, uint32_t offset);
|
||||
enum ndr_err_code ndr_pull_setup_relative_base_offset1(struct ndr_pull *ndr, const void *p, uint32_t offset);
|
||||
enum ndr_err_code ndr_pull_setup_relative_base_offset2(struct ndr_pull *ndr, const void *p);
|
||||
enum ndr_err_code ndr_pull_relative_ptr1(struct ndr_pull *ndr, const void *p, uint32_t rel_offset);
|
||||
enum ndr_err_code ndr_pull_relative_ptr2(struct ndr_pull *ndr, const void *p);
|
||||
size_t ndr_align_size(uint32_t offset, size_t n);
|
||||
struct ndr_pull *ndr_pull_init_blob(const DATA_BLOB *blob, TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience);
|
||||
enum ndr_err_code ndr_pull_advance(struct ndr_pull *ndr, uint32_t size);
|
||||
struct ndr_push *ndr_push_init_ctx(TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience);
|
||||
DATA_BLOB ndr_push_blob(struct ndr_push *ndr);
|
||||
enum ndr_err_code ndr_push_expand(struct ndr_push *ndr, uint32_t extra_size);
|
||||
void ndr_print_debug_helper(struct ndr_print *ndr, const char *format, ...) PRINTF_ATTRIBUTE(2,3);
|
||||
void ndr_print_string_helper(struct ndr_print *ndr, const char *format, ...) PRINTF_ATTRIBUTE(2,3);
|
||||
void ndr_print_debug(ndr_print_fn_t fn, const char *name, void *ptr);
|
||||
void ndr_print_union_debug(ndr_print_fn_t fn, const char *name, uint32_t level, void *ptr);
|
||||
void ndr_print_function_debug(ndr_print_function_t fn, const char *name, int flags, void *ptr);
|
||||
char *ndr_print_struct_string(TALLOC_CTX *mem_ctx, ndr_print_fn_t fn, const char *name, void *ptr);
|
||||
char *ndr_print_union_string(TALLOC_CTX *mem_ctx, ndr_print_fn_t fn, const char *name, uint32_t level, void *ptr);
|
||||
char *ndr_print_function_string(TALLOC_CTX *mem_ctx,
|
||||
ndr_print_function_t fn, const char *name,
|
||||
int flags, void *ptr);
|
||||
void ndr_set_flags(uint32_t *pflags, uint32_t new_flags);
|
||||
enum ndr_err_code ndr_pull_error(struct ndr_pull *ndr,
|
||||
enum ndr_err_code ndr_err,
|
||||
const char *format, ...) PRINTF_ATTRIBUTE(3,4);
|
||||
enum ndr_err_code ndr_push_error(struct ndr_push *ndr,
|
||||
enum ndr_err_code ndr_err,
|
||||
const char *format, ...) PRINTF_ATTRIBUTE(3,4);
|
||||
enum ndr_err_code ndr_pull_subcontext_start(struct ndr_pull *ndr,
|
||||
struct ndr_pull **_subndr,
|
||||
size_t header_size,
|
||||
ssize_t size_is);
|
||||
enum ndr_err_code ndr_pull_subcontext_end(struct ndr_pull *ndr,
|
||||
struct ndr_pull *subndr,
|
||||
size_t header_size,
|
||||
ssize_t size_is);
|
||||
enum ndr_err_code ndr_push_subcontext_start(struct ndr_push *ndr,
|
||||
struct ndr_push **_subndr,
|
||||
size_t header_size,
|
||||
ssize_t size_is);
|
||||
enum ndr_err_code ndr_push_subcontext_end(struct ndr_push *ndr,
|
||||
struct ndr_push *subndr,
|
||||
size_t header_size,
|
||||
ssize_t size_is);
|
||||
enum ndr_err_code ndr_token_store(TALLOC_CTX *mem_ctx,
|
||||
struct ndr_token_list **list,
|
||||
const void *key,
|
||||
uint32_t value);
|
||||
enum ndr_err_code ndr_token_retrieve_cmp_fn(struct ndr_token_list **list, const void *key, uint32_t *v, comparison_fn_t _cmp_fn, bool _remove_tok);
|
||||
enum ndr_err_code ndr_token_retrieve(struct ndr_token_list **list, const void *key, uint32_t *v);
|
||||
uint32_t ndr_token_peek(struct ndr_token_list **list, const void *key);
|
||||
enum ndr_err_code ndr_pull_array_size(struct ndr_pull *ndr, const void *p);
|
||||
uint32_t ndr_get_array_size(struct ndr_pull *ndr, const void *p);
|
||||
enum ndr_err_code ndr_check_array_size(struct ndr_pull *ndr, void *p, uint32_t size);
|
||||
enum ndr_err_code ndr_pull_array_length(struct ndr_pull *ndr, const void *p);
|
||||
uint32_t ndr_get_array_length(struct ndr_pull *ndr, const void *p);
|
||||
enum ndr_err_code ndr_check_array_length(struct ndr_pull *ndr, void *p, uint32_t length);
|
||||
enum ndr_err_code ndr_push_set_switch_value(struct ndr_push *ndr, const void *p, uint32_t val);
|
||||
enum ndr_err_code ndr_pull_set_switch_value(struct ndr_pull *ndr, const void *p, uint32_t val);
|
||||
enum ndr_err_code ndr_print_set_switch_value(struct ndr_print *ndr, const void *p, uint32_t val);
|
||||
uint32_t ndr_push_get_switch_value(struct ndr_push *ndr, const void *p);
|
||||
uint32_t ndr_pull_get_switch_value(struct ndr_pull *ndr, const void *p);
|
||||
uint32_t ndr_print_get_switch_value(struct ndr_print *ndr, const void *p);
|
||||
enum ndr_err_code ndr_pull_struct_blob(const DATA_BLOB *blob, TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience, void *p, ndr_pull_flags_fn_t fn);
|
||||
enum ndr_err_code ndr_pull_struct_blob_all(const DATA_BLOB *blob, TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience, void *p, ndr_pull_flags_fn_t fn);
|
||||
enum ndr_err_code ndr_pull_union_blob(const DATA_BLOB *blob, TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience, void *p, uint32_t level, ndr_pull_flags_fn_t fn);
|
||||
enum ndr_err_code ndr_pull_union_blob_all(const DATA_BLOB *blob, TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience, void *p, uint32_t level, ndr_pull_flags_fn_t fn);
|
||||
|
||||
/* from libndr_basic.h */
|
||||
#define NDR_SCALAR_PROTO(name, type) \
|
||||
enum ndr_err_code ndr_push_ ## name(struct ndr_push *ndr, int ndr_flags, type v); \
|
||||
enum ndr_err_code ndr_pull_ ## name(struct ndr_pull *ndr, int ndr_flags, type *v); \
|
||||
void ndr_print_ ## name(struct ndr_print *ndr, const char *var_name, type v);
|
||||
void ndr_print_ ## name(struct ndr_print *ndr, const char *var_name, type v);
|
||||
|
||||
#define NDR_BUFFER_PROTO(name, type) \
|
||||
enum ndr_err_code ndr_push_ ## name(struct ndr_push *ndr, int ndr_flags, const type *v); \
|
||||
enum ndr_err_code ndr_pull_ ## name(struct ndr_pull *ndr, int ndr_flags, type *v); \
|
||||
void ndr_print_ ## name(struct ndr_print *ndr, const char *var_name, const type *v);
|
||||
void ndr_print_ ## name(struct ndr_print *ndr, const char *var_name, const type *v);
|
||||
|
||||
NDR_SCALAR_PROTO(uint8, uint8_t)
|
||||
NDR_SCALAR_PROTO(int8, int8_t)
|
||||
NDR_SCALAR_PROTO(uint16, uint16_t)
|
||||
NDR_SCALAR_PROTO(int16, int16_t)
|
||||
NDR_SCALAR_PROTO(uint32, uint32_t)
|
||||
NDR_SCALAR_PROTO(int32, int32_t)
|
||||
NDR_SCALAR_PROTO(udlong, uint64_t)
|
||||
NDR_SCALAR_PROTO(udlongr, uint64_t)
|
||||
NDR_SCALAR_PROTO(dlong, int64_t)
|
||||
NDR_SCALAR_PROTO(hyper, uint64_t)
|
||||
NDR_SCALAR_PROTO(pointer, void *)
|
||||
NDR_SCALAR_PROTO(time_t, time_t)
|
||||
NDR_SCALAR_PROTO(NTSTATUS, NTSTATUS)
|
||||
NDR_SCALAR_PROTO(WERROR, WERROR)
|
||||
NDR_SCALAR_PROTO(NTTIME, NTTIME)
|
||||
NDR_SCALAR_PROTO(NTTIME_1sec, NTTIME)
|
||||
NDR_SCALAR_PROTO(NTTIME_hyper, NTTIME)
|
||||
NDR_SCALAR_PROTO(DATA_BLOB, DATA_BLOB)
|
||||
NDR_SCALAR_PROTO(ipv4address, const char *)
|
||||
NDR_SCALAR_PROTO(string, const char *)
|
||||
|
||||
void ndr_print_dom_sid28(struct ndr_print *ndr, const char *name, const struct dom_sid *sid);
|
||||
size_t ndr_size_dom_sid28(const struct dom_sid *sid, int flags);
|
||||
enum ndr_err_code ndr_pull_policy_handle(struct ndr_pull *ndr, int ndr_flags, struct policy_handle *r);
|
||||
enum ndr_err_code ndr_push_policy_handle(struct ndr_push *ndr, int ndr_flags, const struct policy_handle *r);
|
||||
void ndr_print_policy_handle(struct ndr_print *ndr, const char *name, const struct policy_handle *r);
|
||||
bool policy_handle_empty(struct policy_handle *h);
|
||||
|
||||
void ndr_check_padding(struct ndr_pull *ndr, size_t n);
|
||||
enum ndr_err_code ndr_pull_generic_ptr(struct ndr_pull *ndr, uint32_t *v);
|
||||
enum ndr_err_code ndr_pull_ref_ptr(struct ndr_pull *ndr, uint32_t *v);
|
||||
enum ndr_err_code ndr_pull_bytes(struct ndr_pull *ndr, uint8_t *data, uint32_t n);
|
||||
enum ndr_err_code ndr_pull_array_uint8(struct ndr_pull *ndr, int ndr_flags, uint8_t *data, uint32_t n);
|
||||
enum ndr_err_code ndr_push_align(struct ndr_push *ndr, size_t size);
|
||||
enum ndr_err_code ndr_pull_align(struct ndr_pull *ndr, size_t size);
|
||||
enum ndr_err_code ndr_push_bytes(struct ndr_push *ndr, const uint8_t *data, uint32_t n);
|
||||
enum ndr_err_code ndr_push_zero(struct ndr_push *ndr, uint32_t n);
|
||||
enum ndr_err_code ndr_push_array_uint8(struct ndr_push *ndr, int ndr_flags, const uint8_t *data, uint32_t n);
|
||||
enum ndr_err_code ndr_push_unique_ptr(struct ndr_push *ndr, const void *p);
|
||||
enum ndr_err_code ndr_push_full_ptr(struct ndr_push *ndr, const void *p);
|
||||
enum ndr_err_code ndr_push_ref_ptr(struct ndr_push *ndr);
|
||||
void ndr_print_struct(struct ndr_print *ndr, const char *name, const char *type);
|
||||
void ndr_print_enum(struct ndr_print *ndr, const char *name, const char *type, const char *val, uint32_t value);
|
||||
void ndr_print_bitmap_flag(struct ndr_print *ndr, size_t size, const char *flag_name, uint32_t flag, uint32_t value);
|
||||
void ndr_print_bitmap_flag(struct ndr_print *ndr, size_t size, const char *flag_name, uint32_t flag, uint32_t value);
|
||||
void ndr_print_ptr(struct ndr_print *ndr, const char *name, const void *p);
|
||||
void ndr_print_union(struct ndr_print *ndr, const char *name, int level, const char *type);
|
||||
void ndr_print_bad_level(struct ndr_print *ndr, const char *name, uint16_t level);
|
||||
void ndr_print_array_uint8(struct ndr_print *ndr, const char *name, const uint8_t *data, uint32_t count);
|
||||
uint32_t ndr_size_DATA_BLOB(int ret, const DATA_BLOB *data, int flags);
|
||||
|
||||
/* strings */
|
||||
uint32_t ndr_charset_length(const void *var, charset_t chset);
|
||||
size_t ndr_string_array_size(struct ndr_push *ndr, const char *s);
|
||||
uint32_t ndr_size_string(int ret, const char * const* string, int flags);
|
||||
enum ndr_err_code ndr_pull_string_array(struct ndr_pull *ndr, int ndr_flags, const char ***_a);
|
||||
enum ndr_err_code ndr_push_string_array(struct ndr_push *ndr, int ndr_flags, const char **a);
|
||||
void ndr_print_string_array(struct ndr_print *ndr, const char *name, const char **a);
|
||||
uint32_t ndr_string_length(const void *_var, uint32_t element_size);
|
||||
enum ndr_err_code ndr_check_string_terminator(struct ndr_pull *ndr, uint32_t count, uint32_t element_size);
|
||||
enum ndr_err_code ndr_pull_charset(struct ndr_pull *ndr, int ndr_flags, const char **var, uint32_t length, uint8_t byte_mul, charset_t chset);
|
||||
enum ndr_err_code ndr_push_charset(struct ndr_push *ndr, int ndr_flags, const char *var, uint32_t length, uint8_t byte_mul, charset_t chset);
|
||||
|
||||
/* GUIDs */
|
||||
bool GUID_equal(const struct GUID *u1, const struct GUID *u2);
|
||||
NTSTATUS GUID_from_string(const char *s, struct GUID *guid);
|
||||
NTSTATUS NS_GUID_from_string(const char *s, struct GUID *guid);
|
||||
struct GUID GUID_zero(void);
|
||||
bool GUID_all_zero(const struct GUID *u);
|
||||
int GUID_compare(const struct GUID *u1, const struct GUID *u2);
|
||||
char *GUID_string(TALLOC_CTX *mem_ctx, const struct GUID *guid);
|
||||
char *GUID_string2(TALLOC_CTX *mem_ctx, const struct GUID *guid);
|
||||
char *NS_GUID_string(TALLOC_CTX *mem_ctx, const struct GUID *guid);
|
||||
struct GUID GUID_random(void);
|
||||
|
||||
#endif /* __LIBNDR_H__ */
|
||||
|
@ -63,6 +63,7 @@ _PUBLIC_ struct ndr_pull *ndr_pull_init_blob(const DATA_BLOB *blob, TALLOC_CTX *
|
||||
|
||||
ndr->data = blob->data;
|
||||
ndr->data_size = blob->length;
|
||||
ndr->iconv_convenience = talloc_reference(ndr, iconv_convenience);
|
||||
|
||||
return ndr;
|
||||
}
|
||||
@ -95,21 +96,6 @@ static enum ndr_err_code ndr_pull_set_offset(struct ndr_pull *ndr, uint32_t ofs)
|
||||
return NDR_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
/* save the offset/size of the current ndr state */
|
||||
_PUBLIC_ void ndr_pull_save(struct ndr_pull *ndr, struct ndr_pull_save *save)
|
||||
{
|
||||
save->offset = ndr->offset;
|
||||
save->data_size = ndr->data_size;
|
||||
}
|
||||
|
||||
/* restore the size/offset of a ndr structure */
|
||||
_PUBLIC_ void ndr_pull_restore(struct ndr_pull *ndr, struct ndr_pull_save *save)
|
||||
{
|
||||
ndr->offset = save->offset;
|
||||
ndr->data_size = save->data_size;
|
||||
}
|
||||
|
||||
|
||||
/* create a ndr_push structure, ready for some marshalling */
|
||||
_PUBLIC_ struct ndr_push *ndr_push_init_ctx(TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience)
|
||||
{
|
||||
@ -126,6 +112,7 @@ _PUBLIC_ struct ndr_push *ndr_push_init_ctx(TALLOC_CTX *mem_ctx, struct smb_icon
|
||||
if (!ndr->data) {
|
||||
return NULL;
|
||||
}
|
||||
ndr->iconv_convenience = talloc_reference(ndr, iconv_convenience);
|
||||
|
||||
return ndr;
|
||||
}
|
||||
@ -194,7 +181,7 @@ _PUBLIC_ void ndr_print_debug_helper(struct ndr_print *ndr, const char *format,
|
||||
free(s);
|
||||
}
|
||||
|
||||
_PUBLIC_ void ndr_print_string_helper(struct ndr_print *ndr, const char *format, ...) _PRINTF_ATTRIBUTE(2,3)
|
||||
_PUBLIC_ void ndr_print_string_helper(struct ndr_print *ndr, const char *format, ...)
|
||||
{
|
||||
va_list ap;
|
||||
int i;
|
||||
@ -354,97 +341,6 @@ _PUBLIC_ void ndr_set_flags(uint32_t *pflags, uint32_t new_flags)
|
||||
(*pflags) |= new_flags;
|
||||
}
|
||||
|
||||
NTSTATUS ndr_map_error2ntstatus(enum ndr_err_code ndr_err)
|
||||
{
|
||||
switch (ndr_err) {
|
||||
case NDR_ERR_SUCCESS:
|
||||
return NT_STATUS_OK;
|
||||
case NDR_ERR_BUFSIZE:
|
||||
return NT_STATUS_BUFFER_TOO_SMALL;
|
||||
case NDR_ERR_TOKEN:
|
||||
return NT_STATUS_INTERNAL_ERROR;
|
||||
case NDR_ERR_ALLOC:
|
||||
return NT_STATUS_NO_MEMORY;
|
||||
case NDR_ERR_ARRAY_SIZE:
|
||||
return NT_STATUS_ARRAY_BOUNDS_EXCEEDED;
|
||||
case NDR_ERR_INVALID_POINTER:
|
||||
return NT_STATUS_INVALID_PARAMETER_MIX;
|
||||
case NDR_ERR_UNREAD_BYTES:
|
||||
return NT_STATUS_PORT_MESSAGE_TOO_LONG;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
/* we should map all error codes to different status codes */
|
||||
return NT_STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
/*
|
||||
* Convert an ndr error to string
|
||||
*/
|
||||
|
||||
const char *ndr_errstr(enum ndr_err_code err)
|
||||
{
|
||||
switch (err) {
|
||||
case NDR_ERR_SUCCESS:
|
||||
return "NDR_ERR_SUCCESS";
|
||||
break;
|
||||
case NDR_ERR_ARRAY_SIZE:
|
||||
return "NDR_ERR_ARRAY_SIZE";
|
||||
break;
|
||||
case NDR_ERR_BAD_SWITCH:
|
||||
return "NDR_ERR_BAD_SWITCH";
|
||||
break;
|
||||
case NDR_ERR_OFFSET:
|
||||
return "NDR_ERR_OFFSET";
|
||||
break;
|
||||
case NDR_ERR_RELATIVE:
|
||||
return "NDR_ERR_RELATIVE";
|
||||
break;
|
||||
case NDR_ERR_CHARCNV:
|
||||
return "NDR_ERR_CHARCNV";
|
||||
break;
|
||||
case NDR_ERR_LENGTH:
|
||||
return "NDR_ERR_LENGTH";
|
||||
break;
|
||||
case NDR_ERR_SUBCONTEXT:
|
||||
return "NDR_ERR_SUBCONTEXT";
|
||||
break;
|
||||
case NDR_ERR_COMPRESSION:
|
||||
return "NDR_ERR_COMPRESSION";
|
||||
break;
|
||||
case NDR_ERR_STRING:
|
||||
return "NDR_ERR_STRING";
|
||||
break;
|
||||
case NDR_ERR_VALIDATE:
|
||||
return "NDR_ERR_VALIDATE";
|
||||
break;
|
||||
case NDR_ERR_BUFSIZE:
|
||||
return "NDR_ERR_BUFSIZE";
|
||||
break;
|
||||
case NDR_ERR_ALLOC:
|
||||
return "NDR_ERR_ALLOC";
|
||||
break;
|
||||
case NDR_ERR_RANGE:
|
||||
return "NDR_ERR_RANGE";
|
||||
break;
|
||||
case NDR_ERR_TOKEN:
|
||||
return "NDR_ERR_TOKEN";
|
||||
break;
|
||||
case NDR_ERR_IPV4ADDRESS:
|
||||
return "NDR_ERR_IPV4ADDRESS";
|
||||
break;
|
||||
case NDR_ERR_INVALID_POINTER:
|
||||
return "NDR_ERR_INVALID_POINTER";
|
||||
break;
|
||||
case NDR_ERR_UNREAD_BYTES:
|
||||
return "NDR_ERR_UNREAD_BYTES";
|
||||
break;
|
||||
}
|
||||
|
||||
return talloc_asprintf(talloc_tos(), "Unknown NDR error: %d", err);
|
||||
}
|
||||
|
||||
/*
|
||||
return and possibly log an NDR error
|
||||
*/
|
||||
@ -508,6 +404,8 @@ _PUBLIC_ enum ndr_err_code ndr_pull_subcontext_start(struct ndr_pull *ndr,
|
||||
{
|
||||
struct ndr_pull *subndr;
|
||||
uint32_t r_content_size;
|
||||
bool force_le = false;
|
||||
bool force_be = false;
|
||||
|
||||
switch (header_size) {
|
||||
case 0: {
|
||||
@ -540,6 +438,74 @@ _PUBLIC_ enum ndr_err_code ndr_pull_subcontext_start(struct ndr_pull *ndr,
|
||||
r_content_size = content_size;
|
||||
break;
|
||||
}
|
||||
case 0xFFFFFC01: {
|
||||
/*
|
||||
* Common Type Header for the Serialization Stream
|
||||
* See [MS-RPCE] 2.2.6 Type Serialization Version 1
|
||||
*/
|
||||
uint8_t version;
|
||||
uint8_t drep;
|
||||
uint16_t hdrlen;
|
||||
uint32_t filler;
|
||||
uint32_t content_size;
|
||||
uint32_t reserved;
|
||||
|
||||
/* version */
|
||||
NDR_CHECK(ndr_pull_uint8(ndr, NDR_SCALARS, &version));
|
||||
|
||||
if (version != 1) {
|
||||
return ndr_pull_error(ndr, NDR_ERR_SUBCONTEXT,
|
||||
"Bad subcontext (PULL) Common Type Header version %d != 1",
|
||||
(int)version);
|
||||
}
|
||||
|
||||
/*
|
||||
* 0x10 little endian
|
||||
* 0x00 big endian
|
||||
*/
|
||||
NDR_CHECK(ndr_pull_uint8(ndr, NDR_SCALARS, &drep));
|
||||
if (drep == 0x10) {
|
||||
force_le = true;
|
||||
} else if (drep == 0x00) {
|
||||
force_be = true;
|
||||
} else {
|
||||
return ndr_pull_error(ndr, NDR_ERR_SUBCONTEXT,
|
||||
"Bad subcontext (PULL) Common Type Header invalid drep 0x%02X",
|
||||
(unsigned int)drep);
|
||||
}
|
||||
|
||||
/* length of the "Private Header for Constructed Type" */
|
||||
NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &hdrlen));
|
||||
if (hdrlen != 8) {
|
||||
return ndr_pull_error(ndr, NDR_ERR_SUBCONTEXT,
|
||||
"Bad subcontext (PULL) Common Type Header length %d != 8",
|
||||
(int)hdrlen);
|
||||
}
|
||||
|
||||
/* filler should be ignored */
|
||||
NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &filler));
|
||||
|
||||
/*
|
||||
* Private Header for Constructed Type
|
||||
*/
|
||||
/* length - will be updated latter */
|
||||
NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &content_size));
|
||||
if (size_is >= 0 && size_is != content_size) {
|
||||
return ndr_pull_error(ndr, NDR_ERR_SUBCONTEXT, "Bad subcontext (PULL) size_is(%d) mismatch content_size %d",
|
||||
(int)size_is, (int)content_size);
|
||||
}
|
||||
/* the content size must be a multiple of 8 */
|
||||
if ((content_size % 8) != 0) {
|
||||
return ndr_pull_error(ndr, NDR_ERR_SUBCONTEXT,
|
||||
"Bad subcontext (PULL) size_is(%d) not padded to 8 content_size %d",
|
||||
(int)size_is, (int)content_size);
|
||||
}
|
||||
r_content_size = content_size;
|
||||
|
||||
/* reserved */
|
||||
NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &reserved));
|
||||
break;
|
||||
}
|
||||
default:
|
||||
return ndr_pull_error(ndr, NDR_ERR_SUBCONTEXT, "Bad subcontext (PULL) header_size %d",
|
||||
(int)header_size);
|
||||
@ -555,6 +521,13 @@ _PUBLIC_ enum ndr_err_code ndr_pull_subcontext_start(struct ndr_pull *ndr,
|
||||
subndr->data = ndr->data + ndr->offset;
|
||||
subndr->offset = 0;
|
||||
subndr->data_size = r_content_size;
|
||||
subndr->iconv_convenience = talloc_reference(subndr, ndr->iconv_convenience);
|
||||
|
||||
if (force_le) {
|
||||
ndr_set_flags(&ndr->flags, LIBNDR_FLAG_LITTLE_ENDIAN);
|
||||
} else if (force_be) {
|
||||
ndr_set_flags(&ndr->flags, LIBNDR_FLAG_BIGENDIAN);
|
||||
}
|
||||
|
||||
*_subndr = subndr;
|
||||
return NDR_ERR_SUCCESS;
|
||||
@ -584,7 +557,7 @@ _PUBLIC_ enum ndr_err_code ndr_push_subcontext_start(struct ndr_push *ndr,
|
||||
{
|
||||
struct ndr_push *subndr;
|
||||
|
||||
subndr = ndr_push_init_ctx(ndr, NULL);
|
||||
subndr = ndr_push_init_ctx(ndr, ndr->iconv_convenience);
|
||||
NDR_ERR_HAVE_NO_MEMORY(subndr);
|
||||
subndr->flags = ndr->flags;
|
||||
|
||||
@ -600,8 +573,10 @@ _PUBLIC_ enum ndr_err_code ndr_push_subcontext_end(struct ndr_push *ndr,
|
||||
size_t header_size,
|
||||
ssize_t size_is)
|
||||
{
|
||||
ssize_t padding_len;
|
||||
|
||||
if (size_is >= 0) {
|
||||
ssize_t padding_len = size_is - subndr->offset;
|
||||
padding_len = size_is - subndr->offset;
|
||||
if (padding_len > 0) {
|
||||
NDR_CHECK(ndr_push_zero(subndr, padding_len));
|
||||
} else if (padding_len < 0) {
|
||||
@ -622,6 +597,41 @@ _PUBLIC_ enum ndr_err_code ndr_push_subcontext_end(struct ndr_push *ndr,
|
||||
NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, subndr->offset));
|
||||
break;
|
||||
|
||||
case 0xFFFFFC01:
|
||||
/*
|
||||
* Common Type Header for the Serialization Stream
|
||||
* See [MS-RPCE] 2.2.6 Type Serialization Version 1
|
||||
*/
|
||||
padding_len = NDR_ROUND(subndr->offset, 8) - subndr->offset;
|
||||
if (padding_len > 0) {
|
||||
NDR_CHECK(ndr_push_zero(subndr, padding_len));
|
||||
}
|
||||
|
||||
/* version */
|
||||
NDR_CHECK(ndr_push_uint8(ndr, NDR_SCALARS, 1));
|
||||
|
||||
/*
|
||||
* 0x10 little endian
|
||||
* 0x00 big endian
|
||||
*/
|
||||
NDR_CHECK(ndr_push_uint8(ndr, NDR_SCALARS, NDR_BE(ndr)?0x00:0x10));
|
||||
|
||||
/* length of the "Private Header for Constructed Type" */
|
||||
NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, 8));
|
||||
|
||||
/* filler */
|
||||
NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0xCCCCCCCC));
|
||||
|
||||
/*
|
||||
* Private Header for Constructed Type
|
||||
*/
|
||||
/* length - will be updated latter */
|
||||
NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, subndr->offset));
|
||||
|
||||
/* reserved */
|
||||
NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
|
||||
break;
|
||||
|
||||
default:
|
||||
return ndr_push_error(ndr, NDR_ERR_SUBCONTEXT, "Bad subcontext header size %d",
|
||||
(int)header_size);
|
||||
@ -803,11 +813,8 @@ _PUBLIC_ uint32_t ndr_print_get_switch_value(struct ndr_print *ndr, const void *
|
||||
/*
|
||||
pull a struct from a blob using NDR
|
||||
*/
|
||||
_PUBLIC_ enum ndr_err_code ndr_pull_struct_blob(const DATA_BLOB *blob,
|
||||
TALLOC_CTX *mem_ctx,
|
||||
struct smb_iconv_convenience *iconv_convenience,
|
||||
void *p,
|
||||
ndr_pull_flags_fn_t fn)
|
||||
_PUBLIC_ enum ndr_err_code ndr_pull_struct_blob(const DATA_BLOB *blob, TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience, void *p,
|
||||
ndr_pull_flags_fn_t fn)
|
||||
{
|
||||
struct ndr_pull *ndr;
|
||||
ndr = ndr_pull_init_blob(blob, mem_ctx, iconv_convenience);
|
||||
@ -819,7 +826,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_struct_blob(const DATA_BLOB *blob,
|
||||
/*
|
||||
pull a struct from a blob using NDR - failing if all bytes are not consumed
|
||||
*/
|
||||
_PUBLIC_ enum ndr_err_code ndr_pull_struct_blob_all(const DATA_BLOB *blob, TALLOC_CTX *mem_ctx,
|
||||
_PUBLIC_ enum ndr_err_code ndr_pull_struct_blob_all(const DATA_BLOB *blob, TALLOC_CTX *mem_ctx,
|
||||
struct smb_iconv_convenience *iconv_convenience,
|
||||
void *p, ndr_pull_flags_fn_t fn)
|
||||
{
|
||||
@ -838,11 +845,12 @@ _PUBLIC_ enum ndr_err_code ndr_pull_struct_blob_all(const DATA_BLOB *blob, TALLO
|
||||
/*
|
||||
pull a union from a blob using NDR, given the union discriminator
|
||||
*/
|
||||
_PUBLIC_ enum ndr_err_code ndr_pull_union_blob(const DATA_BLOB *blob, TALLOC_CTX *mem_ctx, void *p,
|
||||
_PUBLIC_ enum ndr_err_code ndr_pull_union_blob(const DATA_BLOB *blob, TALLOC_CTX *mem_ctx,
|
||||
struct smb_iconv_convenience *iconv_convenience, void *p,
|
||||
uint32_t level, ndr_pull_flags_fn_t fn)
|
||||
{
|
||||
struct ndr_pull *ndr;
|
||||
ndr = ndr_pull_init_blob(blob, mem_ctx, NULL);
|
||||
ndr = ndr_pull_init_blob(blob, mem_ctx, iconv_convenience);
|
||||
NDR_ERR_HAVE_NO_MEMORY(ndr);
|
||||
NDR_CHECK(ndr_pull_set_switch_value(ndr, p, level));
|
||||
NDR_CHECK(fn(ndr, NDR_SCALARS|NDR_BUFFERS, p));
|
||||
@ -853,11 +861,12 @@ _PUBLIC_ enum ndr_err_code ndr_pull_union_blob(const DATA_BLOB *blob, TALLOC_CTX
|
||||
pull a union from a blob using NDR, given the union discriminator,
|
||||
failing if all bytes are not consumed
|
||||
*/
|
||||
_PUBLIC_ enum ndr_err_code ndr_pull_union_blob_all(const DATA_BLOB *blob, TALLOC_CTX *mem_ctx, void *p,
|
||||
_PUBLIC_ enum ndr_err_code ndr_pull_union_blob_all(const DATA_BLOB *blob, TALLOC_CTX *mem_ctx,
|
||||
struct smb_iconv_convenience *iconv_convenience, void *p,
|
||||
uint32_t level, ndr_pull_flags_fn_t fn)
|
||||
{
|
||||
struct ndr_pull *ndr;
|
||||
ndr = ndr_pull_init_blob(blob, mem_ctx, NULL);
|
||||
ndr = ndr_pull_init_blob(blob, mem_ctx, iconv_convenience);
|
||||
NDR_ERR_HAVE_NO_MEMORY(ndr);
|
||||
NDR_CHECK(ndr_pull_set_switch_value(ndr, p, level));
|
||||
NDR_CHECK(fn(ndr, NDR_SCALARS|NDR_BUFFERS, p));
|
||||
@ -872,11 +881,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_union_blob_all(const DATA_BLOB *blob, TALLOC
|
||||
/*
|
||||
push a struct to a blob using NDR
|
||||
*/
|
||||
_PUBLIC_ enum ndr_err_code ndr_push_struct_blob(DATA_BLOB *blob,
|
||||
TALLOC_CTX *mem_ctx,
|
||||
struct smb_iconv_convenience *iconv_convenience,
|
||||
const void *p,
|
||||
ndr_push_flags_fn_t fn)
|
||||
_PUBLIC_ enum ndr_err_code ndr_push_struct_blob(DATA_BLOB *blob, TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience, const void *p, ndr_push_flags_fn_t fn)
|
||||
{
|
||||
struct ndr_push *ndr;
|
||||
ndr = ndr_push_init_ctx(mem_ctx, iconv_convenience);
|
||||
@ -894,11 +899,11 @@ _PUBLIC_ enum ndr_err_code ndr_push_struct_blob(DATA_BLOB *blob,
|
||||
/*
|
||||
push a union to a blob using NDR
|
||||
*/
|
||||
_PUBLIC_ enum ndr_err_code ndr_push_union_blob(DATA_BLOB *blob, TALLOC_CTX *mem_ctx, void *p,
|
||||
_PUBLIC_ enum ndr_err_code ndr_push_union_blob(DATA_BLOB *blob, TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience, void *p,
|
||||
uint32_t level, ndr_push_flags_fn_t fn)
|
||||
{
|
||||
struct ndr_push *ndr;
|
||||
ndr = ndr_push_init_ctx(mem_ctx, NULL);
|
||||
ndr = ndr_push_init_ctx(mem_ctx, iconv_convenience);
|
||||
NDR_ERR_HAVE_NO_MEMORY(ndr);
|
||||
|
||||
NDR_CHECK(ndr_push_set_switch_value(ndr, p, level));
|
||||
@ -1023,12 +1028,12 @@ _PUBLIC_ enum ndr_err_code ndr_push_relative_ptr1(struct ndr_push *ndr, const vo
|
||||
*/
|
||||
_PUBLIC_ enum ndr_err_code ndr_push_relative_ptr2(struct ndr_push *ndr, const void *p)
|
||||
{
|
||||
struct ndr_push_save save;
|
||||
uint32_t save_offset;
|
||||
uint32_t ptr_offset = 0xFFFFFFFF;
|
||||
if (p == NULL) {
|
||||
return NDR_ERR_SUCCESS;
|
||||
}
|
||||
ndr_push_save(ndr, &save);
|
||||
save_offset = ndr->offset;
|
||||
NDR_CHECK(ndr_token_retrieve(&ndr->relative_list, p, &ptr_offset));
|
||||
if (ptr_offset > ndr->offset) {
|
||||
return ndr_push_error(ndr, NDR_ERR_BUFSIZE,
|
||||
@ -1036,13 +1041,13 @@ _PUBLIC_ enum ndr_err_code ndr_push_relative_ptr2(struct ndr_push *ndr, const vo
|
||||
ptr_offset, ndr->offset);
|
||||
}
|
||||
ndr->offset = ptr_offset;
|
||||
if (save.offset < ndr->relative_base_offset) {
|
||||
if (save_offset < ndr->relative_base_offset) {
|
||||
return ndr_push_error(ndr, NDR_ERR_BUFSIZE,
|
||||
"ndr_push_relative_ptr2 save.offset(%u) < ndr->relative_base_offset(%u)",
|
||||
save.offset, ndr->relative_base_offset);
|
||||
"ndr_push_relative_ptr2 save_offset(%u) < ndr->relative_base_offset(%u)",
|
||||
save_offset, ndr->relative_base_offset);
|
||||
}
|
||||
NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, save.offset - ndr->relative_base_offset));
|
||||
ndr_push_restore(ndr, &save);
|
||||
NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, save_offset - ndr->relative_base_offset));
|
||||
ndr->offset = save_offset;
|
||||
return NDR_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -1,859 +0,0 @@
|
||||
/*
|
||||
Unix SMB/CIFS implementation.
|
||||
|
||||
routines for marshalling/unmarshalling basic types
|
||||
|
||||
Copyright (C) Andrew Tridgell 2003
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
#include "system/network.h"
|
||||
#include "librpc/ndr/libndr.h"
|
||||
|
||||
#define NDR_SVAL(ndr, ofs) (NDR_BE(ndr)?RSVAL(ndr->data,ofs):SVAL(ndr->data,ofs))
|
||||
#define NDR_IVAL(ndr, ofs) (NDR_BE(ndr)?RIVAL(ndr->data,ofs):IVAL(ndr->data,ofs))
|
||||
#define NDR_IVALS(ndr, ofs) (NDR_BE(ndr)?RIVALS(ndr->data,ofs):IVALS(ndr->data,ofs))
|
||||
#define NDR_SSVAL(ndr, ofs, v) do { if (NDR_BE(ndr)) { RSSVAL(ndr->data,ofs,v); } else SSVAL(ndr->data,ofs,v); } while (0)
|
||||
#define NDR_SIVAL(ndr, ofs, v) do { if (NDR_BE(ndr)) { RSIVAL(ndr->data,ofs,v); } else SIVAL(ndr->data,ofs,v); } while (0)
|
||||
#define NDR_SIVALS(ndr, ofs, v) do { if (NDR_BE(ndr)) { RSIVALS(ndr->data,ofs,v); } else SIVALS(ndr->data,ofs,v); } while (0)
|
||||
|
||||
|
||||
/*
|
||||
check for data leaks from the server by looking for non-zero pad bytes
|
||||
these could also indicate that real structure elements have been
|
||||
mistaken for padding in the IDL
|
||||
*/
|
||||
_PUBLIC_ void ndr_check_padding(struct ndr_pull *ndr, size_t n)
|
||||
{
|
||||
size_t ofs2 = (ndr->offset + (n-1)) & ~(n-1);
|
||||
int i;
|
||||
for (i=ndr->offset;i<ofs2;i++) {
|
||||
if (ndr->data[i] != 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (i<ofs2) {
|
||||
DEBUG(0,("WARNING: Non-zero padding to %d: ", (int)n));
|
||||
for (i=ndr->offset;i<ofs2;i++) {
|
||||
DEBUG(0,("%02x ", ndr->data[i]));
|
||||
}
|
||||
DEBUG(0,("\n"));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
parse a int8_t
|
||||
*/
|
||||
_PUBLIC_ enum ndr_err_code ndr_pull_int8(struct ndr_pull *ndr, int ndr_flags, int8_t *v)
|
||||
{
|
||||
NDR_PULL_NEED_BYTES(ndr, 1);
|
||||
*v = (int8_t)CVAL(ndr->data, ndr->offset);
|
||||
ndr->offset += 1;
|
||||
return NDR_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
parse a uint8_t
|
||||
*/
|
||||
_PUBLIC_ enum ndr_err_code ndr_pull_uint8(struct ndr_pull *ndr, int ndr_flags, uint8_t *v)
|
||||
{
|
||||
NDR_PULL_NEED_BYTES(ndr, 1);
|
||||
*v = CVAL(ndr->data, ndr->offset);
|
||||
ndr->offset += 1;
|
||||
return NDR_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
parse a int16_t
|
||||
*/
|
||||
_PUBLIC_ enum ndr_err_code ndr_pull_int16(struct ndr_pull *ndr, int ndr_flags, int16_t *v)
|
||||
{
|
||||
NDR_PULL_ALIGN(ndr, 2);
|
||||
NDR_PULL_NEED_BYTES(ndr, 2);
|
||||
*v = (uint16_t)NDR_SVAL(ndr, ndr->offset);
|
||||
ndr->offset += 2;
|
||||
return NDR_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
parse a uint16_t
|
||||
*/
|
||||
_PUBLIC_ enum ndr_err_code ndr_pull_uint16(struct ndr_pull *ndr, int ndr_flags, uint16_t *v)
|
||||
{
|
||||
NDR_PULL_ALIGN(ndr, 2);
|
||||
NDR_PULL_NEED_BYTES(ndr, 2);
|
||||
*v = NDR_SVAL(ndr, ndr->offset);
|
||||
ndr->offset += 2;
|
||||
return NDR_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
parse a int32_t
|
||||
*/
|
||||
_PUBLIC_ enum ndr_err_code ndr_pull_int32(struct ndr_pull *ndr, int ndr_flags, int32_t *v)
|
||||
{
|
||||
NDR_PULL_ALIGN(ndr, 4);
|
||||
NDR_PULL_NEED_BYTES(ndr, 4);
|
||||
*v = NDR_IVALS(ndr, ndr->offset);
|
||||
ndr->offset += 4;
|
||||
return NDR_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
parse a uint32_t
|
||||
*/
|
||||
_PUBLIC_ enum ndr_err_code ndr_pull_uint32(struct ndr_pull *ndr, int ndr_flags, uint32_t *v)
|
||||
{
|
||||
NDR_PULL_ALIGN(ndr, 4);
|
||||
NDR_PULL_NEED_BYTES(ndr, 4);
|
||||
*v = NDR_IVAL(ndr, ndr->offset);
|
||||
ndr->offset += 4;
|
||||
return NDR_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
parse a pointer referent identifier
|
||||
*/
|
||||
_PUBLIC_ enum ndr_err_code ndr_pull_generic_ptr(struct ndr_pull *ndr, uint32_t *v)
|
||||
{
|
||||
NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, v));
|
||||
if (*v != 0) {
|
||||
ndr->ptr_count++;
|
||||
}
|
||||
return NDR_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
parse a ref pointer referent identifier
|
||||
*/
|
||||
_PUBLIC_ enum ndr_err_code ndr_pull_ref_ptr(struct ndr_pull *ndr, uint32_t *v)
|
||||
{
|
||||
NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, v));
|
||||
/* ref pointers always point to data */
|
||||
*v = 1;
|
||||
return NDR_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
parse a udlong
|
||||
*/
|
||||
_PUBLIC_ enum ndr_err_code ndr_pull_udlong(struct ndr_pull *ndr, int ndr_flags, uint64_t *v)
|
||||
{
|
||||
NDR_PULL_ALIGN(ndr, 4);
|
||||
NDR_PULL_NEED_BYTES(ndr, 8);
|
||||
*v = NDR_IVAL(ndr, ndr->offset);
|
||||
*v |= (uint64_t)(NDR_IVAL(ndr, ndr->offset+4)) << 32;
|
||||
ndr->offset += 8;
|
||||
return NDR_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
parse a udlongr
|
||||
*/
|
||||
_PUBLIC_ enum ndr_err_code ndr_pull_udlongr(struct ndr_pull *ndr, int ndr_flags, uint64_t *v)
|
||||
{
|
||||
NDR_PULL_ALIGN(ndr, 4);
|
||||
NDR_PULL_NEED_BYTES(ndr, 8);
|
||||
*v = ((uint64_t)NDR_IVAL(ndr, ndr->offset)) << 32;
|
||||
*v |= NDR_IVAL(ndr, ndr->offset+4);
|
||||
ndr->offset += 8;
|
||||
return NDR_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
parse a dlong
|
||||
*/
|
||||
_PUBLIC_ enum ndr_err_code ndr_pull_dlong(struct ndr_pull *ndr, int ndr_flags, int64_t *v)
|
||||
{
|
||||
return ndr_pull_udlong(ndr, ndr_flags, (uint64_t *)v);
|
||||
}
|
||||
|
||||
/*
|
||||
parse a hyper
|
||||
*/
|
||||
_PUBLIC_ enum ndr_err_code ndr_pull_hyper(struct ndr_pull *ndr, int ndr_flags, uint64_t *v)
|
||||
{
|
||||
NDR_PULL_ALIGN(ndr, 8);
|
||||
return ndr_pull_udlong(ndr, ndr_flags, v);
|
||||
}
|
||||
|
||||
/*
|
||||
parse a pointer
|
||||
*/
|
||||
_PUBLIC_ enum ndr_err_code ndr_pull_pointer(struct ndr_pull *ndr, int ndr_flags, void* *v)
|
||||
{
|
||||
uintptr_t h;
|
||||
NDR_PULL_ALIGN(ndr, sizeof(h));
|
||||
NDR_PULL_NEED_BYTES(ndr, sizeof(h));
|
||||
memcpy(&h, ndr->data+ndr->offset, sizeof(h));
|
||||
ndr->offset += sizeof(h);
|
||||
*v = (void *)h;
|
||||
return NDR_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
pull a NTSTATUS
|
||||
*/
|
||||
_PUBLIC_ enum ndr_err_code ndr_pull_NTSTATUS(struct ndr_pull *ndr, int ndr_flags, NTSTATUS *status)
|
||||
{
|
||||
uint32_t v;
|
||||
NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &v));
|
||||
*status = NT_STATUS(v);
|
||||
return NDR_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
push a NTSTATUS
|
||||
*/
|
||||
_PUBLIC_ enum ndr_err_code ndr_push_NTSTATUS(struct ndr_push *ndr, int ndr_flags, NTSTATUS status)
|
||||
{
|
||||
return ndr_push_uint32(ndr, ndr_flags, NT_STATUS_V(status));
|
||||
}
|
||||
|
||||
_PUBLIC_ void ndr_print_NTSTATUS(struct ndr_print *ndr, const char *name, NTSTATUS r)
|
||||
{
|
||||
ndr->print(ndr, "%-25s: %s", name, nt_errstr(r));
|
||||
}
|
||||
|
||||
/*
|
||||
pull a WERROR
|
||||
*/
|
||||
_PUBLIC_ enum ndr_err_code ndr_pull_WERROR(struct ndr_pull *ndr, int ndr_flags, WERROR *status)
|
||||
{
|
||||
uint32_t v;
|
||||
NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &v));
|
||||
*status = W_ERROR(v);
|
||||
return NDR_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
push a WERROR
|
||||
*/
|
||||
_PUBLIC_ enum ndr_err_code ndr_push_WERROR(struct ndr_push *ndr, int ndr_flags, WERROR status)
|
||||
{
|
||||
return ndr_push_uint32(ndr, NDR_SCALARS, W_ERROR_V(status));
|
||||
}
|
||||
|
||||
_PUBLIC_ void ndr_print_WERROR(struct ndr_print *ndr, const char *name, WERROR r)
|
||||
{
|
||||
ndr->print(ndr, "%-25s: %s", name, win_errstr(r));
|
||||
}
|
||||
|
||||
/*
|
||||
parse a set of bytes
|
||||
*/
|
||||
_PUBLIC_ enum ndr_err_code ndr_pull_bytes(struct ndr_pull *ndr, uint8_t *data, uint32_t n)
|
||||
{
|
||||
NDR_PULL_NEED_BYTES(ndr, n);
|
||||
memcpy(data, ndr->data + ndr->offset, n);
|
||||
ndr->offset += n;
|
||||
return NDR_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
pull an array of uint8
|
||||
*/
|
||||
_PUBLIC_ enum ndr_err_code ndr_pull_array_uint8(struct ndr_pull *ndr, int ndr_flags, uint8_t *data, uint32_t n)
|
||||
{
|
||||
if (!(ndr_flags & NDR_SCALARS)) {
|
||||
return NDR_ERR_SUCCESS;
|
||||
}
|
||||
return ndr_pull_bytes(ndr, data, n);
|
||||
}
|
||||
|
||||
/*
|
||||
push a int8_t
|
||||
*/
|
||||
_PUBLIC_ enum ndr_err_code ndr_push_int8(struct ndr_push *ndr, int ndr_flags, int8_t v)
|
||||
{
|
||||
NDR_PUSH_NEED_BYTES(ndr, 1);
|
||||
SCVAL(ndr->data, ndr->offset, (uint8_t)v);
|
||||
ndr->offset += 1;
|
||||
return NDR_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
push a uint8_t
|
||||
*/
|
||||
_PUBLIC_ enum ndr_err_code ndr_push_uint8(struct ndr_push *ndr, int ndr_flags, uint8_t v)
|
||||
{
|
||||
NDR_PUSH_NEED_BYTES(ndr, 1);
|
||||
SCVAL(ndr->data, ndr->offset, v);
|
||||
ndr->offset += 1;
|
||||
return NDR_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
push a int16_t
|
||||
*/
|
||||
_PUBLIC_ enum ndr_err_code ndr_push_int16(struct ndr_push *ndr, int ndr_flags, int16_t v)
|
||||
{
|
||||
NDR_PUSH_ALIGN(ndr, 2);
|
||||
NDR_PUSH_NEED_BYTES(ndr, 2);
|
||||
NDR_SSVAL(ndr, ndr->offset, (uint16_t)v);
|
||||
ndr->offset += 2;
|
||||
return NDR_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
push a uint16_t
|
||||
*/
|
||||
_PUBLIC_ enum ndr_err_code ndr_push_uint16(struct ndr_push *ndr, int ndr_flags, uint16_t v)
|
||||
{
|
||||
NDR_PUSH_ALIGN(ndr, 2);
|
||||
NDR_PUSH_NEED_BYTES(ndr, 2);
|
||||
NDR_SSVAL(ndr, ndr->offset, v);
|
||||
ndr->offset += 2;
|
||||
return NDR_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
push a int32_t
|
||||
*/
|
||||
_PUBLIC_ enum ndr_err_code ndr_push_int32(struct ndr_push *ndr, int ndr_flags, int32_t v)
|
||||
{
|
||||
NDR_PUSH_ALIGN(ndr, 4);
|
||||
NDR_PUSH_NEED_BYTES(ndr, 4);
|
||||
NDR_SIVALS(ndr, ndr->offset, v);
|
||||
ndr->offset += 4;
|
||||
return NDR_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
push a uint32_t
|
||||
*/
|
||||
_PUBLIC_ enum ndr_err_code ndr_push_uint32(struct ndr_push *ndr, int ndr_flags, uint32_t v)
|
||||
{
|
||||
NDR_PUSH_ALIGN(ndr, 4);
|
||||
NDR_PUSH_NEED_BYTES(ndr, 4);
|
||||
NDR_SIVAL(ndr, ndr->offset, v);
|
||||
ndr->offset += 4;
|
||||
return NDR_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
push a udlong
|
||||
*/
|
||||
_PUBLIC_ enum ndr_err_code ndr_push_udlong(struct ndr_push *ndr, int ndr_flags, uint64_t v)
|
||||
{
|
||||
NDR_PUSH_ALIGN(ndr, 4);
|
||||
NDR_PUSH_NEED_BYTES(ndr, 8);
|
||||
NDR_SIVAL(ndr, ndr->offset, (v & 0xFFFFFFFF));
|
||||
NDR_SIVAL(ndr, ndr->offset+4, (v>>32));
|
||||
ndr->offset += 8;
|
||||
return NDR_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
push a udlongr
|
||||
*/
|
||||
_PUBLIC_ enum ndr_err_code ndr_push_udlongr(struct ndr_push *ndr, int ndr_flags, uint64_t v)
|
||||
{
|
||||
NDR_PUSH_ALIGN(ndr, 4);
|
||||
NDR_PUSH_NEED_BYTES(ndr, 8);
|
||||
NDR_SIVAL(ndr, ndr->offset, (v>>32));
|
||||
NDR_SIVAL(ndr, ndr->offset+4, (v & 0xFFFFFFFF));
|
||||
ndr->offset += 8;
|
||||
return NDR_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
push a dlong
|
||||
*/
|
||||
_PUBLIC_ enum ndr_err_code ndr_push_dlong(struct ndr_push *ndr, int ndr_flags, int64_t v)
|
||||
{
|
||||
return ndr_push_udlong(ndr, NDR_SCALARS, (uint64_t)v);
|
||||
}
|
||||
|
||||
/*
|
||||
push a hyper
|
||||
*/
|
||||
_PUBLIC_ enum ndr_err_code ndr_push_hyper(struct ndr_push *ndr, int ndr_flags, uint64_t v)
|
||||
{
|
||||
NDR_PUSH_ALIGN(ndr, 8);
|
||||
return ndr_push_udlong(ndr, NDR_SCALARS, v);
|
||||
}
|
||||
|
||||
/*
|
||||
push a pointer
|
||||
*/
|
||||
_PUBLIC_ enum ndr_err_code ndr_push_pointer(struct ndr_push *ndr, int ndr_flags, void* v)
|
||||
{
|
||||
uintptr_t h = (intptr_t)v;
|
||||
NDR_PUSH_ALIGN(ndr, sizeof(h));
|
||||
NDR_PUSH_NEED_BYTES(ndr, sizeof(h));
|
||||
memcpy(ndr->data+ndr->offset, &h, sizeof(h));
|
||||
ndr->offset += sizeof(h);
|
||||
return NDR_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
_PUBLIC_ enum ndr_err_code ndr_push_align(struct ndr_push *ndr, size_t size)
|
||||
{
|
||||
NDR_PUSH_ALIGN(ndr, size);
|
||||
return NDR_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
_PUBLIC_ enum ndr_err_code ndr_pull_align(struct ndr_pull *ndr, size_t size)
|
||||
{
|
||||
NDR_PULL_ALIGN(ndr, size);
|
||||
return NDR_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
push some bytes
|
||||
*/
|
||||
_PUBLIC_ enum ndr_err_code ndr_push_bytes(struct ndr_push *ndr, const uint8_t *data, uint32_t n)
|
||||
{
|
||||
NDR_PUSH_NEED_BYTES(ndr, n);
|
||||
memcpy(ndr->data + ndr->offset, data, n);
|
||||
ndr->offset += n;
|
||||
return NDR_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
push some zero bytes
|
||||
*/
|
||||
_PUBLIC_ enum ndr_err_code ndr_push_zero(struct ndr_push *ndr, uint32_t n)
|
||||
{
|
||||
NDR_PUSH_NEED_BYTES(ndr, n);
|
||||
memset(ndr->data + ndr->offset, 0, n);
|
||||
ndr->offset += n;
|
||||
return NDR_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
push an array of uint8
|
||||
*/
|
||||
_PUBLIC_ enum ndr_err_code ndr_push_array_uint8(struct ndr_push *ndr, int ndr_flags, const uint8_t *data, uint32_t n)
|
||||
{
|
||||
if (!(ndr_flags & NDR_SCALARS)) {
|
||||
return NDR_ERR_SUCCESS;
|
||||
}
|
||||
return ndr_push_bytes(ndr, data, n);
|
||||
}
|
||||
|
||||
/*
|
||||
save the current position
|
||||
*/
|
||||
_PUBLIC_ void ndr_push_save(struct ndr_push *ndr, struct ndr_push_save *save)
|
||||
{
|
||||
save->offset = ndr->offset;
|
||||
}
|
||||
|
||||
/*
|
||||
restore the position
|
||||
*/
|
||||
_PUBLIC_ void ndr_push_restore(struct ndr_push *ndr, struct ndr_push_save *save)
|
||||
{
|
||||
ndr->offset = save->offset;
|
||||
}
|
||||
|
||||
/*
|
||||
push a unique non-zero value if a pointer is non-NULL, otherwise 0
|
||||
*/
|
||||
_PUBLIC_ enum ndr_err_code ndr_push_unique_ptr(struct ndr_push *ndr, const void *p)
|
||||
{
|
||||
uint32_t ptr = 0;
|
||||
if (p) {
|
||||
ptr = ndr->ptr_count * 4;
|
||||
ptr |= 0x00020000;
|
||||
ndr->ptr_count++;
|
||||
}
|
||||
return ndr_push_uint32(ndr, NDR_SCALARS, ptr);
|
||||
}
|
||||
|
||||
/*
|
||||
push a 'simple' full non-zero value if a pointer is non-NULL, otherwise 0
|
||||
*/
|
||||
_PUBLIC_ enum ndr_err_code ndr_push_full_ptr(struct ndr_push *ndr, const void *p)
|
||||
{
|
||||
uint32_t ptr = 0;
|
||||
if (p) {
|
||||
/* Check if the pointer already exists and has an id */
|
||||
ptr = ndr_token_peek(&ndr->full_ptr_list, p);
|
||||
if (ptr == 0) {
|
||||
ndr->ptr_count++;
|
||||
ptr = ndr->ptr_count;
|
||||
ndr_token_store(ndr, &ndr->full_ptr_list, p, ptr);
|
||||
}
|
||||
}
|
||||
return ndr_push_uint32(ndr, NDR_SCALARS, ptr);
|
||||
}
|
||||
|
||||
/*
|
||||
push always a 0, if a pointer is NULL it's a fatal error
|
||||
*/
|
||||
_PUBLIC_ enum ndr_err_code ndr_push_ref_ptr(struct ndr_push *ndr)
|
||||
{
|
||||
return ndr_push_uint32(ndr, NDR_SCALARS, 0xAEF1AEF1);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
push a NTTIME
|
||||
*/
|
||||
_PUBLIC_ enum ndr_err_code ndr_push_NTTIME(struct ndr_push *ndr, int ndr_flags, NTTIME t)
|
||||
{
|
||||
NDR_CHECK(ndr_push_udlong(ndr, ndr_flags, t));
|
||||
return NDR_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
pull a NTTIME
|
||||
*/
|
||||
_PUBLIC_ enum ndr_err_code ndr_pull_NTTIME(struct ndr_pull *ndr, int ndr_flags, NTTIME *t)
|
||||
{
|
||||
NDR_CHECK(ndr_pull_udlong(ndr, ndr_flags, t));
|
||||
return NDR_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
push a NTTIME
|
||||
*/
|
||||
_PUBLIC_ enum ndr_err_code ndr_push_NTTIME_1sec(struct ndr_push *ndr, int ndr_flags, NTTIME t)
|
||||
{
|
||||
t /= 10000000;
|
||||
NDR_CHECK(ndr_push_hyper(ndr, ndr_flags, t));
|
||||
return NDR_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
pull a NTTIME_1sec
|
||||
*/
|
||||
_PUBLIC_ enum ndr_err_code ndr_pull_NTTIME_1sec(struct ndr_pull *ndr, int ndr_flags, NTTIME *t)
|
||||
{
|
||||
NDR_CHECK(ndr_pull_hyper(ndr, ndr_flags, t));
|
||||
(*t) *= 10000000;
|
||||
return NDR_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
pull a NTTIME_hyper
|
||||
*/
|
||||
_PUBLIC_ enum ndr_err_code ndr_pull_NTTIME_hyper(struct ndr_pull *ndr, int ndr_flags, NTTIME *t)
|
||||
{
|
||||
NDR_CHECK(ndr_pull_hyper(ndr, ndr_flags, t));
|
||||
return NDR_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
push a NTTIME_hyper
|
||||
*/
|
||||
_PUBLIC_ enum ndr_err_code ndr_push_NTTIME_hyper(struct ndr_push *ndr, int ndr_flags, NTTIME t)
|
||||
{
|
||||
NDR_CHECK(ndr_push_hyper(ndr, ndr_flags, t));
|
||||
return NDR_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
push a time_t
|
||||
*/
|
||||
_PUBLIC_ enum ndr_err_code ndr_push_time_t(struct ndr_push *ndr, int ndr_flags, time_t t)
|
||||
{
|
||||
return ndr_push_uint32(ndr, ndr_flags, t);
|
||||
}
|
||||
|
||||
/*
|
||||
pull a time_t
|
||||
*/
|
||||
_PUBLIC_ enum ndr_err_code ndr_pull_time_t(struct ndr_pull *ndr, int ndr_flags, time_t *t)
|
||||
{
|
||||
uint32_t tt;
|
||||
NDR_CHECK(ndr_pull_uint32(ndr, ndr_flags, &tt));
|
||||
*t = tt;
|
||||
return NDR_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
pull a ipv4address
|
||||
*/
|
||||
_PUBLIC_ enum ndr_err_code ndr_pull_ipv4address(struct ndr_pull *ndr, int ndr_flags, const char **address)
|
||||
{
|
||||
struct in_addr in;
|
||||
NDR_CHECK(ndr_pull_uint32(ndr, ndr_flags, &in.s_addr));
|
||||
in.s_addr = htonl(in.s_addr);
|
||||
*address = talloc_strdup(ndr->current_mem_ctx, inet_ntoa(in));
|
||||
NDR_ERR_HAVE_NO_MEMORY(*address);
|
||||
return NDR_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
push a ipv4address
|
||||
*/
|
||||
_PUBLIC_ enum ndr_err_code ndr_push_ipv4address(struct ndr_push *ndr, int ndr_flags, const char *address)
|
||||
{
|
||||
uint32_t addr;
|
||||
if (!is_ipaddress(address)) {
|
||||
return ndr_push_error(ndr, NDR_ERR_IPV4ADDRESS,
|
||||
"Invalid IPv4 address: '%s'",
|
||||
address);
|
||||
}
|
||||
addr = inet_addr(address);
|
||||
NDR_CHECK(ndr_push_uint32(ndr, ndr_flags, htonl(addr)));
|
||||
return NDR_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
print a ipv4address
|
||||
*/
|
||||
_PUBLIC_ void ndr_print_ipv4address(struct ndr_print *ndr, const char *name,
|
||||
const char *address)
|
||||
{
|
||||
ndr->print(ndr, "%-25s: %s", name, address);
|
||||
}
|
||||
|
||||
|
||||
_PUBLIC_ void ndr_print_struct(struct ndr_print *ndr, const char *name, const char *type)
|
||||
{
|
||||
ndr->print(ndr, "%s: struct %s", name, type);
|
||||
}
|
||||
|
||||
_PUBLIC_ void ndr_print_enum(struct ndr_print *ndr, const char *name, const char *type,
|
||||
const char *val, uint32_t value)
|
||||
{
|
||||
if (ndr->flags & LIBNDR_PRINT_ARRAY_HEX) {
|
||||
ndr->print(ndr, "%-25s: %s (0x%X)", name, val?val:"UNKNOWN_ENUM_VALUE", value);
|
||||
} else {
|
||||
ndr->print(ndr, "%-25s: %s (%d)", name, val?val:"UNKNOWN_ENUM_VALUE", value);
|
||||
}
|
||||
}
|
||||
|
||||
_PUBLIC_ void ndr_print_bitmap_flag(struct ndr_print *ndr, size_t size, const char *flag_name, uint32_t flag, uint32_t value)
|
||||
{
|
||||
/* this is an attempt to support multi-bit bitmap masks */
|
||||
value &= flag;
|
||||
|
||||
while (!(flag & 1)) {
|
||||
flag >>= 1;
|
||||
value >>= 1;
|
||||
}
|
||||
if (flag == 1) {
|
||||
ndr->print(ndr, " %d: %-25s", value, flag_name);
|
||||
} else {
|
||||
ndr->print(ndr, "0x%02x: %-25s (%d)", value, flag_name, value);
|
||||
}
|
||||
}
|
||||
|
||||
_PUBLIC_ void ndr_print_int8(struct ndr_print *ndr, const char *name, int8_t v)
|
||||
{
|
||||
ndr->print(ndr, "%-25s: %d", name, v);
|
||||
}
|
||||
|
||||
_PUBLIC_ void ndr_print_uint8(struct ndr_print *ndr, const char *name, uint8_t v)
|
||||
{
|
||||
ndr->print(ndr, "%-25s: 0x%02x (%u)", name, v, v);
|
||||
}
|
||||
|
||||
_PUBLIC_ void ndr_print_int16(struct ndr_print *ndr, const char *name, int16_t v)
|
||||
{
|
||||
ndr->print(ndr, "%-25s: %d", name, v);
|
||||
}
|
||||
|
||||
_PUBLIC_ void ndr_print_uint16(struct ndr_print *ndr, const char *name, uint16_t v)
|
||||
{
|
||||
ndr->print(ndr, "%-25s: 0x%04x (%u)", name, v, v);
|
||||
}
|
||||
|
||||
_PUBLIC_ void ndr_print_int32(struct ndr_print *ndr, const char *name, int32_t v)
|
||||
{
|
||||
ndr->print(ndr, "%-25s: %d", name, v);
|
||||
}
|
||||
|
||||
_PUBLIC_ void ndr_print_uint32(struct ndr_print *ndr, const char *name, uint32_t v)
|
||||
{
|
||||
ndr->print(ndr, "%-25s: 0x%08x (%u)", name, v, v);
|
||||
}
|
||||
|
||||
_PUBLIC_ void ndr_print_udlong(struct ndr_print *ndr, const char *name, uint64_t v)
|
||||
{
|
||||
ndr->print(ndr, "%-25s: 0x%016llx (%llu)", name, (unsigned long long)v, (unsigned long long)v);
|
||||
}
|
||||
|
||||
_PUBLIC_ void ndr_print_udlongr(struct ndr_print *ndr, const char *name, uint64_t v)
|
||||
{
|
||||
ndr_print_udlong(ndr, name, v);
|
||||
}
|
||||
|
||||
_PUBLIC_ void ndr_print_dlong(struct ndr_print *ndr, const char *name, int64_t v)
|
||||
{
|
||||
ndr->print(ndr, "%-25s: 0x%016llx (%lld)", name, (unsigned long long)v, (long long)v);
|
||||
}
|
||||
|
||||
_PUBLIC_ void ndr_print_hyper(struct ndr_print *ndr, const char *name, uint64_t v)
|
||||
{
|
||||
ndr_print_dlong(ndr, name, v);
|
||||
}
|
||||
|
||||
_PUBLIC_ void ndr_print_pointer(struct ndr_print *ndr, const char *name, void *v)
|
||||
{
|
||||
ndr->print(ndr, "%-25s: %p", name, v);
|
||||
}
|
||||
|
||||
_PUBLIC_ void ndr_print_ptr(struct ndr_print *ndr, const char *name, const void *p)
|
||||
{
|
||||
if (p) {
|
||||
ndr->print(ndr, "%-25s: *", name);
|
||||
} else {
|
||||
ndr->print(ndr, "%-25s: NULL", name);
|
||||
}
|
||||
}
|
||||
|
||||
_PUBLIC_ void ndr_print_NTTIME(struct ndr_print *ndr, const char *name, NTTIME t)
|
||||
{
|
||||
ndr->print(ndr, "%-25s: %s", name, nt_time_string(ndr, t));
|
||||
}
|
||||
|
||||
_PUBLIC_ void ndr_print_NTTIME_1sec(struct ndr_print *ndr, const char *name, NTTIME t)
|
||||
{
|
||||
/* this is a standard NTTIME here
|
||||
* as it's already converted in the pull/push code
|
||||
*/
|
||||
ndr_print_NTTIME(ndr, name, t);
|
||||
}
|
||||
|
||||
_PUBLIC_ void ndr_print_NTTIME_hyper(struct ndr_print *ndr, const char *name, NTTIME t)
|
||||
{
|
||||
ndr_print_NTTIME(ndr, name, t);
|
||||
}
|
||||
|
||||
_PUBLIC_ void ndr_print_time_t(struct ndr_print *ndr, const char *name, time_t t)
|
||||
{
|
||||
if (t == (time_t)-1 || t == 0) {
|
||||
ndr->print(ndr, "%-25s: (time_t)%d", name, (int)t);
|
||||
} else {
|
||||
ndr->print(ndr, "%-25s: %s", name, timestring(ndr, t));
|
||||
}
|
||||
}
|
||||
|
||||
_PUBLIC_ void ndr_print_union(struct ndr_print *ndr, const char *name, int level, const char *type)
|
||||
{
|
||||
if (ndr->flags & LIBNDR_PRINT_ARRAY_HEX) {
|
||||
ndr->print(ndr, "%-25s: union %s(case 0x%X)", name, type, level);
|
||||
} else {
|
||||
ndr->print(ndr, "%-25s: union %s(case %d)", name, type, level);
|
||||
}
|
||||
}
|
||||
|
||||
_PUBLIC_ void ndr_print_bad_level(struct ndr_print *ndr, const char *name, uint16_t level)
|
||||
{
|
||||
ndr->print(ndr, "UNKNOWN LEVEL %u", level);
|
||||
}
|
||||
|
||||
_PUBLIC_ void ndr_print_array_uint8(struct ndr_print *ndr, const char *name,
|
||||
const uint8_t *data, uint32_t count)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (count <= 600 && (ndr->flags & LIBNDR_PRINT_ARRAY_HEX)) {
|
||||
char s[1202];
|
||||
for (i=0;i<count;i++) {
|
||||
snprintf(&s[i*2], 3, "%02x", data[i]);
|
||||
}
|
||||
s[i*2] = 0;
|
||||
ndr->print(ndr, "%-25s: %s", name, s);
|
||||
return;
|
||||
}
|
||||
|
||||
ndr->print(ndr, "%s: ARRAY(%d)", name, count);
|
||||
ndr->depth++;
|
||||
for (i=0;i<count;i++) {
|
||||
char *idx=NULL;
|
||||
if (asprintf(&idx, "[%d]", i) != -1) {
|
||||
ndr_print_uint8(ndr, idx, data[i]);
|
||||
free(idx);
|
||||
}
|
||||
}
|
||||
ndr->depth--;
|
||||
}
|
||||
|
||||
_PUBLIC_ void ndr_print_DATA_BLOB(struct ndr_print *ndr, const char *name, DATA_BLOB r)
|
||||
{
|
||||
ndr->print(ndr, "%-25s: DATA_BLOB length=%u", name, (unsigned)r.length);
|
||||
if (r.length) {
|
||||
dump_data(10, r.data, r.length);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
push a DATA_BLOB onto the wire.
|
||||
*/
|
||||
_PUBLIC_ enum ndr_err_code ndr_push_DATA_BLOB(struct ndr_push *ndr, int ndr_flags, DATA_BLOB blob)
|
||||
{
|
||||
if (ndr->flags & LIBNDR_ALIGN_FLAGS) {
|
||||
if (ndr->flags & LIBNDR_FLAG_ALIGN2) {
|
||||
blob.length = NDR_ALIGN(ndr, 2);
|
||||
} else if (ndr->flags & LIBNDR_FLAG_ALIGN4) {
|
||||
blob.length = NDR_ALIGN(ndr, 4);
|
||||
} else if (ndr->flags & LIBNDR_FLAG_ALIGN8) {
|
||||
blob.length = NDR_ALIGN(ndr, 8);
|
||||
}
|
||||
NDR_PUSH_ALLOC_SIZE(ndr, blob.data, blob.length);
|
||||
data_blob_clear(&blob);
|
||||
} else if (!(ndr->flags & LIBNDR_FLAG_REMAINING)) {
|
||||
NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, blob.length));
|
||||
}
|
||||
NDR_CHECK(ndr_push_bytes(ndr, blob.data, blob.length));
|
||||
return NDR_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
pull a DATA_BLOB from the wire.
|
||||
*/
|
||||
_PUBLIC_ enum ndr_err_code ndr_pull_DATA_BLOB(struct ndr_pull *ndr, int ndr_flags, DATA_BLOB *blob)
|
||||
{
|
||||
uint32_t length = 0;
|
||||
|
||||
if (ndr->flags & LIBNDR_ALIGN_FLAGS) {
|
||||
if (ndr->flags & LIBNDR_FLAG_ALIGN2) {
|
||||
length = NDR_ALIGN(ndr, 2);
|
||||
} else if (ndr->flags & LIBNDR_FLAG_ALIGN4) {
|
||||
length = NDR_ALIGN(ndr, 4);
|
||||
} else if (ndr->flags & LIBNDR_FLAG_ALIGN8) {
|
||||
length = NDR_ALIGN(ndr, 8);
|
||||
}
|
||||
if (ndr->data_size - ndr->offset < length) {
|
||||
length = ndr->data_size - ndr->offset;
|
||||
}
|
||||
} else if (ndr->flags & LIBNDR_FLAG_REMAINING) {
|
||||
length = ndr->data_size - ndr->offset;
|
||||
} else {
|
||||
NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &length));
|
||||
}
|
||||
NDR_PULL_NEED_BYTES(ndr, length);
|
||||
*blob = data_blob_talloc(ndr->current_mem_ctx, ndr->data+ndr->offset, length);
|
||||
ndr->offset += length;
|
||||
return NDR_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
_PUBLIC_ uint32_t ndr_size_DATA_BLOB(int ret, const DATA_BLOB *data, int flags)
|
||||
{
|
||||
if (!data) return ret;
|
||||
return ret + data->length;
|
||||
}
|
||||
|
||||
_PUBLIC_ void ndr_print_bool(struct ndr_print *ndr, const char *name, const bool b)
|
||||
{
|
||||
ndr->print(ndr, "%-25s: %s", name, b?"true":"false");
|
||||
}
|
||||
|
||||
_PUBLIC_ void ndr_print_sockaddr_storage(struct ndr_print *ndr, const char *name, const struct sockaddr_storage *ss)
|
||||
{
|
||||
char addr[INET6_ADDRSTRLEN];
|
||||
ndr->print(ndr, "%-25s: %s", name, print_sockaddr(addr, sizeof(addr), ss));
|
||||
}
|
@ -1,27 +1,26 @@
|
||||
/*
|
||||
/*
|
||||
Unix SMB/CIFS implementation.
|
||||
|
||||
routines for marshalling/unmarshalling spoolss subcontext buffer structures
|
||||
|
||||
Copyright (C) Stefan Metzmacher 2005
|
||||
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
#include "includes.h"
|
||||
|
||||
#include "librpc/gen_ndr/ndr_krb5pac.h"
|
||||
|
||||
static size_t _ndr_size_PAC_INFO(const union PAC_INFO *r, uint32_t level, int flags)
|
||||
|
@ -1,94 +0,0 @@
|
||||
/*
|
||||
Unix SMB/CIFS implementation.
|
||||
|
||||
UUID/GUID/policy_handle functions
|
||||
|
||||
Copyright (C) Theodore Ts'o 1996, 1997,
|
||||
Copyright (C) Jim McDonough 2002.
|
||||
Copyright (C) Andrew Tridgell 2003.
|
||||
Copyright (C) Stefan (metze) Metzmacher 2004.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
|
||||
/**
|
||||
* see if a range of memory is all zero. A NULL pointer is considered
|
||||
* to be all zero
|
||||
*/
|
||||
bool all_zero(const uint8_t *ptr, size_t size)
|
||||
{
|
||||
int i;
|
||||
if (!ptr) return True;
|
||||
for (i=0;i<size;i++) {
|
||||
if (ptr[i]) return False;
|
||||
}
|
||||
return True;
|
||||
}
|
||||
|
||||
void ndr_print_GUID(struct ndr_print *ndr, const char *name, const struct GUID *guid)
|
||||
{
|
||||
ndr->print(ndr, "%-25s: %s", name, GUID_string(ndr, guid));
|
||||
}
|
||||
|
||||
bool ndr_syntax_id_equal(const struct ndr_syntax_id *i1,
|
||||
const struct ndr_syntax_id *i2)
|
||||
{
|
||||
return GUID_equal(&i1->uuid, &i2->uuid)
|
||||
&& (i1->if_version == i2->if_version);
|
||||
}
|
||||
|
||||
enum ndr_err_code ndr_push_server_id(struct ndr_push *ndr, int ndr_flags, const struct server_id *r)
|
||||
{
|
||||
if (ndr_flags & NDR_SCALARS) {
|
||||
NDR_CHECK(ndr_push_align(ndr, 4));
|
||||
NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS,
|
||||
(uint32_t)r->pid));
|
||||
#ifdef CLUSTER_SUPPORT
|
||||
NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS,
|
||||
(uint32_t)r->vnn));
|
||||
#endif
|
||||
}
|
||||
if (ndr_flags & NDR_BUFFERS) {
|
||||
}
|
||||
return NDR_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
enum ndr_err_code ndr_pull_server_id(struct ndr_pull *ndr, int ndr_flags, struct server_id *r)
|
||||
{
|
||||
if (ndr_flags & NDR_SCALARS) {
|
||||
uint32_t pid;
|
||||
NDR_CHECK(ndr_pull_align(ndr, 4));
|
||||
NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &pid));
|
||||
#ifdef CLUSTER_SUPPORT
|
||||
NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->vnn));
|
||||
#endif
|
||||
r->pid = (pid_t)pid;
|
||||
}
|
||||
if (ndr_flags & NDR_BUFFERS) {
|
||||
}
|
||||
return NDR_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
void ndr_print_server_id(struct ndr_print *ndr, const char *name, const struct server_id *r)
|
||||
{
|
||||
ndr_print_struct(ndr, name, "server_id");
|
||||
ndr->depth++;
|
||||
ndr_print_uint32(ndr, "id", (uint32_t)r->pid);
|
||||
#ifdef CLUSTER_SUPPORT
|
||||
ndr_print_uint32(ndr, "vnn", (uint32_t)r->vnn);
|
||||
#endif
|
||||
ndr->depth--;
|
||||
}
|
@ -89,7 +89,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_string(struct ndr_pull *ndr, int ndr_flags,
|
||||
&converted_size, false))
|
||||
{
|
||||
return ndr_pull_error(ndr, NDR_ERR_CHARCNV,
|
||||
"Bad char conversion");
|
||||
"Bad character conversion");
|
||||
}
|
||||
}
|
||||
NDR_CHECK(ndr_pull_advance(ndr, (len2 + c_len_term)*byte_mul));
|
||||
@ -127,7 +127,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_string(struct ndr_pull *ndr, int ndr_flags,
|
||||
&converted_size, false))
|
||||
{
|
||||
return ndr_pull_error(ndr, NDR_ERR_CHARCNV,
|
||||
"Bad char conversion");
|
||||
"Bad character conversion");
|
||||
}
|
||||
}
|
||||
NDR_CHECK(ndr_pull_advance(ndr, (len1 + c_len_term)*byte_mul));
|
||||
@ -166,7 +166,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_string(struct ndr_pull *ndr, int ndr_flags,
|
||||
&converted_size, false))
|
||||
{
|
||||
return ndr_pull_error(ndr, NDR_ERR_CHARCNV,
|
||||
"Bad char conversion");
|
||||
"Bad character conversion");
|
||||
}
|
||||
}
|
||||
NDR_CHECK(ndr_pull_advance(ndr, (len1 + c_len_term)*byte_mul));
|
||||
@ -201,7 +201,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_string(struct ndr_pull *ndr, int ndr_flags,
|
||||
&converted_size, false))
|
||||
{
|
||||
return ndr_pull_error(ndr, NDR_ERR_CHARCNV,
|
||||
"Bad char conversion");
|
||||
"Bad character conversion");
|
||||
}
|
||||
}
|
||||
NDR_CHECK(ndr_pull_advance(ndr, (len3 + c_len_term)*byte_mul));
|
||||
@ -233,7 +233,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_string(struct ndr_pull *ndr, int ndr_flags,
|
||||
&converted_size, false))
|
||||
{
|
||||
return ndr_pull_error(ndr, NDR_ERR_CHARCNV,
|
||||
"Bad char conversion");
|
||||
"Bad character conversion");
|
||||
}
|
||||
}
|
||||
NDR_CHECK(ndr_pull_advance(ndr, len3));
|
||||
@ -252,28 +252,12 @@ _PUBLIC_ enum ndr_err_code ndr_pull_string(struct ndr_pull *ndr, int ndr_flags,
|
||||
&converted_size, false))
|
||||
{
|
||||
return ndr_pull_error(ndr, NDR_ERR_CHARCNV,
|
||||
"Bad char conversion");
|
||||
"Bad character conversion");
|
||||
}
|
||||
NDR_CHECK(ndr_pull_advance(ndr, len1));
|
||||
*s = as;
|
||||
break;
|
||||
|
||||
case LIBNDR_FLAG_STR_FIXLEN15:
|
||||
case LIBNDR_FLAG_STR_FIXLEN32:
|
||||
len1 = (flags & LIBNDR_FLAG_STR_FIXLEN32)?32:15;
|
||||
NDR_PULL_NEED_BYTES(ndr, len1*byte_mul);
|
||||
if (!convert_string_talloc(ndr->current_mem_ctx, chset, CH_UNIX,
|
||||
ndr->data+ndr->offset, len1*byte_mul,
|
||||
(void **)(void *)&as,
|
||||
&converted_size, false))
|
||||
{
|
||||
return ndr_pull_error(ndr, NDR_ERR_CHARCNV,
|
||||
"Bad char conversion");
|
||||
}
|
||||
NDR_CHECK(ndr_pull_advance(ndr, len1*byte_mul));
|
||||
*s = as;
|
||||
break;
|
||||
|
||||
case LIBNDR_FLAG_STR_NOTERM:
|
||||
if (!(ndr->flags & LIBNDR_FLAG_REMAINING)) {
|
||||
return ndr_pull_error(ndr, NDR_ERR_STRING, "Bad string flags 0x%x (missing NDR_REMAINING)\n",
|
||||
@ -293,7 +277,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_string(struct ndr_pull *ndr, int ndr_flags,
|
||||
&converted_size, false))
|
||||
{
|
||||
return ndr_pull_error(ndr, NDR_ERR_CHARCNV,
|
||||
"Bad char conversion");
|
||||
"Bad character conversion");
|
||||
}
|
||||
}
|
||||
NDR_CHECK(ndr_pull_advance(ndr, len1));
|
||||
@ -346,17 +330,14 @@ _PUBLIC_ enum ndr_err_code ndr_push_string(struct ndr_push *ndr, int ndr_flags,
|
||||
|
||||
flags &= ~LIBNDR_FLAG_STR_CONFORMANT;
|
||||
|
||||
if (!(flags &
|
||||
(LIBNDR_FLAG_STR_NOTERM |
|
||||
LIBNDR_FLAG_STR_FIXLEN15 |
|
||||
LIBNDR_FLAG_STR_FIXLEN32))) {
|
||||
if (!(flags & LIBNDR_FLAG_STR_NOTERM)) {
|
||||
s_len++;
|
||||
}
|
||||
if (!convert_string_talloc(ndr, CH_UNIX, chset, s, s_len,
|
||||
(void **)(void *)&dest, &d_len, false))
|
||||
{
|
||||
return ndr_push_error(ndr, NDR_ERR_CHARCNV,
|
||||
"Bad char conversion");
|
||||
"Bad character conversion");
|
||||
}
|
||||
|
||||
if (flags & LIBNDR_FLAG_STR_BYTESIZE) {
|
||||
@ -397,21 +378,6 @@ _PUBLIC_ enum ndr_err_code ndr_push_string(struct ndr_push *ndr, int ndr_flags,
|
||||
NDR_CHECK(ndr_push_bytes(ndr, dest, d_len));
|
||||
break;
|
||||
|
||||
case LIBNDR_FLAG_STR_FIXLEN15:
|
||||
case LIBNDR_FLAG_STR_FIXLEN32: {
|
||||
ssize_t fix_len = (flags & LIBNDR_FLAG_STR_FIXLEN32)?32:15;
|
||||
uint32_t pad_len = fix_len - d_len;
|
||||
if (d_len > fix_len) {
|
||||
return ndr_push_error(ndr, NDR_ERR_CHARCNV,
|
||||
"Bad char conversion");
|
||||
}
|
||||
NDR_CHECK(ndr_push_bytes(ndr, dest, d_len));
|
||||
if (pad_len != 0) {
|
||||
NDR_CHECK(ndr_push_zero(ndr, pad_len));
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
if (ndr->flags & LIBNDR_FLAG_REMAINING) {
|
||||
NDR_CHECK(ndr_push_bytes(ndr, dest, d_len));
|
||||
@ -437,13 +403,6 @@ _PUBLIC_ size_t ndr_string_array_size(struct ndr_push *ndr, const char *s)
|
||||
unsigned byte_mul = 2;
|
||||
unsigned c_len_term = 1;
|
||||
|
||||
if (flags & LIBNDR_FLAG_STR_FIXLEN32) {
|
||||
return 32;
|
||||
}
|
||||
if (flags & LIBNDR_FLAG_STR_FIXLEN15) {
|
||||
return 15;
|
||||
}
|
||||
|
||||
c_len = s?strlen_m(s):0;
|
||||
|
||||
if (flags & (LIBNDR_FLAG_STR_ASCII|LIBNDR_FLAG_STR_UTF8)) {
|
||||
@ -653,21 +612,21 @@ _PUBLIC_ uint32_t ndr_string_length(const void *_var, uint32_t element_size)
|
||||
_PUBLIC_ enum ndr_err_code ndr_check_string_terminator(struct ndr_pull *ndr, uint32_t count, uint32_t element_size)
|
||||
{
|
||||
uint32_t i;
|
||||
struct ndr_pull_save save_offset;
|
||||
uint32_t save_offset;
|
||||
|
||||
ndr_pull_save(ndr, &save_offset);
|
||||
save_offset = ndr->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);
|
||||
ndr->offset = 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);
|
||||
ndr->offset = save_offset;
|
||||
|
||||
return NDR_ERR_SUCCESS;
|
||||
}
|
||||
@ -693,7 +652,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_charset(struct ndr_pull *ndr, int ndr_flags,
|
||||
&converted_size, false))
|
||||
{
|
||||
return ndr_pull_error(ndr, NDR_ERR_CHARCNV,
|
||||
"Bad char conversion");
|
||||
"Bad character conversion");
|
||||
}
|
||||
NDR_CHECK(ndr_pull_advance(ndr, length*byte_mul));
|
||||
|
||||
@ -716,7 +675,7 @@ _PUBLIC_ enum ndr_err_code ndr_push_charset(struct ndr_push *ndr, int ndr_flags,
|
||||
ndr->data+ndr->offset, required, false);
|
||||
if (ret == -1) {
|
||||
return ndr_push_error(ndr, NDR_ERR_CHARCNV,
|
||||
"Bad char conversion");
|
||||
"Bad character conversion");
|
||||
}
|
||||
|
||||
/* Make sure the remaining part of the string is filled with zeroes */
|
||||
|
188
source3/librpc/ndr/util.c
Normal file
188
source3/librpc/ndr/util.c
Normal file
@ -0,0 +1,188 @@
|
||||
/*
|
||||
Unix SMB/CIFS implementation.
|
||||
|
||||
libndr interface
|
||||
|
||||
Copyright (C) Andrew Tridgell 2003
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
|
||||
NTSTATUS ndr_map_error2ntstatus(enum ndr_err_code ndr_err)
|
||||
{
|
||||
switch (ndr_err) {
|
||||
case NDR_ERR_SUCCESS:
|
||||
return NT_STATUS_OK;
|
||||
case NDR_ERR_BUFSIZE:
|
||||
return NT_STATUS_BUFFER_TOO_SMALL;
|
||||
case NDR_ERR_TOKEN:
|
||||
return NT_STATUS_INTERNAL_ERROR;
|
||||
case NDR_ERR_ALLOC:
|
||||
return NT_STATUS_NO_MEMORY;
|
||||
case NDR_ERR_ARRAY_SIZE:
|
||||
return NT_STATUS_ARRAY_BOUNDS_EXCEEDED;
|
||||
case NDR_ERR_INVALID_POINTER:
|
||||
return NT_STATUS_INVALID_PARAMETER_MIX;
|
||||
case NDR_ERR_UNREAD_BYTES:
|
||||
return NT_STATUS_PORT_MESSAGE_TOO_LONG;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
/* we should map all error codes to different status codes */
|
||||
return NT_STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
/*
|
||||
* Convert an ndr error to string
|
||||
*/
|
||||
|
||||
const char *ndr_errstr(enum ndr_err_code err)
|
||||
{
|
||||
switch (err) {
|
||||
case NDR_ERR_SUCCESS:
|
||||
return "NDR_ERR_SUCCESS";
|
||||
break;
|
||||
case NDR_ERR_ARRAY_SIZE:
|
||||
return "NDR_ERR_ARRAY_SIZE";
|
||||
break;
|
||||
case NDR_ERR_BAD_SWITCH:
|
||||
return "NDR_ERR_BAD_SWITCH";
|
||||
break;
|
||||
case NDR_ERR_OFFSET:
|
||||
return "NDR_ERR_OFFSET";
|
||||
break;
|
||||
case NDR_ERR_RELATIVE:
|
||||
return "NDR_ERR_RELATIVE";
|
||||
break;
|
||||
case NDR_ERR_CHARCNV:
|
||||
return "NDR_ERR_CHARCNV";
|
||||
break;
|
||||
case NDR_ERR_LENGTH:
|
||||
return "NDR_ERR_LENGTH";
|
||||
break;
|
||||
case NDR_ERR_SUBCONTEXT:
|
||||
return "NDR_ERR_SUBCONTEXT";
|
||||
break;
|
||||
case NDR_ERR_COMPRESSION:
|
||||
return "NDR_ERR_COMPRESSION";
|
||||
break;
|
||||
case NDR_ERR_STRING:
|
||||
return "NDR_ERR_STRING";
|
||||
break;
|
||||
case NDR_ERR_VALIDATE:
|
||||
return "NDR_ERR_VALIDATE";
|
||||
break;
|
||||
case NDR_ERR_BUFSIZE:
|
||||
return "NDR_ERR_BUFSIZE";
|
||||
break;
|
||||
case NDR_ERR_ALLOC:
|
||||
return "NDR_ERR_ALLOC";
|
||||
break;
|
||||
case NDR_ERR_RANGE:
|
||||
return "NDR_ERR_RANGE";
|
||||
break;
|
||||
case NDR_ERR_TOKEN:
|
||||
return "NDR_ERR_TOKEN";
|
||||
break;
|
||||
case NDR_ERR_IPV4ADDRESS:
|
||||
return "NDR_ERR_IPV4ADDRESS";
|
||||
break;
|
||||
case NDR_ERR_INVALID_POINTER:
|
||||
return "NDR_ERR_INVALID_POINTER";
|
||||
break;
|
||||
case NDR_ERR_UNREAD_BYTES:
|
||||
return "NDR_ERR_UNREAD_BYTES";
|
||||
break;
|
||||
}
|
||||
|
||||
return talloc_asprintf(talloc_tos(), "Unknown NDR error: %d", err);
|
||||
}
|
||||
|
||||
enum ndr_err_code ndr_push_server_id(struct ndr_push *ndr, int ndr_flags, const struct server_id *r)
|
||||
{
|
||||
if (ndr_flags & NDR_SCALARS) {
|
||||
NDR_CHECK(ndr_push_align(ndr, 4));
|
||||
NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS,
|
||||
(uint32_t)r->pid));
|
||||
#ifdef CLUSTER_SUPPORT
|
||||
NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS,
|
||||
(uint32_t)r->vnn));
|
||||
#endif
|
||||
}
|
||||
if (ndr_flags & NDR_BUFFERS) {
|
||||
}
|
||||
return NDR_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
enum ndr_err_code ndr_pull_server_id(struct ndr_pull *ndr, int ndr_flags, struct server_id *r)
|
||||
{
|
||||
if (ndr_flags & NDR_SCALARS) {
|
||||
uint32_t pid;
|
||||
NDR_CHECK(ndr_pull_align(ndr, 4));
|
||||
NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &pid));
|
||||
#ifdef CLUSTER_SUPPORT
|
||||
NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->vnn));
|
||||
#endif
|
||||
r->pid = (pid_t)pid;
|
||||
}
|
||||
if (ndr_flags & NDR_BUFFERS) {
|
||||
}
|
||||
return NDR_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
void ndr_print_server_id(struct ndr_print *ndr, const char *name, const struct server_id *r)
|
||||
{
|
||||
ndr_print_struct(ndr, name, "server_id");
|
||||
ndr->depth++;
|
||||
ndr_print_uint32(ndr, "id", (uint32_t)r->pid);
|
||||
#ifdef CLUSTER_SUPPORT
|
||||
ndr_print_uint32(ndr, "vnn", (uint32_t)r->vnn);
|
||||
#endif
|
||||
ndr->depth--;
|
||||
}
|
||||
|
||||
/**
|
||||
* see if a range of memory is all zero. A NULL pointer is considered
|
||||
* to be all zero
|
||||
*/
|
||||
bool all_zero(const uint8_t *ptr, size_t size)
|
||||
{
|
||||
int i;
|
||||
if (!ptr) return True;
|
||||
for (i=0;i<size;i++) {
|
||||
if (ptr[i]) return False;
|
||||
}
|
||||
return True;
|
||||
}
|
||||
|
||||
_PUBLIC_ void ndr_print_bool(struct ndr_print *ndr, const char *name, const bool b)
|
||||
{
|
||||
ndr->print(ndr, "%-25s: %s", name, b?"true":"false");
|
||||
}
|
||||
|
||||
_PUBLIC_ void ndr_print_sockaddr_storage(struct ndr_print *ndr, const char *name, const struct sockaddr_storage *ss)
|
||||
{
|
||||
char addr[INET6_ADDRSTRLEN];
|
||||
ndr->print(ndr, "%-25s: %s", name, print_sockaddr(addr, sizeof(addr), ss));
|
||||
}
|
||||
|
||||
void *global_loadparm;
|
||||
void *cmdline_lp_ctx;
|
||||
struct smb_iconv_convenience *lp_iconv_convenience(void *lp_ctx)
|
||||
{
|
||||
return NULL;
|
||||
}
|
@ -1,227 +0,0 @@
|
||||
/*
|
||||
Unix SMB/CIFS implementation.
|
||||
|
||||
UUID/GUID functions
|
||||
|
||||
Copyright (C) Theodore Ts'o 1996, 1997,
|
||||
Copyright (C) Jim McDonough 2002.
|
||||
Copyright (C) Andrew Tridgell 2003.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
#include "librpc/ndr/libndr.h"
|
||||
|
||||
/**
|
||||
build a GUID from a string
|
||||
*/
|
||||
_PUBLIC_ NTSTATUS GUID_from_string(const char *s, struct GUID *guid)
|
||||
{
|
||||
NTSTATUS status = NT_STATUS_INVALID_PARAMETER;
|
||||
uint32_t time_low;
|
||||
uint32_t time_mid, time_hi_and_version;
|
||||
uint32_t clock_seq[2];
|
||||
uint32_t node[6];
|
||||
int i;
|
||||
|
||||
if (s == NULL) {
|
||||
return NT_STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
if (11 == sscanf(s, "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
|
||||
&time_low, &time_mid, &time_hi_and_version,
|
||||
&clock_seq[0], &clock_seq[1],
|
||||
&node[0], &node[1], &node[2], &node[3], &node[4], &node[5])) {
|
||||
status = NT_STATUS_OK;
|
||||
} else if (11 == sscanf(s, "{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
|
||||
&time_low, &time_mid, &time_hi_and_version,
|
||||
&clock_seq[0], &clock_seq[1],
|
||||
&node[0], &node[1], &node[2], &node[3], &node[4], &node[5])) {
|
||||
status = NT_STATUS_OK;
|
||||
}
|
||||
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
return status;
|
||||
}
|
||||
|
||||
guid->time_low = time_low;
|
||||
guid->time_mid = time_mid;
|
||||
guid->time_hi_and_version = time_hi_and_version;
|
||||
guid->clock_seq[0] = clock_seq[0];
|
||||
guid->clock_seq[1] = clock_seq[1];
|
||||
for (i=0;i<6;i++) {
|
||||
guid->node[i] = node[i];
|
||||
}
|
||||
|
||||
return NT_STATUS_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
build a GUID from a string
|
||||
*/
|
||||
_PUBLIC_ NTSTATUS NS_GUID_from_string(const char *s, struct GUID *guid)
|
||||
{
|
||||
NTSTATUS status = NT_STATUS_INVALID_PARAMETER;
|
||||
uint32_t time_low;
|
||||
uint32_t time_mid, time_hi_and_version;
|
||||
uint32_t clock_seq[2];
|
||||
uint32_t node[6];
|
||||
int i;
|
||||
|
||||
if (s == NULL) {
|
||||
return NT_STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
if (11 == sscanf(s, "%08x-%04x%04x-%02x%02x%02x%02x-%02x%02x%02x%02x",
|
||||
&time_low, &time_mid, &time_hi_and_version,
|
||||
&clock_seq[0], &clock_seq[1],
|
||||
&node[0], &node[1], &node[2], &node[3], &node[4], &node[5])) {
|
||||
status = NT_STATUS_OK;
|
||||
}
|
||||
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
return status;
|
||||
}
|
||||
|
||||
guid->time_low = time_low;
|
||||
guid->time_mid = time_mid;
|
||||
guid->time_hi_and_version = time_hi_and_version;
|
||||
guid->clock_seq[0] = clock_seq[0];
|
||||
guid->clock_seq[1] = clock_seq[1];
|
||||
for (i=0;i<6;i++) {
|
||||
guid->node[i] = node[i];
|
||||
}
|
||||
|
||||
return NT_STATUS_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* generate a random GUID
|
||||
*/
|
||||
struct GUID GUID_random(void)
|
||||
{
|
||||
struct GUID guid;
|
||||
|
||||
generate_random_buffer((uint8_t *)&guid, sizeof(guid));
|
||||
guid.clock_seq[0] = (guid.clock_seq[0] & 0x3F) | 0x80;
|
||||
guid.time_hi_and_version = (guid.time_hi_and_version & 0x0FFF) | 0x4000;
|
||||
|
||||
return guid;
|
||||
}
|
||||
|
||||
/**
|
||||
* generate an empty GUID
|
||||
*/
|
||||
_PUBLIC_ struct GUID GUID_zero(void)
|
||||
{
|
||||
struct GUID guid;
|
||||
|
||||
ZERO_STRUCT(guid);
|
||||
|
||||
return guid;
|
||||
}
|
||||
|
||||
_PUBLIC_ bool GUID_all_zero(const struct GUID *u)
|
||||
{
|
||||
if (u->time_low != 0 ||
|
||||
u->time_mid != 0 ||
|
||||
u->time_hi_and_version != 0 ||
|
||||
u->clock_seq[0] != 0 ||
|
||||
u->clock_seq[1] != 0 ||
|
||||
!all_zero(u->node, 6)) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
_PUBLIC_ bool GUID_equal(const struct GUID *u1, const struct GUID *u2)
|
||||
{
|
||||
if (u1->time_low != u2->time_low ||
|
||||
u1->time_mid != u2->time_mid ||
|
||||
u1->time_hi_and_version != u2->time_hi_and_version ||
|
||||
u1->clock_seq[0] != u2->clock_seq[0] ||
|
||||
u1->clock_seq[1] != u2->clock_seq[1] ||
|
||||
memcmp(u1->node, u2->node, 6) != 0) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
_PUBLIC_ int GUID_compare(const struct GUID *u1, const struct GUID *u2)
|
||||
{
|
||||
if (u1->time_low != u2->time_low) {
|
||||
return u1->time_low - u2->time_low;
|
||||
}
|
||||
|
||||
if (u1->time_mid != u2->time_mid) {
|
||||
return u1->time_mid - u2->time_mid;
|
||||
}
|
||||
|
||||
if (u1->time_hi_and_version != u2->time_hi_and_version) {
|
||||
return u1->time_hi_and_version - u2->time_hi_and_version;
|
||||
}
|
||||
|
||||
if (u1->clock_seq[0] != u2->clock_seq[0]) {
|
||||
return u1->clock_seq[0] - u2->clock_seq[0];
|
||||
}
|
||||
|
||||
if (u1->clock_seq[1] != u2->clock_seq[1]) {
|
||||
return u1->clock_seq[1] - u2->clock_seq[1];
|
||||
}
|
||||
|
||||
return memcmp(u1->node, u2->node, 6);
|
||||
}
|
||||
|
||||
/**
|
||||
its useful to be able to display these in debugging messages
|
||||
*/
|
||||
_PUBLIC_ char *GUID_string(TALLOC_CTX *mem_ctx, const struct GUID *guid)
|
||||
{
|
||||
return talloc_asprintf(mem_ctx,
|
||||
"%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
|
||||
guid->time_low, guid->time_mid,
|
||||
guid->time_hi_and_version,
|
||||
guid->clock_seq[0],
|
||||
guid->clock_seq[1],
|
||||
guid->node[0], guid->node[1],
|
||||
guid->node[2], guid->node[3],
|
||||
guid->node[4], guid->node[5]);
|
||||
}
|
||||
|
||||
_PUBLIC_ char *GUID_string2(TALLOC_CTX *mem_ctx, const struct GUID *guid)
|
||||
{
|
||||
char *ret, *s = GUID_string(mem_ctx, guid);
|
||||
ret = talloc_asprintf(mem_ctx, "{%s}", s);
|
||||
talloc_free(s);
|
||||
return ret;
|
||||
}
|
||||
|
||||
_PUBLIC_ char *NS_GUID_string(TALLOC_CTX *mem_ctx, const struct GUID *guid)
|
||||
{
|
||||
return talloc_asprintf(mem_ctx,
|
||||
"%08x-%04x%04x-%02x%02x%02x%02x-%02x%02x%02x%02x",
|
||||
guid->time_low, guid->time_mid,
|
||||
guid->time_hi_and_version,
|
||||
guid->clock_seq[0],
|
||||
guid->clock_seq[1],
|
||||
guid->node[0], guid->node[1],
|
||||
guid->node[2], guid->node[3],
|
||||
guid->node[4], guid->node[5]);
|
||||
}
|
||||
|
||||
_PUBLIC_ bool policy_handle_empty(struct policy_handle *h)
|
||||
{
|
||||
return (h->handle_type == 0 && GUID_all_zero(&h->uuid));
|
||||
}
|
@ -249,7 +249,7 @@ bool receive_getdc_response(TALLOC_CTX *mem_ctx,
|
||||
blob.data += 4;
|
||||
blob.length -= 4;
|
||||
|
||||
ndr_err = ndr_pull_union_blob_all(&blob, mem_ctx, &p, DGRAM_SMB,
|
||||
ndr_err = ndr_pull_union_blob_all(&blob, mem_ctx, NULL, &p, DGRAM_SMB,
|
||||
(ndr_pull_flags_fn_t)ndr_pull_dgram_smb_packet);
|
||||
if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
|
||||
DEBUG(0,("failed to parse packet\n"));
|
||||
|
@ -141,7 +141,7 @@ static int kludge_acl_allowedAttributes(struct ldb_context *ldb, struct ldb_mess
|
||||
ldb_msg_add_string(msg, attrName, attr_list[i]);
|
||||
}
|
||||
talloc_free(mem_ctx);
|
||||
return 0;
|
||||
return LDB_SUCCESS;
|
||||
|
||||
}
|
||||
/* read all objectClasses */
|
||||
@ -201,7 +201,7 @@ static int kludge_acl_childClasses(struct ldb_context *ldb, struct ldb_message *
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
return LDB_SUCCESS;
|
||||
|
||||
}
|
||||
|
||||
|
@ -73,7 +73,7 @@ static int load_proxy_info(struct ldb_module *module)
|
||||
|
||||
/* see if we have already loaded it */
|
||||
if (proxy->upstream != NULL) {
|
||||
return 0;
|
||||
return LDB_SUCCESS;
|
||||
}
|
||||
|
||||
dn = ldb_dn_new(proxy, module->ldb, "@PROXYINFO");
|
||||
@ -152,7 +152,7 @@ static int load_proxy_info(struct ldb_module *module)
|
||||
|
||||
talloc_free(res);
|
||||
|
||||
return 0;
|
||||
return LDB_SUCCESS;
|
||||
|
||||
failed:
|
||||
talloc_free(res);
|
||||
@ -160,7 +160,7 @@ failed:
|
||||
talloc_free(proxy->newdn);
|
||||
talloc_free(proxy->upstream);
|
||||
proxy->upstream = NULL;
|
||||
return -1;
|
||||
return LDB_ERR_OPERATIONS_ERROR;
|
||||
}
|
||||
|
||||
|
||||
|
@ -90,16 +90,16 @@ static int add_time_element(struct ldb_message *msg, const char *attr, time_t t)
|
||||
char *s;
|
||||
|
||||
if (ldb_msg_find_element(msg, attr) != NULL) {
|
||||
return 0;
|
||||
return LDB_SUCCESS;
|
||||
}
|
||||
|
||||
s = ldb_timestring(msg, t);
|
||||
if (s == NULL) {
|
||||
return -1;
|
||||
return LDB_ERR_OPERATIONS_ERROR;
|
||||
}
|
||||
|
||||
if (ldb_msg_add_string(msg, attr, s) != 0) {
|
||||
return -1;
|
||||
return LDB_ERR_OPERATIONS_ERROR;
|
||||
}
|
||||
|
||||
el = ldb_msg_find_element(msg, attr);
|
||||
@ -107,7 +107,7 @@ static int add_time_element(struct ldb_message *msg, const char *attr, time_t t)
|
||||
is ignored */
|
||||
el->flags = LDB_FLAG_MOD_REPLACE;
|
||||
|
||||
return 0;
|
||||
return LDB_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -118,11 +118,11 @@ static int add_uint64_element(struct ldb_message *msg, const char *attr, uint64_
|
||||
struct ldb_message_element *el;
|
||||
|
||||
if (ldb_msg_find_element(msg, attr) != NULL) {
|
||||
return 0;
|
||||
return LDB_SUCCESS;
|
||||
}
|
||||
|
||||
if (ldb_msg_add_fmt(msg, attr, "%llu", (unsigned long long)v) != 0) {
|
||||
return -1;
|
||||
return LDB_ERR_OPERATIONS_ERROR;
|
||||
}
|
||||
|
||||
el = ldb_msg_find_element(msg, attr);
|
||||
@ -130,7 +130,7 @@ static int add_uint64_element(struct ldb_message *msg, const char *attr, uint64_
|
||||
is ignored */
|
||||
el->flags = LDB_FLAG_MOD_REPLACE;
|
||||
|
||||
return 0;
|
||||
return LDB_SUCCESS;
|
||||
}
|
||||
|
||||
static int replmd_replPropertyMetaData1_attid_sort(const struct replPropertyMetaData1 *m1,
|
||||
|
@ -319,7 +319,7 @@ static int generate_dITContentRules(struct ldb_context *ldb, struct ldb_message
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
return LDB_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
|
@ -134,7 +134,7 @@ static int ldb_canonicalise_objectSid(struct ldb_context *ldb, void *mem_ctx,
|
||||
/* Perhaps not a string after all */
|
||||
return ldb_handler_copy(ldb, mem_ctx, in, out);
|
||||
}
|
||||
return 0;
|
||||
return LDB_SUCCESS;
|
||||
}
|
||||
return ldb_handler_copy(ldb, mem_ctx, in, out);
|
||||
}
|
||||
|
@ -8,7 +8,7 @@ dcerpcsrcdir = $(librpcsrcdir)/rpc
|
||||
PUBLIC_DEPENDENCIES = LIBSAMBA-ERRORS LIBTALLOC LIBSAMBA-UTIL CHARSET \
|
||||
LIBSAMBA-HOSTCONFIG
|
||||
|
||||
LIBNDR_OBJ_FILES = $(addprefix $(ndrsrcdir)/, ndr.o ndr_basic.o ndr_string.o uuid.o)
|
||||
LIBNDR_OBJ_FILES = $(addprefix $(ndrsrcdir)/, ndr_string.o) ../librpc/ndr/ndr_basic.o ../librpc/ndr/uuid.o ../librpc/ndr/ndr.o
|
||||
|
||||
$(eval $(call proto_header_template,$(ndrsrcdir)/libndr_proto.h,$(LIBNDR_OBJ_FILES:.o=.c)))
|
||||
|
||||
@ -36,9 +36,9 @@ PRIVATE_DEPENDENCIES = \
|
||||
# End BINARY ndrdump
|
||||
#################################
|
||||
|
||||
ndrdump_OBJ_FILES = $(librpcsrcdir)/tools/ndrdump.o
|
||||
ndrdump_OBJ_FILES = ../librpc/tools/ndrdump.o
|
||||
|
||||
MANPAGES += $(librpcsrcdir)/tools/ndrdump.1
|
||||
MANPAGES += ../librpc/tools/ndrdump.1
|
||||
|
||||
################################################
|
||||
# Start SUBSYSTEM NDR_COMPRESSION
|
||||
@ -107,7 +107,7 @@ NDR_EFS_OBJ_FILES = $(gen_ndrsrcdir)/ndr_efs.o
|
||||
[SUBSYSTEM::NDR_MISC]
|
||||
PUBLIC_DEPENDENCIES = LIBNDR
|
||||
|
||||
NDR_MISC_OBJ_FILES = $(gen_ndrsrcdir)/ndr_misc.o $(ndrsrcdir)/ndr_misc.o
|
||||
NDR_MISC_OBJ_FILES = $(gen_ndrsrcdir)/ndr_misc.o ../librpc/ndr/ndr_misc.o
|
||||
|
||||
PUBLIC_HEADERS += $(gen_ndrsrcdir)/misc.h $(gen_ndrsrcdir)/ndr_misc.h
|
||||
|
||||
|
@ -152,6 +152,14 @@ struct ndr_print {
|
||||
#define NDR_PRINT_OUT_DEBUG(type, p) NDR_PRINT_FUNCTION_DEBUG(type, NDR_OUT, p)
|
||||
#define NDR_PRINT_IN_DEBUG(type, p) NDR_PRINT_FUNCTION_DEBUG(type, NDR_IN | NDR_SET_VALUES, p)
|
||||
|
||||
/* useful macro for debugging in strings */
|
||||
#define NDR_PRINT_STRUCT_STRING(ctx, type, p) ndr_print_struct_string(ctx, (ndr_print_fn_t)ndr_print_ ##type, #p, p)
|
||||
#define NDR_PRINT_UNION_STRING(ctx, type, level, p) ndr_print_union_string(ctx, (ndr_print_fn_t)ndr_print_ ##type, #p, level, p)
|
||||
#define NDR_PRINT_FUNCTION_STRING(ctx, type, flags, p) ndr_print_function_string(ctx, (ndr_print_function_t)ndr_print_ ##type, #type, flags, p)
|
||||
#define NDR_PRINT_BOTH_STRING(ctx, type, p) NDR_PRINT_FUNCTION_STRING(ctx, type, NDR_BOTH, p)
|
||||
#define NDR_PRINT_OUT_STRING(ctx, type, p) NDR_PRINT_FUNCTION_STRING(ctx, type, NDR_OUT, p)
|
||||
#define NDR_PRINT_IN_STRING(ctx, type, p) NDR_PRINT_FUNCTION_STRING(ctx, type, NDR_IN | NDR_SET_VALUES, p)
|
||||
|
||||
#define NDR_BE(ndr) (((ndr)->flags & (LIBNDR_FLAG_BIGENDIAN|LIBNDR_FLAG_LITTLE_ENDIAN)) == LIBNDR_FLAG_BIGENDIAN)
|
||||
|
||||
enum ndr_err_code {
|
||||
|
@ -587,8 +587,7 @@ _PUBLIC_ void ndr_print_string_array(struct ndr_print *ndr, const char *name, co
|
||||
ndr->depth++;
|
||||
for (i=0;i<count;i++) {
|
||||
char *idx=NULL;
|
||||
asprintf(&idx, "[%d]", i);
|
||||
if (idx) {
|
||||
if (asprintf(&idx, "[%d]", i) != -1) {
|
||||
ndr_print_string(ndr, idx, a[i]);
|
||||
free(idx);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user