From db24552ff8c58093cd32433a58ae2fdfebb77c01 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 5 Aug 2026 19:39:33 +0200 Subject: [PATCH] librpc/ndr: fix ndr_{push,pull,print}_{timeval,timespec}() and add _legacy() compat Scalar types should do nothing when called with NDR_BUFFERS, the current timeval and timespec encode the values twice. In order to keep compat with the former behavior we have timeval_legacy and timespec_legacy. BUG: https://bugzilla.samba.org/show_bug.cgi?id=16199 Signed-off-by: Stefan Metzmacher Reviewed-by: Ralph Boehme (cherry picked from commit 270c2451b541d6457d17b5eeccaafd32636b4591) --- librpc/ABI/ndr-6.1.0.sigs | 284 ++++++++++++++++++++++++++++++ librpc/idl/misc.idl | 13 ++ librpc/ndr/libndr.h | 18 ++ librpc/ndr/ndr_basic.c | 92 ++++++++++ librpc/wscript_build | 2 +- source3/librpc/idl/open_files.idl | 10 +- 6 files changed, 413 insertions(+), 6 deletions(-) create mode 100644 librpc/ABI/ndr-6.1.0.sigs diff --git a/librpc/ABI/ndr-6.1.0.sigs b/librpc/ABI/ndr-6.1.0.sigs new file mode 100644 index 000000000000..177779b552f8 --- /dev/null +++ b/librpc/ABI/ndr-6.1.0.sigs @@ -0,0 +1,284 @@ +GUID_all_zero: bool (const struct GUID *) +GUID_buf_string: char *(const struct GUID *, struct GUID_txt_buf *) +GUID_compare: int (const struct GUID *, const struct GUID *) +GUID_equal: bool (const struct GUID *, const struct GUID *) +GUID_from_data_blob: NTSTATUS (const DATA_BLOB *, struct GUID *) +GUID_from_ndr_blob: NTSTATUS (const DATA_BLOB *, struct GUID *) +GUID_from_string: NTSTATUS (const char *, struct GUID *) +GUID_hexstring: char *(TALLOC_CTX *, const struct GUID *) +GUID_random: struct GUID (void) +GUID_string: char *(TALLOC_CTX *, const struct GUID *) +GUID_string2: char *(TALLOC_CTX *, const struct GUID *) +GUID_to_ndr_blob: NTSTATUS (const struct GUID *, TALLOC_CTX *, DATA_BLOB *) +GUID_to_ndr_buf: void (const struct GUID *, struct GUID_ndr_buf *) +GUID_zero: struct GUID (void) +_ndr_deepcopy_struct: enum ndr_err_code (ndr_push_flags_fn_t, const void *, ndr_pull_flags_fn_t, TALLOC_CTX *, void *) +_ndr_pull_error: enum ndr_err_code (struct ndr_pull *, enum ndr_err_code, const char *, const char *, const char *, ...) +_ndr_push_error: enum ndr_err_code (struct ndr_push *, enum ndr_err_code, const char *, const char *, const char *, ...) +ndr_align_size: size_t (uint32_t, size_t) +ndr_charset_length: uint32_t (const void *, charset_t) +ndr_check_array_size: enum ndr_err_code (struct ndr_pull *, const void *, uint32_t) +ndr_check_padding: void (struct ndr_pull *, size_t) +ndr_check_pipe_chunk_trailer: enum ndr_err_code (struct ndr_pull *, ndr_flags_type, uint32_t) +ndr_check_steal_array_length: enum ndr_err_code (struct ndr_pull *, const void *, uint32_t) +ndr_check_steal_array_size: enum ndr_err_code (struct ndr_pull *, const void *, uint32_t) +ndr_check_string_terminator: enum ndr_err_code (struct ndr_pull *, uint32_t, uint32_t) +ndr_get_array_length: enum ndr_err_code (struct ndr_pull *, const void *, uint32_t *) +ndr_get_array_size: enum ndr_err_code (struct ndr_pull *, const void *, uint32_t *) +ndr_map_error2errno: int (enum ndr_err_code) +ndr_map_error2ntstatus: NTSTATUS (enum ndr_err_code) +ndr_map_error2string: const char *(enum ndr_err_code) +ndr_policy_handle_empty: bool (const struct policy_handle *) +ndr_policy_handle_equal: bool (const struct policy_handle *, const struct policy_handle *) +ndr_print_DATA_BLOB: void (struct ndr_print *, const char *, DATA_BLOB) +ndr_print_GUID: void (struct ndr_print *, const char *, const struct GUID *) +ndr_print_HRESULT: void (struct ndr_print *, const char *, HRESULT) +ndr_print_NTSTATUS: void (struct ndr_print *, const char *, NTSTATUS) +ndr_print_NTTIME: void (struct ndr_print *, const char *, NTTIME) +ndr_print_NTTIME_1sec: void (struct ndr_print *, const char *, NTTIME) +ndr_print_NTTIME_hyper: void (struct ndr_print *, const char *, NTTIME) +ndr_print_WERROR: void (struct ndr_print *, const char *, WERROR) +ndr_print_array_uint8: void (struct ndr_print *, const char *, const uint8_t *, uint32_t) +ndr_print_bad_level: void (struct ndr_print *, const char *, uint16_t) +ndr_print_bitmap_flag: void (struct ndr_print *, size_t, const char *, uint64_t, uint64_t) +ndr_print_bool: void (struct ndr_print *, const char *, const bool) +ndr_print_debug: bool (int, ndr_print_fn_t, const char *, const void *, const char *, const char *) +ndr_print_debug_helper: void (struct ndr_print *, const char *, ...) +ndr_print_debugc: void (int, ndr_print_fn_t, const char *, const void *) +ndr_print_debugc_helper: void (struct ndr_print *, const char *, ...) +ndr_print_dlong: void (struct ndr_print *, const char *, int64_t) +ndr_print_double: void (struct ndr_print *, const char *, double) +ndr_print_enum: void (struct ndr_print *, const char *, const char *, const char *, uint32_t) +ndr_print_function_debug: void (ndr_print_function_t, const char *, ndr_flags_type, const void *) +ndr_print_function_secret_string: char *(TALLOC_CTX *, ndr_print_function_t, const char *, ndr_flags_type, const void *) +ndr_print_function_string: char *(TALLOC_CTX *, ndr_print_function_t, const char *, ndr_flags_type, const void *) +ndr_print_gid_t: void (struct ndr_print *, const char *, gid_t) +ndr_print_hyper: void (struct ndr_print *, const char *, uint64_t) +ndr_print_int16: void (struct ndr_print *, const char *, int16_t) +ndr_print_int32: void (struct ndr_print *, const char *, int32_t) +ndr_print_int3264: void (struct ndr_print *, const char *, int32_t) +ndr_print_int64: void (struct ndr_print *, const char *, int64_t) +ndr_print_int8: void (struct ndr_print *, const char *, int8_t) +ndr_print_ipv4address: void (struct ndr_print *, const char *, const char *) +ndr_print_ipv6address: void (struct ndr_print *, const char *, const char *) +ndr_print_libndr_flags: void (struct ndr_print *, const char *, libndr_flags) +ndr_print_ndr_syntax_id: void (struct ndr_print *, const char *, const struct ndr_syntax_id *) +ndr_print_netr_SamDatabaseID: void (struct ndr_print *, const char *, enum netr_SamDatabaseID) +ndr_print_netr_SchannelType: void (struct ndr_print *, const char *, enum netr_SchannelType) +ndr_print_null: void (struct ndr_print *) +ndr_print_pointer: void (struct ndr_print *, const char *, void *) +ndr_print_policy_handle: void (struct ndr_print *, const char *, const struct policy_handle *) +ndr_print_printf_helper: void (struct ndr_print *, const char *, ...) +ndr_print_ptr: void (struct ndr_print *, const char *, const void *) +ndr_print_set_switch_value: enum ndr_err_code (struct ndr_print *, const void *, uint32_t) +ndr_print_sockaddr_storage: void (struct ndr_print *, const char *, const struct sockaddr_storage *) +ndr_print_steal_switch_value: uint32_t (struct ndr_print *, const void *) +ndr_print_string: void (struct ndr_print *, const char *, const char *) +ndr_print_string_array: void (struct ndr_print *, const char *, const char **) +ndr_print_string_helper: void (struct ndr_print *, const char *, ...) +ndr_print_struct: void (struct ndr_print *, const char *, const char *) +ndr_print_struct_secret_string: char *(TALLOC_CTX *, ndr_print_fn_t, const char *, const void *) +ndr_print_struct_string: char *(TALLOC_CTX *, ndr_print_fn_t, const char *, const void *) +ndr_print_svcctl_ServerType: void (struct ndr_print *, const char *, uint32_t) +ndr_print_time_t: void (struct ndr_print *, const char *, time_t) +ndr_print_timespec: void (struct ndr_print *, const char *, const struct timespec *) +ndr_print_timespec_legacy: void (struct ndr_print *, const char *, const struct timespec *) +ndr_print_timeval: void (struct ndr_print *, const char *, const struct timeval *) +ndr_print_timeval_legacy: void (struct ndr_print *, const char *, const struct timeval *) +ndr_print_u16string: void (struct ndr_print *, const char *, const unsigned char *) +ndr_print_udlong: void (struct ndr_print *, const char *, uint64_t) +ndr_print_udlongr: void (struct ndr_print *, const char *, uint64_t) +ndr_print_uid_t: void (struct ndr_print *, const char *, uid_t) +ndr_print_uint16: void (struct ndr_print *, const char *, uint16_t) +ndr_print_uint32: void (struct ndr_print *, const char *, uint32_t) +ndr_print_uint3264: void (struct ndr_print *, const char *, uint32_t) +ndr_print_uint8: void (struct ndr_print *, const char *, uint8_t) +ndr_print_union: void (struct ndr_print *, const char *, int, const char *) +ndr_print_union_debug: void (ndr_print_fn_t, const char *, uint32_t, const void *) +ndr_print_union_secret_string: char *(TALLOC_CTX *, ndr_print_fn_t, const char *, uint32_t, const void *) +ndr_print_union_string: char *(TALLOC_CTX *, ndr_print_fn_t, const char *, uint32_t, const void *) +ndr_print_winreg_Data: void (struct ndr_print *, const char *, const union winreg_Data *) +ndr_print_winreg_Data_GPO: void (struct ndr_print *, const char *, const union winreg_Data_GPO *) +ndr_print_winreg_Type: void (struct ndr_print *, const char *, enum winreg_Type) +ndr_pull_DATA_BLOB: enum ndr_err_code (struct ndr_pull *, ndr_flags_type, DATA_BLOB *) +ndr_pull_GUID: enum ndr_err_code (struct ndr_pull *, ndr_flags_type, struct GUID *) +ndr_pull_HRESULT: enum ndr_err_code (struct ndr_pull *, ndr_flags_type, HRESULT *) +ndr_pull_NTSTATUS: enum ndr_err_code (struct ndr_pull *, ndr_flags_type, NTSTATUS *) +ndr_pull_NTTIME: enum ndr_err_code (struct ndr_pull *, ndr_flags_type, NTTIME *) +ndr_pull_NTTIME_1sec: enum ndr_err_code (struct ndr_pull *, ndr_flags_type, NTTIME *) +ndr_pull_NTTIME_hyper: enum ndr_err_code (struct ndr_pull *, ndr_flags_type, NTTIME *) +ndr_pull_WERROR: enum ndr_err_code (struct ndr_pull *, ndr_flags_type, WERROR *) +ndr_pull_advance: enum ndr_err_code (struct ndr_pull *, uint32_t) +ndr_pull_align: enum ndr_err_code (struct ndr_pull *, size_t) +ndr_pull_append: enum ndr_err_code (struct ndr_pull *, DATA_BLOB *) +ndr_pull_array_length: enum ndr_err_code (struct ndr_pull *, const void *) +ndr_pull_array_size: enum ndr_err_code (struct ndr_pull *, const void *) +ndr_pull_array_uint8: enum ndr_err_code (struct ndr_pull *, ndr_flags_type, uint8_t *, uint32_t) +ndr_pull_bytes: enum ndr_err_code (struct ndr_pull *, uint8_t *, uint32_t) +ndr_pull_charset: enum ndr_err_code (struct ndr_pull *, ndr_flags_type, const char **, uint32_t, uint8_t, charset_t) +ndr_pull_charset_to_null: enum ndr_err_code (struct ndr_pull *, ndr_flags_type, const char **, uint32_t, uint8_t, charset_t) +ndr_pull_dlong: enum ndr_err_code (struct ndr_pull *, ndr_flags_type, int64_t *) +ndr_pull_double: enum ndr_err_code (struct ndr_pull *, ndr_flags_type, double *) +ndr_pull_enum_uint16: enum ndr_err_code (struct ndr_pull *, ndr_flags_type, uint16_t *) +ndr_pull_enum_uint1632: enum ndr_err_code (struct ndr_pull *, ndr_flags_type, uint16_t *) +ndr_pull_enum_uint32: enum ndr_err_code (struct ndr_pull *, ndr_flags_type, uint32_t *) +ndr_pull_enum_uint8: enum ndr_err_code (struct ndr_pull *, ndr_flags_type, uint8_t *) +ndr_pull_generic_ptr: enum ndr_err_code (struct ndr_pull *, uint32_t *) +ndr_pull_get_relative_base_offset: uint32_t (struct ndr_pull *) +ndr_pull_gid_t: enum ndr_err_code (struct ndr_pull *, ndr_flags_type, gid_t *) +ndr_pull_hyper: enum ndr_err_code (struct ndr_pull *, ndr_flags_type, uint64_t *) +ndr_pull_init_blob: struct ndr_pull *(const DATA_BLOB *, TALLOC_CTX *) +ndr_pull_int16: enum ndr_err_code (struct ndr_pull *, ndr_flags_type, int16_t *) +ndr_pull_int32: enum ndr_err_code (struct ndr_pull *, ndr_flags_type, int32_t *) +ndr_pull_int64: enum ndr_err_code (struct ndr_pull *, ndr_flags_type, int64_t *) +ndr_pull_int8: enum ndr_err_code (struct ndr_pull *, ndr_flags_type, int8_t *) +ndr_pull_ipv4address: enum ndr_err_code (struct ndr_pull *, ndr_flags_type, const char **) +ndr_pull_ipv6address: enum ndr_err_code (struct ndr_pull *, ndr_flags_type, const char **) +ndr_pull_ndr_syntax_id: enum ndr_err_code (struct ndr_pull *, ndr_flags_type, struct ndr_syntax_id *) +ndr_pull_netr_SamDatabaseID: enum ndr_err_code (struct ndr_pull *, ndr_flags_type, enum netr_SamDatabaseID *) +ndr_pull_netr_SchannelType: enum ndr_err_code (struct ndr_pull *, ndr_flags_type, enum netr_SchannelType *) +ndr_pull_pointer: enum ndr_err_code (struct ndr_pull *, ndr_flags_type, void **) +ndr_pull_policy_handle: enum ndr_err_code (struct ndr_pull *, ndr_flags_type, struct policy_handle *) +ndr_pull_pop: enum ndr_err_code (struct ndr_pull *) +ndr_pull_ref_ptr: enum ndr_err_code (struct ndr_pull *, uint32_t *) +ndr_pull_relative_ptr1: enum ndr_err_code (struct ndr_pull *, const void *, uint32_t) +ndr_pull_relative_ptr2: enum ndr_err_code (struct ndr_pull *, const void *) +ndr_pull_relative_ptr_short: enum ndr_err_code (struct ndr_pull *, uint16_t *) +ndr_pull_restore_relative_base_offset: void (struct ndr_pull *, uint32_t) +ndr_pull_set_switch_value: enum ndr_err_code (struct ndr_pull *, const void *, uint32_t) +ndr_pull_setup_relative_base_offset1: enum ndr_err_code (struct ndr_pull *, const void *, uint32_t) +ndr_pull_setup_relative_base_offset2: enum ndr_err_code (struct ndr_pull *, const void *) +ndr_pull_steal_switch_value: enum ndr_err_code (struct ndr_pull *, const void *, uint32_t *) +ndr_pull_string: enum ndr_err_code (struct ndr_pull *, ndr_flags_type, const char **) +ndr_pull_string_array: enum ndr_err_code (struct ndr_pull *, ndr_flags_type, const char ***) +ndr_pull_struct_blob: enum ndr_err_code (const DATA_BLOB *, TALLOC_CTX *, void *, ndr_pull_flags_fn_t) +ndr_pull_struct_blob_all: enum ndr_err_code (const DATA_BLOB *, TALLOC_CTX *, void *, ndr_pull_flags_fn_t) +ndr_pull_struct_blob_all_noalloc: enum ndr_err_code (const DATA_BLOB *, void *, ndr_pull_flags_fn_t) +ndr_pull_struct_blob_noalloc: enum ndr_err_code (const uint8_t *, size_t, void *, ndr_pull_flags_fn_t, size_t *) +ndr_pull_subcontext_end: enum ndr_err_code (struct ndr_pull *, struct ndr_pull *, size_t, ssize_t) +ndr_pull_subcontext_start: enum ndr_err_code (struct ndr_pull *, struct ndr_pull **, size_t, ssize_t) +ndr_pull_svcctl_ServerType: enum ndr_err_code (struct ndr_pull *, ndr_flags_type, uint32_t *) +ndr_pull_time_t: enum ndr_err_code (struct ndr_pull *, ndr_flags_type, time_t *) +ndr_pull_timespec: enum ndr_err_code (struct ndr_pull *, ndr_flags_type, struct timespec *) +ndr_pull_timespec_legacy: enum ndr_err_code (struct ndr_pull *, ndr_flags_type, struct timespec *) +ndr_pull_timeval: enum ndr_err_code (struct ndr_pull *, ndr_flags_type, struct timeval *) +ndr_pull_timeval_legacy: enum ndr_err_code (struct ndr_pull *, ndr_flags_type, struct timeval *) +ndr_pull_trailer_align: enum ndr_err_code (struct ndr_pull *, size_t) +ndr_pull_u16string: enum ndr_err_code (struct ndr_pull *, ndr_flags_type, const unsigned char **) +ndr_pull_udlong: enum ndr_err_code (struct ndr_pull *, ndr_flags_type, uint64_t *) +ndr_pull_udlongr: enum ndr_err_code (struct ndr_pull *, ndr_flags_type, uint64_t *) +ndr_pull_uid_t: enum ndr_err_code (struct ndr_pull *, ndr_flags_type, uid_t *) +ndr_pull_uint16: enum ndr_err_code (struct ndr_pull *, ndr_flags_type, uint16_t *) +ndr_pull_uint1632: enum ndr_err_code (struct ndr_pull *, ndr_flags_type, uint16_t *) +ndr_pull_uint32: enum ndr_err_code (struct ndr_pull *, ndr_flags_type, uint32_t *) +ndr_pull_uint3264: enum ndr_err_code (struct ndr_pull *, ndr_flags_type, uint32_t *) +ndr_pull_uint8: enum ndr_err_code (struct ndr_pull *, ndr_flags_type, uint8_t *) +ndr_pull_union_align: enum ndr_err_code (struct ndr_pull *, size_t) +ndr_pull_union_blob: enum ndr_err_code (const DATA_BLOB *, TALLOC_CTX *, void *, uint32_t, ndr_pull_flags_fn_t) +ndr_pull_union_blob_all: enum ndr_err_code (const DATA_BLOB *, TALLOC_CTX *, void *, uint32_t, ndr_pull_flags_fn_t) +ndr_pull_winreg_Data: enum ndr_err_code (struct ndr_pull *, ndr_flags_type, union winreg_Data *) +ndr_pull_winreg_Data_GPO: enum ndr_err_code (struct ndr_pull *, ndr_flags_type, union winreg_Data_GPO *) +ndr_pull_winreg_Type: enum ndr_err_code (struct ndr_pull *, ndr_flags_type, enum winreg_Type *) +ndr_push_DATA_BLOB: enum ndr_err_code (struct ndr_push *, ndr_flags_type, DATA_BLOB) +ndr_push_GUID: enum ndr_err_code (struct ndr_push *, ndr_flags_type, const struct GUID *) +ndr_push_HRESULT: enum ndr_err_code (struct ndr_push *, ndr_flags_type, HRESULT) +ndr_push_NTSTATUS: enum ndr_err_code (struct ndr_push *, ndr_flags_type, NTSTATUS) +ndr_push_NTTIME: enum ndr_err_code (struct ndr_push *, ndr_flags_type, NTTIME) +ndr_push_NTTIME_1sec: enum ndr_err_code (struct ndr_push *, ndr_flags_type, NTTIME) +ndr_push_NTTIME_hyper: enum ndr_err_code (struct ndr_push *, ndr_flags_type, NTTIME) +ndr_push_WERROR: enum ndr_err_code (struct ndr_push *, ndr_flags_type, WERROR) +ndr_push_align: enum ndr_err_code (struct ndr_push *, size_t) +ndr_push_array_uint8: enum ndr_err_code (struct ndr_push *, ndr_flags_type, const uint8_t *, uint32_t) +ndr_push_blob: DATA_BLOB (struct ndr_push *) +ndr_push_bytes: enum ndr_err_code (struct ndr_push *, const uint8_t *, uint32_t) +ndr_push_charset: enum ndr_err_code (struct ndr_push *, ndr_flags_type, const char *, uint32_t, uint8_t, charset_t) +ndr_push_charset_to_null: enum ndr_err_code (struct ndr_push *, ndr_flags_type, const char *, uint32_t, uint8_t, charset_t) +ndr_push_dlong: enum ndr_err_code (struct ndr_push *, ndr_flags_type, int64_t) +ndr_push_double: enum ndr_err_code (struct ndr_push *, ndr_flags_type, double) +ndr_push_enum_uint16: enum ndr_err_code (struct ndr_push *, ndr_flags_type, uint16_t) +ndr_push_enum_uint1632: enum ndr_err_code (struct ndr_push *, ndr_flags_type, uint16_t) +ndr_push_enum_uint32: enum ndr_err_code (struct ndr_push *, ndr_flags_type, uint32_t) +ndr_push_enum_uint8: enum ndr_err_code (struct ndr_push *, ndr_flags_type, uint8_t) +ndr_push_expand: enum ndr_err_code (struct ndr_push *, uint32_t) +ndr_push_full_ptr: enum ndr_err_code (struct ndr_push *, const void *) +ndr_push_get_relative_base_offset: uint32_t (struct ndr_push *) +ndr_push_gid_t: enum ndr_err_code (struct ndr_push *, ndr_flags_type, gid_t) +ndr_push_hyper: enum ndr_err_code (struct ndr_push *, ndr_flags_type, uint64_t) +ndr_push_init_ctx: struct ndr_push *(TALLOC_CTX *) +ndr_push_int16: enum ndr_err_code (struct ndr_push *, ndr_flags_type, int16_t) +ndr_push_int32: enum ndr_err_code (struct ndr_push *, ndr_flags_type, int32_t) +ndr_push_int64: enum ndr_err_code (struct ndr_push *, ndr_flags_type, int64_t) +ndr_push_int8: enum ndr_err_code (struct ndr_push *, ndr_flags_type, int8_t) +ndr_push_ipv4address: enum ndr_err_code (struct ndr_push *, ndr_flags_type, const char *) +ndr_push_ipv6address: enum ndr_err_code (struct ndr_push *, ndr_flags_type, const char *) +ndr_push_ndr_syntax_id: enum ndr_err_code (struct ndr_push *, ndr_flags_type, const struct ndr_syntax_id *) +ndr_push_netr_SamDatabaseID: enum ndr_err_code (struct ndr_push *, ndr_flags_type, enum netr_SamDatabaseID) +ndr_push_netr_SchannelType: enum ndr_err_code (struct ndr_push *, ndr_flags_type, enum netr_SchannelType) +ndr_push_pipe_chunk_trailer: enum ndr_err_code (struct ndr_push *, ndr_flags_type, uint32_t) +ndr_push_pointer: enum ndr_err_code (struct ndr_push *, ndr_flags_type, void *) +ndr_push_policy_handle: enum ndr_err_code (struct ndr_push *, ndr_flags_type, const struct policy_handle *) +ndr_push_ref_ptr: enum ndr_err_code (struct ndr_push *) +ndr_push_relative_ptr1: enum ndr_err_code (struct ndr_push *, const void *) +ndr_push_relative_ptr2_end: enum ndr_err_code (struct ndr_push *, const void *) +ndr_push_relative_ptr2_start: enum ndr_err_code (struct ndr_push *, const void *) +ndr_push_restore_relative_base_offset: void (struct ndr_push *, uint32_t) +ndr_push_set_switch_value: enum ndr_err_code (struct ndr_push *, const void *, uint32_t) +ndr_push_setup_relative_base_offset1: enum ndr_err_code (struct ndr_push *, const void *, uint32_t) +ndr_push_setup_relative_base_offset2: enum ndr_err_code (struct ndr_push *, const void *) +ndr_push_short_relative_ptr1: enum ndr_err_code (struct ndr_push *, const void *) +ndr_push_short_relative_ptr2: enum ndr_err_code (struct ndr_push *, const void *) +ndr_push_steal_switch_value: enum ndr_err_code (struct ndr_push *, const void *, uint32_t *) +ndr_push_string: enum ndr_err_code (struct ndr_push *, ndr_flags_type, const char *) +ndr_push_string_array: enum ndr_err_code (struct ndr_push *, ndr_flags_type, const char **) +ndr_push_struct_blob: enum ndr_err_code (DATA_BLOB *, TALLOC_CTX *, const void *, ndr_push_flags_fn_t) +ndr_push_struct_into_fixed_blob: enum ndr_err_code (DATA_BLOB *, const void *, ndr_push_flags_fn_t) +ndr_push_subcontext_end: enum ndr_err_code (struct ndr_push *, struct ndr_push *, size_t, ssize_t) +ndr_push_subcontext_start: enum ndr_err_code (struct ndr_push *, struct ndr_push **, size_t, ssize_t) +ndr_push_svcctl_ServerType: enum ndr_err_code (struct ndr_push *, ndr_flags_type, uint32_t) +ndr_push_time_t: enum ndr_err_code (struct ndr_push *, ndr_flags_type, time_t) +ndr_push_timespec: enum ndr_err_code (struct ndr_push *, ndr_flags_type, const struct timespec *) +ndr_push_timespec_legacy: enum ndr_err_code (struct ndr_push *, ndr_flags_type, const struct timespec *) +ndr_push_timeval: enum ndr_err_code (struct ndr_push *, ndr_flags_type, const struct timeval *) +ndr_push_timeval_legacy: enum ndr_err_code (struct ndr_push *, ndr_flags_type, const struct timeval *) +ndr_push_trailer_align: enum ndr_err_code (struct ndr_push *, size_t) +ndr_push_u16string: enum ndr_err_code (struct ndr_push *, ndr_flags_type, const unsigned char *) +ndr_push_udlong: enum ndr_err_code (struct ndr_push *, ndr_flags_type, uint64_t) +ndr_push_udlongr: enum ndr_err_code (struct ndr_push *, ndr_flags_type, uint64_t) +ndr_push_uid_t: enum ndr_err_code (struct ndr_push *, ndr_flags_type, uid_t) +ndr_push_uint16: enum ndr_err_code (struct ndr_push *, ndr_flags_type, uint16_t) +ndr_push_uint1632: enum ndr_err_code (struct ndr_push *, ndr_flags_type, uint16_t) +ndr_push_uint32: enum ndr_err_code (struct ndr_push *, ndr_flags_type, uint32_t) +ndr_push_uint3264: enum ndr_err_code (struct ndr_push *, ndr_flags_type, uint32_t) +ndr_push_uint8: enum ndr_err_code (struct ndr_push *, ndr_flags_type, uint8_t) +ndr_push_union_align: enum ndr_err_code (struct ndr_push *, size_t) +ndr_push_union_blob: enum ndr_err_code (DATA_BLOB *, TALLOC_CTX *, const void *, uint32_t, ndr_push_flags_fn_t) +ndr_push_unique_ptr: enum ndr_err_code (struct ndr_push *, const void *) +ndr_push_winreg_Data: enum ndr_err_code (struct ndr_push *, ndr_flags_type, const union winreg_Data *) +ndr_push_winreg_Data_GPO: enum ndr_err_code (struct ndr_push *, ndr_flags_type, const union winreg_Data_GPO *) +ndr_push_winreg_Type: enum ndr_err_code (struct ndr_push *, ndr_flags_type, enum winreg_Type) +ndr_push_zero: enum ndr_err_code (struct ndr_push *, uint32_t) +ndr_set_flags: void (libndr_flags *, libndr_flags) +ndr_size_DATA_BLOB: uint32_t (int, const DATA_BLOB *, ndr_flags_type) +ndr_size_GUID: size_t (const struct GUID *, libndr_flags) +ndr_size_string: uint32_t (int, const char * const *, ndr_flags_type) +ndr_size_string_array: size_t (const char **, uint32_t, libndr_flags) +ndr_size_struct: size_t (const void *, libndr_flags, ndr_push_flags_fn_t) +ndr_size_union: size_t (const void *, libndr_flags, uint32_t, ndr_push_flags_fn_t) +ndr_size_winreg_Data_GPO: size_t (const union winreg_Data_GPO *, uint32_t, libndr_flags) +ndr_steal_array_length: enum ndr_err_code (struct ndr_pull *, const void *, uint32_t *) +ndr_steal_array_size: enum ndr_err_code (struct ndr_pull *, const void *, uint32_t *) +ndr_string_array_size: size_t (struct ndr_push *, const char *) +ndr_string_length: uint32_t (const void *, uint32_t) +ndr_syntax_id_buf_string: char *(const struct ndr_syntax_id *, struct ndr_syntax_id_buf *) +ndr_syntax_id_equal: bool (const struct ndr_syntax_id *, const struct ndr_syntax_id *) +ndr_syntax_id_from_string: bool (const char *, struct ndr_syntax_id *) +ndr_syntax_id_null: uuid = {time_low = 0, time_mid = 0, time_hi_and_version = 0, clock_seq = "\000", node = "\000\000\000\000\000"}, if_version = 0 +ndr_syntax_id_to_string: char *(TALLOC_CTX *, const struct ndr_syntax_id *) +ndr_token_max_list_size: size_t (void) +ndr_token_peek: enum ndr_err_code (struct ndr_token_list *, const void *, uint32_t *) +ndr_token_peek_cmp_fn: enum ndr_err_code (struct ndr_token_list *, const void *, uint32_t *, comparison_fn_t) +ndr_token_retrieve: enum ndr_err_code (struct ndr_token_list *, const void *, uint32_t *) +ndr_token_store: enum ndr_err_code (TALLOC_CTX *, struct ndr_token_list *, const void *, uint32_t) +ndr_transfer_syntax_ndr: uuid = {time_low = 2324192516, time_mid = 7403, time_hi_and_version = 4553, clock_seq = "\237\350", node = "\b\000+\020H`"}, if_version = 2 +ndr_transfer_syntax_ndr64: uuid = {time_low = 1903232307, time_mid = 48826, time_hi_and_version = 18743, clock_seq = "\203\031", node = "\265\333\357\234\3146"}, if_version = 1 +ndr_zero_memory: void (void *, size_t) diff --git a/librpc/idl/misc.idl b/librpc/idl/misc.idl index 968847e6b572..fe958376c6af 100644 --- a/librpc/idl/misc.idl +++ b/librpc/idl/misc.idl @@ -4,6 +4,19 @@ miscellaneous IDL structures */ +/* + * We used to push/pull timeval and timespec + * with NDR_SCALARS and a 2nd time with + * NDR_BUFFERS. This is wrong as it's a + * scalar type and the 2nd call with NDR_BUFFERS + * should do nothing. + * + * In order to support structures encoded + * with the old broken version we now + * have ndr_{push,pull,print}_{timeval,timespec}_legacy() + */ +cpp_quote("#define timespec_legacy timespec") +cpp_quote("#define timeval_legacy timeval") [ pyhelper("librpc/ndr/py_misc.c"), diff --git a/librpc/ndr/libndr.h b/librpc/ndr/libndr.h index 7ee706c60854..41aca49b47bf 100644 --- a/librpc/ndr/libndr.h +++ b/librpc/ndr/libndr.h @@ -955,6 +955,24 @@ _PUBLIC_ enum ndr_err_code ndr_pull_timeval(struct ndr_pull *ndr, _PUBLIC_ void ndr_print_timeval(struct ndr_print *ndr, const char *name, const struct timeval *t); +_PUBLIC_ enum ndr_err_code ndr_push_timespec_legacy(struct ndr_push *ndr, + ndr_flags_type ndr_flags, + const struct timespec *t); +_PUBLIC_ enum ndr_err_code ndr_pull_timespec_legacy(struct ndr_pull *ndr, + ndr_flags_type ndr_flags, + struct timespec *t); +_PUBLIC_ void ndr_print_timespec_legacy(struct ndr_print *ndr, const char *name, + const struct timespec *t); + +_PUBLIC_ enum ndr_err_code ndr_push_timeval_legacy(struct ndr_push *ndr, + ndr_flags_type ndr_flags, + const struct timeval *t); +_PUBLIC_ enum ndr_err_code ndr_pull_timeval_legacy(struct ndr_pull *ndr, + ndr_flags_type ndr_flags, + struct timeval *t); +_PUBLIC_ void ndr_print_timeval_legacy(struct ndr_print *ndr, const char *name, + const struct timeval *t); + _PUBLIC_ void ndr_print_libndr_flags(struct ndr_print *ndr, const char *name, libndr_flags flags); diff --git a/librpc/ndr/ndr_basic.c b/librpc/ndr/ndr_basic.c index b6dcc22b3498..ea97e15049fc 100644 --- a/librpc/ndr/ndr_basic.c +++ b/librpc/ndr/ndr_basic.c @@ -1536,6 +1536,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_timespec(struct ndr_push *ndr, const struct timespec *t) { NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags); + if (!(ndr_flags & NDR_SCALARS)) { + return NDR_ERR_SUCCESS; + } NDR_CHECK(ndr_push_hyper(ndr, ndr_flags, t->tv_sec)); NDR_CHECK(ndr_push_uint32(ndr, ndr_flags, t->tv_nsec)); return NDR_ERR_SUCCESS; @@ -1548,6 +1551,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_timespec(struct ndr_pull *ndr, uint64_t secs = 0; uint32_t nsecs = 0; NDR_PULL_CHECK_FLAGS(ndr, ndr_flags); + if (!(ndr_flags & NDR_SCALARS)) { + return NDR_ERR_SUCCESS; + } NDR_CHECK(ndr_pull_hyper(ndr, ndr_flags, &secs)); NDR_CHECK(ndr_pull_uint32(ndr, ndr_flags, &nsecs)); t->tv_sec = secs; @@ -1568,6 +1574,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_timeval(struct ndr_push *ndr, const struct timeval *t) { NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags); + if (!(ndr_flags & NDR_SCALARS)) { + return NDR_ERR_SUCCESS; + } NDR_CHECK(ndr_push_hyper(ndr, ndr_flags, t->tv_sec)); NDR_CHECK(ndr_push_uint32(ndr, ndr_flags, t->tv_usec)); return NDR_ERR_SUCCESS; @@ -1580,6 +1589,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_timeval(struct ndr_pull *ndr, uint64_t secs = 0; uint32_t usecs = 0; NDR_PULL_CHECK_FLAGS(ndr, ndr_flags); + if (!(ndr_flags & NDR_SCALARS)) { + return NDR_ERR_SUCCESS; + } NDR_CHECK(ndr_pull_hyper(ndr, ndr_flags, &secs)); NDR_CHECK(ndr_pull_uint32(ndr, ndr_flags, &usecs)); t->tv_sec = secs; @@ -1594,6 +1606,86 @@ _PUBLIC_ void ndr_print_timeval(struct ndr_print *ndr, const char *name, (long)t->tv_usec); } +_PUBLIC_ enum ndr_err_code ndr_push_timespec_legacy(struct ndr_push *ndr, + ndr_flags_type ndr_flags, + const struct timespec *t) +{ + NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags); + /* + * The legacy version didn't have: + * + * if (!(ndr_flags & NDR_SCALARS)) { + * return NDR_ERR_SUCCESS; + * } + * + * So we force NDR_SCALARS here. + */ + return ndr_push_timespec(ndr, NDR_SCALARS, t); +} + +_PUBLIC_ enum ndr_err_code ndr_pull_timespec_legacy(struct ndr_pull *ndr, + ndr_flags_type ndr_flags, + struct timespec *t) +{ + NDR_PULL_CHECK_FLAGS(ndr, ndr_flags); + /* + * The legacy version didn't have: + * + * if (!(ndr_flags & NDR_SCALARS)) { + * return NDR_ERR_SUCCESS; + * } + * + * So we force NDR_SCALARS here. + */ + return ndr_pull_timespec(ndr, NDR_SCALARS, t); +} + +_PUBLIC_ void ndr_print_timespec_legacy(struct ndr_print *ndr, const char *name, + const struct timespec *t) +{ + ndr_print_timespec(ndr, name, t); +} + +_PUBLIC_ enum ndr_err_code ndr_push_timeval_legacy(struct ndr_push *ndr, + ndr_flags_type ndr_flags, + const struct timeval *t) +{ + NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags); + /* + * The legacy version didn't have: + * + * if (!(ndr_flags & NDR_SCALARS)) { + * return NDR_ERR_SUCCESS; + * } + * + * So we force NDR_SCALARS here. + */ + return ndr_push_timeval(ndr, NDR_SCALARS, t); +} + +_PUBLIC_ enum ndr_err_code ndr_pull_timeval_legacy(struct ndr_pull *ndr, + ndr_flags_type ndr_flags, + struct timeval *t) +{ + NDR_PULL_CHECK_FLAGS(ndr, ndr_flags); + /* + * The legacy version didn't have: + * + * if (!(ndr_flags & NDR_SCALARS)) { + * return NDR_ERR_SUCCESS; + * } + * + * So we force NDR_SCALARS here. + */ + return ndr_pull_timeval(ndr, NDR_SCALARS, t); +} + +_PUBLIC_ void ndr_print_timeval_legacy(struct ndr_print *ndr, const char *name, + const struct timeval *t) +{ + ndr_print_timeval(ndr, name, t); +} + _PUBLIC_ void ndr_print_libndr_flags(struct ndr_print *ndr, const char *name, libndr_flags flags) { diff --git a/librpc/wscript_build b/librpc/wscript_build index 98f2777a528a..362105676a8e 100644 --- a/librpc/wscript_build +++ b/librpc/wscript_build @@ -676,7 +676,7 @@ bld.SAMBA_LIBRARY('ndr', deps='genrand', public_headers='gen_ndr/misc.h gen_ndr/ndr_misc.h ndr/libndr.h:ndr.h', header_path= [('*gen_ndr*', 'gen_ndr')], - vnum='6.0.0', + vnum='6.1.0', abi_directory='ABI', abi_match='!ndr_table_* ndr_* GUID_* _ndr_pull_error* _ndr_push_error* _ndr_deepcopy_*', ) diff --git a/source3/librpc/idl/open_files.idl b/source3/librpc/idl/open_files.idl index f7582885ca4c..1f0cdf061038 100644 --- a/source3/librpc/idl/open_files.idl +++ b/source3/librpc/idl/open_files.idl @@ -36,7 +36,7 @@ interface open_files smb2_lease_key lease_key; uint32 access_mask; uint32 share_access; - timeval time; + timeval_legacy time; udlong share_file_id; uint32 uid; share_entry_flags flags; @@ -96,10 +96,10 @@ interface open_files hyper st_ex_gid; hyper st_ex_rdev; hyper st_ex_size; - timespec st_ex_atime; - timespec st_ex_mtime; - timespec st_ex_ctime; - timespec st_ex_btime; + timespec_legacy st_ex_atime; + timespec_legacy st_ex_mtime; + timespec_legacy st_ex_ctime; + timespec_legacy st_ex_btime; hyper st_ex_blksize; hyper st_ex_blocks; uint32 st_ex_flags; -- 2.43.0